| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | import ScriptUtils from "./ScriptUtils" | 
					
						
							|  |  |  | import { readFileSync, writeFileSync } from "fs" | 
					
						
							| 
									
										
										
										
											2021-11-07 17:17:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-17 01:46:59 +02:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Extracts the data from the scheme file and writes them in a flatter structure | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-11-07 17:52:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | export type JsonSchemaType = | 
					
						
							|  |  |  |     | string | 
					
						
							|  |  |  |     | { $ref: string; description: string } | 
					
						
							|  |  |  |     | { type: string } | 
					
						
							|  |  |  |     | JsonSchemaType[] | 
					
						
							| 
									
										
										
										
											2022-07-18 02:25:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | export interface JsonSchema { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     description?: string | 
					
						
							|  |  |  |     type?: JsonSchemaType | 
					
						
							|  |  |  |     properties?: any | 
					
						
							|  |  |  |     items?: JsonSchema | 
					
						
							|  |  |  |     allOf?: JsonSchema[] | 
					
						
							|  |  |  |     anyOf: JsonSchema[] | 
					
						
							|  |  |  |     enum: JsonSchema[] | 
					
						
							|  |  |  |     $ref: string | 
					
						
							| 
									
										
										
										
											2022-01-31 00:39:54 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function WalkScheme<T>( | 
					
						
							|  |  |  |     onEach: (schemePart: JsonSchema) => T, | 
					
						
							|  |  |  |     scheme: JsonSchema, | 
					
						
							|  |  |  |     fullScheme: JsonSchema & { definitions?: any } = undefined, | 
					
						
							|  |  |  |     path: string[] = [], | 
					
						
							|  |  |  |     isHandlingReference = [] | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | ): { path: string[]; t: T }[] { | 
					
						
							|  |  |  |     const results: { path: string[]; t: T }[] = [] | 
					
						
							| 
									
										
										
										
											2022-01-31 00:39:54 +01:00
										 |  |  |     if (scheme === undefined) { | 
					
						
							|  |  |  |         return [] | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-05-17 01:46:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-31 00:39:54 +01:00
										 |  |  |     if (scheme["$ref"] !== undefined) { | 
					
						
							|  |  |  |         const ref = scheme["$ref"] | 
					
						
							|  |  |  |         const prefix = "#/definitions/" | 
					
						
							|  |  |  |         if (!ref.startsWith(prefix)) { | 
					
						
							|  |  |  |             throw "References is not relative!" | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         const definitionName = ref.substr(prefix.length) | 
					
						
							|  |  |  |         if (isHandlingReference.indexOf(definitionName) >= 0) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             return | 
					
						
							| 
									
										
										
										
											2022-01-31 00:39:54 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |         const loadedScheme = fullScheme.definitions[definitionName] | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         return WalkScheme(onEach, loadedScheme, fullScheme, path, [ | 
					
						
							|  |  |  |             ...isHandlingReference, | 
					
						
							|  |  |  |             definitionName, | 
					
						
							|  |  |  |         ]) | 
					
						
							| 
									
										
										
										
											2022-01-31 00:39:54 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fullScheme = fullScheme ?? scheme | 
					
						
							|  |  |  |     var t = onEach(scheme) | 
					
						
							| 
									
										
										
										
											2022-02-09 22:34:02 +01:00
										 |  |  |     if (t !== undefined) { | 
					
						
							|  |  |  |         results.push({ | 
					
						
							| 
									
										
										
										
											2022-02-28 17:17:38 +01:00
										 |  |  |             path, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             t, | 
					
						
							| 
									
										
										
										
											2022-02-09 22:34:02 +01:00
										 |  |  |         }) | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-02-28 17:17:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function walk(v: JsonSchema) { | 
					
						
							| 
									
										
										
										
											2022-01-31 00:39:54 +01:00
										 |  |  |         if (v === undefined) { | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-02-28 17:17:38 +01:00
										 |  |  |         results.push(...WalkScheme(onEach, v, fullScheme, path, isHandlingReference)) | 
					
						
							| 
									
										
										
										
											2022-01-31 00:39:54 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-28 17:17:38 +01:00
										 |  |  |     function walkEach(scheme: JsonSchema[]) { | 
					
						
							| 
									
										
										
										
											2022-01-31 00:39:54 +01:00
										 |  |  |         if (scheme === undefined) { | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-05-17 01:46:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         scheme.forEach((v) => walk(v)) | 
					
						
							| 
									
										
										
										
											2022-01-31 00:39:54 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-09 22:34:02 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-02-28 17:17:38 +01:00
										 |  |  |         walkEach(scheme.enum) | 
					
						
							|  |  |  |         walkEach(scheme.anyOf) | 
					
						
							| 
									
										
										
										
											2022-05-17 01:46:59 +02:00
										 |  |  |         walkEach(scheme.allOf) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-28 17:17:38 +01:00
										 |  |  |         if (Array.isArray(scheme.items)) { | 
					
						
							|  |  |  |             walkEach(<any>scheme.items) | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             walk(<any>scheme.items) | 
					
						
							| 
									
										
										
										
											2022-01-31 00:39:54 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (const key in scheme.properties) { | 
					
						
							|  |  |  |             const prop = scheme.properties[key] | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             results.push( | 
					
						
							|  |  |  |                 ...WalkScheme(onEach, prop, fullScheme, [...path, key], isHandlingReference) | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2022-01-31 00:39:54 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return results | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-09 22:34:02 +01:00
										 |  |  | function extractMeta(typename: string, path: string) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     const themeSchema = JSON.parse( | 
					
						
							|  |  |  |         readFileSync("./Docs/Schemas/" + typename + ".schema.json", "UTF-8") | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2022-02-09 22:34:02 +01:00
										 |  |  |     const withTypes = WalkScheme((schemePart) => { | 
					
						
							|  |  |  |         if (schemePart.description === undefined) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             return | 
					
						
							| 
									
										
										
										
											2022-02-09 22:34:02 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const typeHint = schemePart.description | 
					
						
							|  |  |  |             .split("\n") | 
					
						
							|  |  |  |             .find((line) => line.trim().toLocaleLowerCase().startsWith("type:")) | 
					
						
							|  |  |  |             ?.substr("type:".length) | 
					
						
							|  |  |  |             ?.trim() | 
					
						
							|  |  |  |         const type = schemePart.items?.anyOf ?? schemePart.type ?? schemePart.anyOf | 
					
						
							|  |  |  |         return { typeHint, type, description: schemePart.description } | 
					
						
							| 
									
										
										
										
											2022-02-09 22:34:02 +01:00
										 |  |  |     }, themeSchema) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     const paths = withTypes.map(({ path, t }) => ({ path, ...t })) | 
					
						
							| 
									
										
										
										
											2022-02-28 17:17:38 +01:00
										 |  |  |     writeFileSync("./assets/" + path + ".json", JSON.stringify(paths, null, "  ")) | 
					
						
							|  |  |  |     console.log("Written meta to ./assets/" + path) | 
					
						
							| 
									
										
										
										
											2022-02-09 22:34:02 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 17:52:05 +01:00
										 |  |  | function main() { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     const allSchemas = ScriptUtils.readDirRecSync("./Docs/Schemas").filter((pth) => | 
					
						
							|  |  |  |         pth.endsWith("JSC.ts") | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2021-11-07 17:52:05 +01:00
										 |  |  |     for (const path of allSchemas) { | 
					
						
							|  |  |  |         const dir = path.substring(0, path.lastIndexOf("/")) | 
					
						
							|  |  |  |         const name = path.substring(path.lastIndexOf("/"), path.length - "JSC.ts".length) | 
					
						
							|  |  |  |         let content = readFileSync(path, "UTF-8") | 
					
						
							|  |  |  |         content = content.substring("export default ".length) | 
					
						
							|  |  |  |         let parsed = JSON.parse(content) | 
					
						
							|  |  |  |         parsed["additionalProperties"] = false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (const key in parsed.definitions) { | 
					
						
							|  |  |  |             const def = parsed.definitions[key] | 
					
						
							|  |  |  |             if (def.type === "object") { | 
					
						
							|  |  |  |                 def["additionalProperties"] = false | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         writeFileSync(dir + "/" + name + ".schema.json", JSON.stringify(parsed, null, "  "), "UTF8") | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-01-31 00:39:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-09 22:34:02 +01:00
										 |  |  |     extractMeta("LayoutConfigJson", "layoutconfigmeta") | 
					
						
							|  |  |  |     extractMeta("TagRenderingConfigJson", "tagrenderingconfigmeta") | 
					
						
							| 
									
										
										
										
											2022-02-28 17:17:38 +01:00
										 |  |  |     extractMeta("QuestionableTagRenderingConfigJson", "questionabletagrenderingconfigmeta") | 
					
						
							| 
									
										
										
										
											2021-11-07 17:52:05 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | main() |