@sdkgen/fsharp-generator 0.0.0-dev.20230106165109 → 0.0.0-dev.20230109111624

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.
@@ -0,0 +1,90 @@
1
+ import { astToJson, VoidPrimitiveType } from "@sdkgen/parser";
2
+ import { capitalize, decodeType, encodeType, generateEnum, generateStruct, generateTypeName, ident } from "./helpers.js";
3
+ export function generateFSharpServerSource(ast) {
4
+ let code = `module rec SdkgenGenerated
5
+ open Sdkgen.Runtime
6
+ open Sdkgen.Helpers
7
+ open Sdkgen.Context
8
+ open System.Threading.Tasks
9
+ open System.Text.Json
10
+ open System
11
+ open System.Globalization
12
+ #if NET5_0
13
+ // To use tasks as computation expression in .NET 5 install https://www.nuget.org/packages/TaskBuilder.fs/
14
+ open FSharp.Control.Tasks.V2.ContextInsensitive
15
+ #endif
16
+ `;
17
+ for (const error of ast.errors) {
18
+ code += `
19
+ type ${error.name}Exception =
20
+ inherit SdkgenException
21
+
22
+ new(message: string) = {
23
+ inherit SdkgenException("${error.name}", message, null)
24
+ }
25
+
26
+ new(message: string, inner: Exception) = {
27
+ inherit SdkgenException("${error.name}", message, inner)
28
+ }\n`;
29
+ }
30
+ for (const type of ast.enumTypes) {
31
+ code += `\n${generateEnum(type)}\n`;
32
+ }
33
+ for (const type of ast.structTypes) {
34
+ code += `\n${generateStruct(type)}\n`;
35
+ }
36
+ code += `
37
+ type Api() =`;
38
+ for (const op of ast.operations) {
39
+ const returnTypeAngle = op.returnType instanceof VoidPrimitiveType ? "" : `<${generateTypeName(op.returnType)}>`;
40
+ const argsInRecord = op.args.length > 0 ? `{| ${op.args.map(arg => `${arg.name}: ${generateTypeName(arg.type)};`).join("")} |} ->` : "";
41
+ code += `
42
+ member val ${capitalize(op.name)}: Context -> ${argsInRecord} Task${returnTypeAngle} =
43
+ fun _ -> (raise (FatalException("Function '${op.name}' not implemented.")))
44
+ with get, set
45
+ `;
46
+ }
47
+ code += `
48
+ interface BaseApi with
49
+ member __.ExecuteFunction(context_: Context, resultWriter_: Utf8JsonWriter) : Task =
50
+ task {
51
+ match context_.Name with`;
52
+ for (const op of ast.operations) {
53
+ code += `
54
+ | ${JSON.stringify(op.name)} ->`;
55
+ for (const arg of op.args) {
56
+ code += `
57
+ let ${arg.name}Json_ =
58
+ match context_.Args.TryGetValue(${JSON.stringify(arg.name)}) with
59
+ | true, v -> v
60
+ | _ -> raise (FatalException("'${op.name}().args.${arg.name}' must be set to a value of type ${arg.type.name}."))
61
+
62
+ let ${ident(arg.name)} =
63
+ ${decodeType(arg.type, `${arg.name}Json_`, `"${op.name}().args.${arg.name}"`, ident(arg.name)).replace(/\n/gu, "\n ")}`;
64
+ }
65
+ if (op.returnType instanceof VoidPrimitiveType) {
66
+ code += `
67
+
68
+ do! (__.${capitalize(op.name)} context_ ${op.args.length > 0 ? "{|" : ""} ${op.args
69
+ .map(arg => `${arg.name} = ${ident(arg.name)}`)
70
+ .join("; ")} ${op.args.length > 0 ? "|}" : ""})
71
+ `;
72
+ }
73
+ else {
74
+ code += `
75
+
76
+ let! result_ = (__.${capitalize(op.name)} context_ ${op.args.length > 0 ? "{|" : ""} ${op.args
77
+ .map(arg => `${arg.name} = ${ident(arg.name)}`)
78
+ .join("; ")} ${op.args.length > 0 ? "|}" : ""})
79
+ ${encodeType(op.returnType, `result_`, `"${op.name}().ret"`, 1, false).replace(/\n/gu, "\n ")}`;
80
+ }
81
+ }
82
+ code += `
83
+
84
+ | _ -> raise (FatalException($"Unknown function '{context_.Name}'."))
85
+ } :> Task`;
86
+ code += `
87
+ member __.GetAstJson() = """${JSON.stringify(astToJson(ast), null, 4).replace(/\n/gu, "\n ")}""";`;
88
+ return code;
89
+ }
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnNoYXJwLXNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mc2hhcnAtc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekgsTUFBTSxVQUFVLDBCQUEwQixDQUFDLEdBQVk7SUFDckQsSUFBSSxJQUFJLEdBQUc7Ozs7Ozs7Ozs7OztDQVlaLENBQUM7SUFFQSxLQUFLLE1BQU0sS0FBSyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUU7UUFDOUIsSUFBSSxJQUFJO09BQ0wsS0FBSyxDQUFDLElBQUk7Ozs7K0JBSWMsS0FBSyxDQUFDLElBQUk7Ozs7K0JBSVYsS0FBSyxDQUFDLElBQUk7TUFDbkMsQ0FBQztLQUNKO0lBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFO1FBQ2hDLElBQUksSUFBSSxLQUFLLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0tBQ3JDO0lBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFO1FBQ2xDLElBQUksSUFBSSxLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0tBQ3ZDO0lBRUQsSUFBSSxJQUFJO2FBQ0csQ0FBQztJQUVaLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRTtRQUMvQixNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUMsVUFBVSxZQUFZLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFFakgsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUV4SSxJQUFJLElBQUk7ZUFDRyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsWUFBWSxRQUFRLGVBQWU7aURBQ3BDLEVBQUUsQ0FBQyxJQUFJOztLQUVuRCxDQUFDO0tBQ0g7SUFFRCxJQUFJLElBQUk7Ozs7bUNBSXlCLENBQUM7SUFFbEMsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO1FBQy9CLElBQUksSUFBSTtjQUNFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkMsS0FBSyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFO1lBQ3pCLElBQUksSUFBSTtrQkFDSSxHQUFHLENBQUMsSUFBSTtnREFDc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDOzsrQ0FFekIsRUFBRSxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMsSUFBSSxvQ0FBb0MsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJOztrQkFFeEcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ2pCLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1NBQzVJO1FBRUQsSUFBSSxFQUFFLENBQUMsVUFBVSxZQUFZLGlCQUFpQixFQUFFO1lBQzlDLElBQUksSUFBSTs7c0JBRVEsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJO2lCQUN0RixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2lCQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUU7T0FDOUMsQ0FBQztTQUNIO2FBQU07WUFDTCxJQUFJLElBQUk7O2lDQUVtQixVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUk7aUJBQ2pHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7aUJBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtjQUN2QyxVQUFVLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1NBQ2xIO0tBQ0Y7SUFFRCxJQUFJLElBQUk7OztrQkFHUSxDQUFDO0lBRWpCLElBQUksSUFBSTtrQ0FDd0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUU1RyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFzdFJvb3QgfSBmcm9tIFwiQHNka2dlbi9wYXJzZXJcIjtcbmltcG9ydCB7IGFzdFRvSnNvbiwgVm9pZFByaW1pdGl2ZVR5cGUgfSBmcm9tIFwiQHNka2dlbi9wYXJzZXJcIjtcblxuaW1wb3J0IHsgY2FwaXRhbGl6ZSwgZGVjb2RlVHlwZSwgZW5jb2RlVHlwZSwgZ2VuZXJhdGVFbnVtLCBnZW5lcmF0ZVN0cnVjdCwgZ2VuZXJhdGVUeXBlTmFtZSwgaWRlbnQgfSBmcm9tIFwiLi9oZWxwZXJzLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUZTaGFycFNlcnZlclNvdXJjZShhc3Q6IEFzdFJvb3QpOiBzdHJpbmcge1xuICBsZXQgY29kZSA9IGBtb2R1bGUgcmVjIFNka2dlbkdlbmVyYXRlZFxub3BlbiBTZGtnZW4uUnVudGltZVxub3BlbiBTZGtnZW4uSGVscGVyc1xub3BlbiBTZGtnZW4uQ29udGV4dFxub3BlbiBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzXG5vcGVuIFN5c3RlbS5UZXh0Lkpzb25cbm9wZW4gU3lzdGVtXG5vcGVuIFN5c3RlbS5HbG9iYWxpemF0aW9uXG4jaWYgTkVUNV8wXG4vLyBUbyB1c2UgdGFza3MgYXMgY29tcHV0YXRpb24gZXhwcmVzc2lvbiBpbiAuTkVUIDUgaW5zdGFsbCBodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvVGFza0J1aWxkZXIuZnMvXG5vcGVuIEZTaGFycC5Db250cm9sLlRhc2tzLlYyLkNvbnRleHRJbnNlbnNpdGl2ZVxuI2VuZGlmXG5gO1xuXG4gIGZvciAoY29uc3QgZXJyb3Igb2YgYXN0LmVycm9ycykge1xuICAgIGNvZGUgKz0gYFxudHlwZSAke2Vycm9yLm5hbWV9RXhjZXB0aW9uID1cbiAgaW5oZXJpdCBTZGtnZW5FeGNlcHRpb25cblxuICBuZXcobWVzc2FnZTogc3RyaW5nKSA9IHtcbiAgICBpbmhlcml0IFNka2dlbkV4Y2VwdGlvbihcIiR7ZXJyb3IubmFtZX1cIiwgbWVzc2FnZSwgbnVsbClcbiAgfVxuXG4gIG5ldyhtZXNzYWdlOiBzdHJpbmcsIGlubmVyOiBFeGNlcHRpb24pID0ge1xuICAgIGluaGVyaXQgU2RrZ2VuRXhjZXB0aW9uKFwiJHtlcnJvci5uYW1lfVwiLCBtZXNzYWdlLCBpbm5lcilcbiAgfVxcbmA7XG4gIH1cblxuICBmb3IgKGNvbnN0IHR5cGUgb2YgYXN0LmVudW1UeXBlcykge1xuICAgIGNvZGUgKz0gYFxcbiR7Z2VuZXJhdGVFbnVtKHR5cGUpfVxcbmA7XG4gIH1cblxuICBmb3IgKGNvbnN0IHR5cGUgb2YgYXN0LnN0cnVjdFR5cGVzKSB7XG4gICAgY29kZSArPSBgXFxuJHtnZW5lcmF0ZVN0cnVjdCh0eXBlKX1cXG5gO1xuICB9XG5cbiAgY29kZSArPSBgXG50eXBlIEFwaSgpID1gO1xuXG4gIGZvciAoY29uc3Qgb3Agb2YgYXN0Lm9wZXJhdGlvbnMpIHtcbiAgICBjb25zdCByZXR1cm5UeXBlQW5nbGUgPSBvcC5yZXR1cm5UeXBlIGluc3RhbmNlb2YgVm9pZFByaW1pdGl2ZVR5cGUgPyBcIlwiIDogYDwke2dlbmVyYXRlVHlwZU5hbWUob3AucmV0dXJuVHlwZSl9PmA7XG5cbiAgICBjb25zdCBhcmdzSW5SZWNvcmQgPSBvcC5hcmdzLmxlbmd0aCA+IDAgPyBge3wgJHtvcC5hcmdzLm1hcChhcmcgPT4gYCR7YXJnLm5hbWV9OiAke2dlbmVyYXRlVHlwZU5hbWUoYXJnLnR5cGUpfTtgKS5qb2luKFwiXCIpfSB8fSAtPmAgOiBcIlwiO1xuXG4gICAgY29kZSArPSBgXG4gIG1lbWJlciB2YWwgJHtjYXBpdGFsaXplKG9wLm5hbWUpfTogQ29udGV4dCAtPiAke2FyZ3NJblJlY29yZH0gVGFzayR7cmV0dXJuVHlwZUFuZ2xlfSA9XG4gICAgZnVuIF8gLT4gKHJhaXNlIChGYXRhbEV4Y2VwdGlvbihcIkZ1bmN0aW9uICcke29wLm5hbWV9JyBub3QgaW1wbGVtZW50ZWQuXCIpKSlcbiAgICB3aXRoIGdldCwgc2V0XG4gICAgYDtcbiAgfVxuXG4gIGNvZGUgKz0gYFxuICBpbnRlcmZhY2UgQmFzZUFwaSB3aXRoXG4gICAgbWVtYmVyIF9fLkV4ZWN1dGVGdW5jdGlvbihjb250ZXh0XzogQ29udGV4dCwgcmVzdWx0V3JpdGVyXzogVXRmOEpzb25Xcml0ZXIpIDogVGFzayA9XG4gICAgICAgIHRhc2sge1xuICAgICAgICAgIG1hdGNoIGNvbnRleHRfLk5hbWUgd2l0aGA7XG5cbiAgZm9yIChjb25zdCBvcCBvZiBhc3Qub3BlcmF0aW9ucykge1xuICAgIGNvZGUgKz0gYFxuICAgICAgICAgIHwgJHtKU09OLnN0cmluZ2lmeShvcC5uYW1lKX0gLT5gO1xuICAgIGZvciAoY29uc3QgYXJnIG9mIG9wLmFyZ3MpIHtcbiAgICAgIGNvZGUgKz0gYFxuICAgICAgICAgICAgbGV0ICR7YXJnLm5hbWV9SnNvbl8gPVxuICAgICAgICAgICAgICBtYXRjaCBjb250ZXh0Xy5BcmdzLlRyeUdldFZhbHVlKCR7SlNPTi5zdHJpbmdpZnkoYXJnLm5hbWUpfSkgd2l0aFxuICAgICAgICAgICAgICB8IHRydWUsIHYgLT4gdlxuICAgICAgICAgICAgICB8IF8gLT4gcmFpc2UgKEZhdGFsRXhjZXB0aW9uKFwiJyR7b3AubmFtZX0oKS5hcmdzLiR7YXJnLm5hbWV9JyBtdXN0IGJlIHNldCB0byBhIHZhbHVlIG9mIHR5cGUgJHthcmcudHlwZS5uYW1lfS5cIikpXG5cbiAgICAgICAgICAgIGxldCAke2lkZW50KGFyZy5uYW1lKX0gPVxuICAgICAgICAgICAgICAke2RlY29kZVR5cGUoYXJnLnR5cGUsIGAke2FyZy5uYW1lfUpzb25fYCwgYFwiJHtvcC5uYW1lfSgpLmFyZ3MuJHthcmcubmFtZX1cImAsIGlkZW50KGFyZy5uYW1lKSkucmVwbGFjZSgvXFxuL2d1LCBcIlxcbiAgICAgICAgICAgIFwiKX1gO1xuICAgIH1cblxuICAgIGlmIChvcC5yZXR1cm5UeXBlIGluc3RhbmNlb2YgVm9pZFByaW1pdGl2ZVR5cGUpIHtcbiAgICAgIGNvZGUgKz0gYFxuXG4gICAgICAgICAgICBkbyEgKF9fLiR7Y2FwaXRhbGl6ZShvcC5uYW1lKX0gY29udGV4dF8gJHtvcC5hcmdzLmxlbmd0aCA+IDAgPyBcInt8XCIgOiBcIlwifSAke29wLmFyZ3NcbiAgICAgICAgLm1hcChhcmcgPT4gYCR7YXJnLm5hbWV9ID0gJHtpZGVudChhcmcubmFtZSl9YClcbiAgICAgICAgLmpvaW4oXCI7IFwiKX0gJHtvcC5hcmdzLmxlbmd0aCA+IDAgPyBcInx9XCIgOiBcIlwifSlcbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUgKz0gYFxuXG4gICAgICAgICAgICBsZXQhIHJlc3VsdF8gPSAoX18uJHtjYXBpdGFsaXplKG9wLm5hbWUpfSBjb250ZXh0XyAke29wLmFyZ3MubGVuZ3RoID4gMCA/IFwie3xcIiA6IFwiXCJ9ICR7b3AuYXJnc1xuICAgICAgICAubWFwKGFyZyA9PiBgJHthcmcubmFtZX0gPSAke2lkZW50KGFyZy5uYW1lKX1gKVxuICAgICAgICAuam9pbihcIjsgXCIpfSAke29wLmFyZ3MubGVuZ3RoID4gMCA/IFwifH1cIiA6IFwiXCJ9KVxuICAgICAgICAgICAgJHtlbmNvZGVUeXBlKG9wLnJldHVyblR5cGUsIGByZXN1bHRfYCwgYFwiJHtvcC5uYW1lfSgpLnJldFwiYCwgMSwgZmFsc2UpLnJlcGxhY2UoL1xcbi9ndSwgXCJcXG4gICAgICAgICAgICBcIil9YDtcbiAgICB9XG4gIH1cblxuICBjb2RlICs9IGBcblxuICAgICAgICAgIHwgXyAtPiByYWlzZSAoRmF0YWxFeGNlcHRpb24oJFwiVW5rbm93biBmdW5jdGlvbiAne2NvbnRleHRfLk5hbWV9Jy5cIikpXG4gICAgICAgIH0gOj4gVGFza2A7XG5cbiAgY29kZSArPSBgXG4gICAgbWVtYmVyIF9fLkdldEFzdEpzb24oKSA9IFwiXCJcIiR7SlNPTi5zdHJpbmdpZnkoYXN0VG9Kc29uKGFzdCksIG51bGwsIDQpLnJlcGxhY2UoL1xcbi9ndSwgXCJcXG4gICAgICAgIFwiKX1cIlwiXCI7YDtcblxuICByZXR1cm4gY29kZTtcbn1cbiJdfQ==
@@ -0,0 +1,488 @@
1
+ import { ArrayType, Base64PrimitiveType, BigIntPrimitiveType, BoolPrimitiveType, BytesPrimitiveType, CnpjPrimitiveType, CpfPrimitiveType, DatePrimitiveType, DateTimePrimitiveType, EmailPrimitiveType, EnumType, FloatPrimitiveType, HexPrimitiveType, HtmlPrimitiveType, IntPrimitiveType, JsonPrimitiveType, MoneyPrimitiveType, OptionalType, StringPrimitiveType, StructType, TypeReference, UIntPrimitiveType, UrlPrimitiveType, UuidPrimitiveType, VoidPrimitiveType, XmlPrimitiveType, } from "@sdkgen/parser";
2
+ const reservedWords = [
3
+ "abstract",
4
+ "as",
5
+ "base",
6
+ "bool",
7
+ "break",
8
+ "byte",
9
+ "case",
10
+ "catch",
11
+ "char",
12
+ "checked",
13
+ "class",
14
+ "const",
15
+ "continue",
16
+ "decimal",
17
+ "default",
18
+ "delegate",
19
+ "do",
20
+ "double",
21
+ "else",
22
+ "enum",
23
+ "event",
24
+ "explicit",
25
+ "extern",
26
+ "false",
27
+ "finally",
28
+ "fixed",
29
+ "float",
30
+ "for",
31
+ "foreach",
32
+ "goto",
33
+ "if",
34
+ "implicit",
35
+ "in",
36
+ "int",
37
+ "interface",
38
+ "internal",
39
+ "is",
40
+ "lock",
41
+ "long",
42
+ "namespace",
43
+ "new",
44
+ "null",
45
+ "object",
46
+ "operator",
47
+ "out",
48
+ "override",
49
+ "params",
50
+ "private",
51
+ "protected",
52
+ "public",
53
+ "readonly",
54
+ "ref",
55
+ "return",
56
+ "sbyte",
57
+ "sealed",
58
+ "short",
59
+ "sizeof",
60
+ "stackalloc",
61
+ "static",
62
+ "string",
63
+ "struct",
64
+ "switch",
65
+ "this",
66
+ "throw",
67
+ "true",
68
+ "try",
69
+ "typeof",
70
+ "uint",
71
+ "ulong",
72
+ "unchecked",
73
+ "unsafe",
74
+ "ushort",
75
+ "using",
76
+ "using",
77
+ "static",
78
+ "virtual",
79
+ "void",
80
+ "volatile",
81
+ "while",
82
+ "type",
83
+ "end",
84
+ "id",
85
+ ];
86
+ const typesWithNativeNullable = [
87
+ StringPrimitiveType,
88
+ HtmlPrimitiveType,
89
+ CpfPrimitiveType,
90
+ CnpjPrimitiveType,
91
+ BytesPrimitiveType,
92
+ EmailPrimitiveType,
93
+ UrlPrimitiveType,
94
+ UuidPrimitiveType,
95
+ HexPrimitiveType,
96
+ Base64PrimitiveType,
97
+ XmlPrimitiveType,
98
+ StructType,
99
+ ArrayType,
100
+ ];
101
+ const needsTempVarForNullable = [
102
+ BigIntPrimitiveType,
103
+ DatePrimitiveType,
104
+ DateTimePrimitiveType,
105
+ FloatPrimitiveType,
106
+ IntPrimitiveType,
107
+ MoneyPrimitiveType,
108
+ UIntPrimitiveType,
109
+ ArrayType,
110
+ ];
111
+ export function ident(name) {
112
+ return reservedWords.includes(name) ? `${name}'` : name;
113
+ }
114
+ export function capitalize(name) {
115
+ return name[0].toUpperCase() + name.slice(1);
116
+ }
117
+ export function generateTypeName(type) {
118
+ switch (type.constructor) {
119
+ case StringPrimitiveType:
120
+ return "string";
121
+ case IntPrimitiveType:
122
+ return "int";
123
+ case UIntPrimitiveType:
124
+ return "uint";
125
+ case FloatPrimitiveType:
126
+ return "double";
127
+ case BigIntPrimitiveType:
128
+ return "bigint";
129
+ case DatePrimitiveType:
130
+ case DateTimePrimitiveType:
131
+ return "DateTime";
132
+ case BoolPrimitiveType:
133
+ return "bool";
134
+ case BytesPrimitiveType:
135
+ return "byte[]";
136
+ case MoneyPrimitiveType:
137
+ return "decimal";
138
+ case UuidPrimitiveType:
139
+ return "Guid";
140
+ case CpfPrimitiveType:
141
+ case CnpjPrimitiveType:
142
+ case EmailPrimitiveType:
143
+ case HtmlPrimitiveType:
144
+ case UrlPrimitiveType:
145
+ case HexPrimitiveType:
146
+ case Base64PrimitiveType:
147
+ case XmlPrimitiveType:
148
+ return "string";
149
+ case VoidPrimitiveType:
150
+ return "void";
151
+ case JsonPrimitiveType:
152
+ return "JsonElement";
153
+ case OptionalType:
154
+ return `${generateTypeName(type.base)} option`;
155
+ case ArrayType:
156
+ return `${generateTypeName(type.base)} list`;
157
+ case StructType:
158
+ return type.name;
159
+ case EnumType:
160
+ return type.name;
161
+ case TypeReference:
162
+ return generateTypeName(type.type);
163
+ default:
164
+ throw new Error(`BUG: generateTypeName with ${type.constructor.name}`);
165
+ }
166
+ }
167
+ export function decodeType(type, jsonElementVar, path, targetVar, suffix = 1, maybeNull = true) {
168
+ switch (type.constructor) {
169
+ case IntPrimitiveType: {
170
+ return `
171
+ decodeInt32 ${jsonElementVar} ${path}
172
+ `
173
+ .replace(/\n {16}/gu, "\n")
174
+ .trim();
175
+ }
176
+ case UIntPrimitiveType: {
177
+ return `
178
+ decodeUInt32 ${jsonElementVar} ${path}
179
+ `
180
+ .replace(/\n {16}/gu, "\n")
181
+ .trim();
182
+ }
183
+ case MoneyPrimitiveType: {
184
+ return `
185
+ (decodeMoney ${jsonElementVar} ${path}) / 100m
186
+ `
187
+ .replace(/\n {16}/gu, "\n")
188
+ .trim();
189
+ }
190
+ case FloatPrimitiveType: {
191
+ return `
192
+ decodeFloat ${jsonElementVar} ${path}
193
+ `
194
+ .replace(/\n {16}/gu, "\n")
195
+ .trim();
196
+ }
197
+ case BigIntPrimitiveType: {
198
+ return `
199
+ decodeBigInt ${jsonElementVar} ${path}
200
+ `
201
+ .replace(/\n {16}/gu, "\n")
202
+ .trim();
203
+ }
204
+ case StringPrimitiveType: {
205
+ return `
206
+ decodeString ${jsonElementVar} ${path}
207
+ `
208
+ .replace(/\n {16}/gu, "\n")
209
+ .trim();
210
+ }
211
+ case HtmlPrimitiveType: {
212
+ // TODO: validate HTML
213
+ return `
214
+ decodeHtml ${jsonElementVar} ${path}
215
+ `
216
+ .replace(/\n {16}/gu, "\n")
217
+ .trim();
218
+ }
219
+ case CpfPrimitiveType: {
220
+ // TODO: validate CPF
221
+ return `
222
+ decodeCpf ${jsonElementVar} ${path}
223
+ `
224
+ .replace(/\n {16}/gu, "\n")
225
+ .trim();
226
+ }
227
+ case CnpjPrimitiveType: {
228
+ // TODO: validate CNPJ
229
+ return `
230
+ decodeCnpj ${jsonElementVar} ${path}
231
+ `
232
+ .replace(/\n {16}/gu, "\n")
233
+ .trim();
234
+ }
235
+ case EmailPrimitiveType: {
236
+ // TODO: validate Email
237
+ return `
238
+ decodeEmail ${jsonElementVar} ${path}
239
+ `
240
+ .replace(/\n {16}/gu, "\n")
241
+ .trim();
242
+ }
243
+ case UrlPrimitiveType: {
244
+ // TODO: validate URL
245
+ return `
246
+ decodeUrl ${jsonElementVar} ${path}
247
+ `
248
+ .replace(/\n {16}/gu, "\n")
249
+ .trim();
250
+ }
251
+ case UuidPrimitiveType: {
252
+ // TODO: validate UUID
253
+ return `
254
+ decodeUuid ${jsonElementVar} ${path}
255
+ `
256
+ .replace(/\n {16}/gu, "\n")
257
+ .trim();
258
+ }
259
+ case HexPrimitiveType: {
260
+ // TODO: validate Hex
261
+ return `
262
+ decodeHex ${jsonElementVar} ${path}
263
+ `
264
+ .replace(/\n {16}/gu, "\n")
265
+ .trim();
266
+ }
267
+ case Base64PrimitiveType: {
268
+ // TODO: validate Base64
269
+ return `
270
+ decodeBase64 ${jsonElementVar} ${path}
271
+ `
272
+ .replace(/\n {16}/gu, "\n")
273
+ .trim();
274
+ }
275
+ case XmlPrimitiveType: {
276
+ // TODO: validate XML
277
+ return `
278
+ decodeXml ${jsonElementVar} ${path}
279
+ `
280
+ .replace(/\n {16}/gu, "\n")
281
+ .trim();
282
+ }
283
+ case BoolPrimitiveType: {
284
+ return `
285
+ decodeBool ${jsonElementVar} ${path}
286
+ `
287
+ .replace(/\n {16}/gu, "\n")
288
+ .trim();
289
+ }
290
+ case BytesPrimitiveType: {
291
+ return `
292
+ decodeBytes ${jsonElementVar} ${path}
293
+ `
294
+ .replace(/\n {16}/gu, "\n")
295
+ .trim();
296
+ }
297
+ case TypeReference:
298
+ return decodeType(type.type, jsonElementVar, path, targetVar, suffix);
299
+ case OptionalType:
300
+ if (needsTempVarForNullable.includes(type.base.constructor)) {
301
+ return `match ${jsonElementVar}.ValueKind with
302
+ | JsonValueKind.Null | JsonValueKind.Undefined -> None
303
+ | _ ->
304
+ (${decodeType(type.base, jsonElementVar, path, targetVar, suffix, false).replace(/\n/gu, "\n ")}) |> Some
305
+ `
306
+ .replace(/\n {16}/gu, "\n")
307
+ .trim();
308
+ }
309
+ if (type.base instanceof OptionalType || type.base instanceof ArrayType) {
310
+ return `
311
+ (>.>) decodeOptional ${decodeType(type.base, jsonElementVar, path, targetVar, suffix, false)}
312
+ `
313
+ .replace(/\n {16}/gu, "\n")
314
+ .trim();
315
+ }
316
+ return `
317
+ decodeOptional ${decodeType(type.base, jsonElementVar, path, targetVar, suffix, false)}
318
+ `
319
+ .replace(/\n {16}/gu, "\n")
320
+ .trim();
321
+ case EnumType:
322
+ case StructType:
323
+ return `Decode${type.name} ${jsonElementVar} ${path}`;
324
+ case JsonPrimitiveType:
325
+ if (maybeNull) {
326
+ return `
327
+ ${jsonElementVar}
328
+ `
329
+ .replace(/\n {16}/gu, "\n")
330
+ .trim();
331
+ }
332
+ return `${targetVar} <- ${jsonElementVar}`;
333
+ case DateTimePrimitiveType: {
334
+ return `
335
+ decodeDateTime ${jsonElementVar} ${path}
336
+ `
337
+ .replace(/\n {16}/gu, "\n")
338
+ .trim();
339
+ }
340
+ case DatePrimitiveType: {
341
+ return `
342
+ decodeDate ${jsonElementVar} ${path}
343
+ `
344
+ .replace(/\n {16}/gu, "\n")
345
+ .trim();
346
+ }
347
+ case ArrayType: {
348
+ return `
349
+ match ${jsonElementVar}.ValueKind with
350
+ | JsonValueKind.Array ->
351
+ let mutable list_ = List.empty
352
+ for i1 in 0 .. (${jsonElementVar}.GetArrayLength() - 1) do
353
+ let item = ${jsonElementVar}.[i1]
354
+ let partialResult =
355
+ ${decodeType(type.base, `${jsonElementVar}.[i1]`, `${path.slice(0, -1)}.{i1}"`, targetVar, suffix, false).replace(/\n/gu, "\n ")}
356
+ list_ <- list_ |> List.append [ partialResult ]
357
+ list_
358
+ | _ -> raise (FatalException(${path.slice(0, -1)} must be an array."))
359
+ `
360
+ .replace(/\n {16}/gu, "\n")
361
+ .trim();
362
+ }
363
+ default:
364
+ throw new Error(`BUG: decodeType with ${type.constructor.name}`);
365
+ }
366
+ }
367
+ export function encodeType(type, valueVar, path, suffix = 1, isRef = true) {
368
+ switch (type.constructor) {
369
+ case StringPrimitiveType: {
370
+ return `resultWriter_.WriteStringValue(${valueVar})`;
371
+ }
372
+ case FloatPrimitiveType:
373
+ case UIntPrimitiveType:
374
+ case IntPrimitiveType: {
375
+ return `resultWriter_.WriteNumberValue(${valueVar})`;
376
+ }
377
+ case MoneyPrimitiveType: {
378
+ return `resultWriter_.WriteNumberValue(int (Math.Round(${valueVar} * 100m)))`;
379
+ }
380
+ case BigIntPrimitiveType: {
381
+ return `resultWriter_.WriteStringValue(${valueVar}.ToString())`;
382
+ }
383
+ case BoolPrimitiveType: {
384
+ return `resultWriter_.WriteBooleanValue(${valueVar})`;
385
+ }
386
+ case BytesPrimitiveType: {
387
+ return `resultWriter_.WriteStringValue(Convert.ToBase64String(${valueVar}))`;
388
+ }
389
+ case DateTimePrimitiveType: {
390
+ return `resultWriter_.WriteStringValue(${valueVar}.ToString("yyyy-MM-ddTHH:mm:ss.FFFFFF'Z'"))`;
391
+ }
392
+ case DatePrimitiveType: {
393
+ return `resultWriter_.WriteStringValue(${valueVar}.ToString("yyyy-MM-dd"))`;
394
+ }
395
+ // TODO: format those
396
+ case CpfPrimitiveType:
397
+ case CnpjPrimitiveType:
398
+ case EmailPrimitiveType:
399
+ case HtmlPrimitiveType:
400
+ case UrlPrimitiveType:
401
+ case UuidPrimitiveType:
402
+ case Base64PrimitiveType:
403
+ case HexPrimitiveType:
404
+ case XmlPrimitiveType: {
405
+ return `resultWriter_.WriteStringValue(${valueVar})`;
406
+ }
407
+ case OptionalType: {
408
+ let realBaseType = type.base;
409
+ while (realBaseType instanceof TypeReference) {
410
+ realBaseType = realBaseType.type;
411
+ }
412
+ return `
413
+ if (${valueVar}.IsNone) then
414
+ resultWriter_.WriteNullValue()
415
+ else
416
+ ${encodeType(realBaseType, `${valueVar}.Value`, path, suffix, isRef)}
417
+ `
418
+ .replace(/\n {14}/gu, "\n")
419
+ .trim();
420
+ }
421
+ case TypeReference:
422
+ return encodeType(type.type, valueVar, path, suffix, isRef);
423
+ case EnumType:
424
+ return `Encode${type.name} ${valueVar} resultWriter_ ${path}`;
425
+ case StructType:
426
+ return `Encode${type.name} ${valueVar} resultWriter_ ${path}`;
427
+ case JsonPrimitiveType:
428
+ return `${valueVar}.WriteTo(resultWriter_)`;
429
+ case ArrayType: {
430
+ return `
431
+ resultWriter_.WriteStartArray()
432
+ for i${suffix} in 0..${valueVar}.Length - 1 do
433
+ ${encodeType(type.base, `${valueVar}.[i${suffix}]`, `${path}`, suffix + 1).replace(/\n/gu, "\n ")}
434
+ resultWriter_.WriteEndArray()
435
+ `
436
+ .replace(/\n {14}/gu, "\n")
437
+ .trim();
438
+ }
439
+ default:
440
+ throw new Error(`BUG: encodeType with ${type.constructor.name}`);
441
+ }
442
+ }
443
+ export function generateStruct(struct) {
444
+ return `
445
+ type ${struct.name} = {
446
+ ${struct.fields.map(field => `${capitalize(field.name)}: ${generateTypeName(field.type)}`).join(";\n ")}
447
+ } with
448
+ static member Create (${struct.fields.map(field => `${ident(field.name)}: ${generateTypeName(field.type)}`).join(", ")}): ${struct.name} =
449
+ { ${struct.fields.map(field => `${capitalize(field.name)} = ${ident(field.name)}`).join("; ")} }
450
+
451
+ let Decode${struct.name} (json_: JsonElement) (path_: string): ${struct.name} =
452
+ if (json_.ValueKind <> JsonValueKind.Object) then raise (FatalException($"'{path_}' must be an object."))
453
+ ${struct.fields
454
+ .map(field => `
455
+ let ${field.name}Json_ = decodeJsonElementStrict ${JSON.stringify(field.name)} json_ $"{path_}.${field.name}"
456
+ let ${ident(field.name)} =
457
+ ${decodeType(field.type, `${field.name}Json_`, `$"{path_}.${field.name}"`, ident(field.name)).replace(/\n/gu, "\n ")}
458
+ `)
459
+ .join("")}
460
+ { ${struct.fields.map(field => `${capitalize(field.name)} = ${ident(field.name)}`).join("; ")} }
461
+
462
+ let Encode${struct.name} (obj_: ${struct.name}) (resultWriter_: Utf8JsonWriter) (path_: string) =
463
+ resultWriter_.WriteStartObject()
464
+ ${struct.fields
465
+ .map(field => `
466
+ resultWriter_.WritePropertyName(${JSON.stringify(field.name)})
467
+ ${encodeType(field.type, `obj_.${capitalize(field.name)}`, `$"{path_}.${field.name}"`).replace(/\n/gu, "\n ")}`)
468
+ .join("\n")}
469
+ resultWriter_.WriteEndObject()`;
470
+ }
471
+ export function generateEnum(type) {
472
+ return `
473
+ type ${type.name} =
474
+ ${type.values.map(({ value }) => `| ${capitalize(value)}`).join("\n ")}
475
+
476
+ let Decode${type.name} (json_: JsonElement) (path_: string): ${type.name} =
477
+ if (json_.ValueKind <> JsonValueKind.String) then raise (FatalException($"'{path_}' must be a string."))
478
+ match json_.GetString() with
479
+ ${type.values.map(({ value }) => `| "${value}" -> ${type.name}.${capitalize(value)}`).join("\n ")}
480
+ | _ -> raise (FatalException($"'{path_}' must be one of: (${type.values.map(({ value }) => `'${value}'`).join(", ")})."))
481
+
482
+ let Encode${type.name} (obj_: ${type.name}) (resultWriter_: Utf8JsonWriter) (path_: string) =
483
+ match obj_ with
484
+ ${type.values.map(({ value }) => `| ${type.name}.${capitalize(value)} -> resultWriter_.WriteStringValue("${value}")`).join("\n ")}
485
+
486
+ `;
487
+ }
488
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsUUFBUSxFQUNSLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsZ0JBQWdCLEdBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsTUFBTSxhQUFhLEdBQUc7SUFDcEIsVUFBVTtJQUNWLElBQUk7SUFDSixNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLElBQUk7SUFDSixRQUFRO0lBQ1IsTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsS0FBSztJQUNMLFNBQVM7SUFDVCxNQUFNO0lBQ04sSUFBSTtJQUNKLFVBQVU7SUFDVixJQUFJO0lBQ0osS0FBSztJQUNMLFdBQVc7SUFDWCxVQUFVO0lBQ1YsSUFBSTtJQUNKLE1BQU07SUFDTixNQUFNO0lBQ04sV0FBVztJQUNYLEtBQUs7SUFDTCxNQUFN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TztPQUNGLElBQUksQ0FBQyxJQUFJO0lBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7WUFFN0QsSUFBSSxDQUFDLElBQUksMENBQTBDLElBQUksQ0FBQyxJQUFJOzs7SUFHcEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzs4REFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs7WUFFekcsSUFBSSxDQUFDLElBQUksV0FBVyxJQUFJLENBQUMsSUFBSTs7SUFFckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDOztDQUVuSSxDQUFDO0FBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gXCJAc2RrZ2VuL3BhcnNlclwiO1xuaW1wb3J0IHtcbiAgQXJyYXlUeXBlLFxuICBCYXNlNjRQcmltaXRpdmVUeXBlLFxuICBCaWdJbnRQcmltaXRpdmVUeXBlLFxuICBCb29sUHJpbWl0aXZlVHlwZSxcbiAgQnl0ZXNQcmltaXRpdmVUeXBlLFxuICBDbnBqUHJpbWl0aXZlVHlwZSxcbiAgQ3BmUHJpbWl0aXZlVHlwZSxcbiAgRGF0ZVByaW1pdGl2ZVR5cGUsXG4gIERhdGVUaW1lUHJpbWl0aXZlVHlwZSxcbiAgRW1haWxQcmltaXRpdmVUeXBlLFxuICBFbnVtVHlwZSxcbiAgRmxvYXRQcmltaXRpdmVUeXBlLFxuICBIZXhQcmltaXRpdmVUeXBlLFxuICBIdG1sUHJpbWl0aXZlVHlwZSxcbiAgSW50UHJpbWl0aXZlVHlwZSxcbiAgSnNvblByaW1pdGl2ZVR5cGUsXG4gIE1vbmV5UHJpbWl0aXZlVHlwZSxcbiAgT3B0aW9uYWxUeXBlLFxuICBTdHJpbmdQcmltaXRpdmVUeXBlLFxuICBTdHJ1Y3RUeXBlLFxuICBUeXBlUmVmZXJlbmNlLFxuICBVSW50UHJpbWl0aXZlVHlwZSxcbiAgVXJsUHJpbWl0aXZlVHlwZSxcbiAgVXVpZFByaW1pdGl2ZVR5cGUsXG4gIFZvaWRQcmltaXRpdmVUeXBlLFxuICBYbWxQcmltaXRpdmVUeXBlLFxufSBmcm9tIFwiQHNka2dlbi9wYXJzZXJcIjtcblxuY29uc3QgcmVzZXJ2ZWRXb3JkcyA9IFtcbiAgXCJhYnN0cmFjdFwiLFxuICBcImFzXCIsXG4gIFwiYmFzZVwiLFxuICBcImJvb2xcIixcbiAgXCJicmVha1wiLFxuICBcImJ5dGVcIixcbiAgXCJjYXNlXCIsXG4gIFwiY2F0Y2hcIixcbiAgXCJjaGFyXCIsXG4gIFwiY2hlY2tlZFwiLFxuICBcImNsYXNzXCIsXG4gIFwiY29uc3RcIixcbiAgXCJjb250aW51ZVwiLFxuICBcImRlY2ltYWxcIixcbiAgXCJkZWZhdWx0XCIsXG4gIFwiZGVsZWdhdGVcIixcbiAgXCJkb1wiLFxuICBcImRvdWJsZVwiLFxuICBcImVsc2VcIixcbiAgXCJlbnVtXCIsXG4gIFwiZXZlbnRcIixcbiAgXCJleHBsaWNpdFwiLFxuICBcImV4dGVyblwiLFxuICBcImZhbHNlXCIsXG4gIFwiZmluYWxseVwiLFxuICBcImZpeGVkXCIsXG4gIFwiZmxvYXRcIixcbiAgXCJmb3JcIixcbiAgXCJmb3JlYWNoXCIsXG4gIFwiZ290b1wiLFxuICBcImlmXCIsXG4gIFwiaW1wbGljaXRcIixcbiAgXCJpblwiLFxuICBcImludFwiLFxuICBcImludGVyZmFjZVwiLFxuICBcImludGVybmFsXCIsXG4gIFwiaXNcIixcbiAgXCJsb2NrXCIsXG4gIFwibG9uZ1wiLFxuICBcIm5hbWVzcGFjZVwiLFxuICBcIm5ld1wiLFxuICBcIm51bGxcIixcbiAgXCJvYmplY3RcIixcbiAgXCJvcGVyYXRvclwiLFxuICBcIm91dFwiLFxuICBcIm92ZXJyaWRlXCIsXG4gIFwicGFyYW1zXCIsXG4gIFwicHJpdmF0ZVwiLFxuICBcInByb3RlY3RlZFwiLFxuICBcInB1YmxpY1wiLFxuICBcInJlYWRvbmx5XCIsXG4gIFwicmVmXCIsXG4gIFwicmV0dXJuXCIsXG4gIFwic2J5dGVcIixcbiAgXCJzZWFsZWRcIixcbiAgXCJzaG9ydFwiLFxuICBcInNpemVvZlwiLFxuICBcInN0YWNrYWxsb2NcIixcbiAgXCJzdGF0aWNcIixcbiAgXCJzdHJpbmdcIixcbiAgXCJzdHJ1Y3RcIixcbiAgXCJzd2l0Y2hcIixcbiAgXCJ0aGlzXCIsXG4gIFwidGhyb3dcIixcbiAgXCJ0cnVlXCIsXG4gIFwidHJ5XCIsXG4gIFwidHlwZW9mXCIsXG4gIFwidWludFwiLFxuICBcInVsb25nXCIsXG4gIFwidW5jaGVja2VkXCIsXG4gIFwidW5zYWZlXCIsXG4gIFwidXNob3J0XCIsXG4gIFwidXNpbmdcIixcbiAgXCJ1c2luZ1wiLFxuICBcInN0YXRpY1wiLFxuICBcInZpcnR1YWxcIixcbiAgXCJ2b2lkXCIsXG4gIFwidm9sYXRpbGVcIixcbiAgXCJ3aGlsZVwiLFxuICBcInR5cGVcIixcbiAgXCJlbmRcIixcbiAgXCJpZFwiLFxuXTtcblxuY29uc3QgdHlwZXNXaXRoTmF0aXZlTnVsbGFibGU6IEZ1bmN0aW9uW10gPSBbXG4gIFN0cmluZ1ByaW1pdGl2ZVR5cGUsXG4gIEh0bWxQcmltaXRpdmVUeXBlLFxuICBDcGZQcmltaXRpdmVUeXBlLFxuICBDbnBqUHJpbWl0aXZlVHlwZSxcbiAgQnl0ZXNQcmltaXRpdmVUeXBlLFxuICBFbWFpbFByaW1pdGl2ZVR5cGUsXG4gIFVybFByaW1pdGl2ZVR5cGUsXG4gIFV1aWRQcmltaXRpdmVUeXBlLFxuICBIZXhQcmltaXRpdmVUeXBlLFxuICBCYXNlNjRQcmltaXRpdmVUeXBlLFxuICBYbWxQcmltaXRpdmVUeXBlLFxuICBTdHJ1Y3RUeXBlLFxuICBBcnJheVR5cGUsXG5dO1xuXG5jb25zdCBuZWVkc1RlbXBWYXJGb3JOdWxsYWJsZTogRnVuY3Rpb25bXSA9IFtcbiAgQmlnSW50UHJpbWl0aXZlVHlwZSxcbiAgRGF0ZVByaW1pdGl2ZVR5cGUsXG4gIERhdGVUaW1lUHJpbWl0aXZlVHlwZSxcbiAgRmxvYXRQcmltaXRpdmVUeXBlLFxuICBJbnRQcmltaXRpdmVUeXBlLFxuICBNb25leVByaW1pdGl2ZVR5cGUsXG4gIFVJbnRQcmltaXRpdmVUeXBlLFxuICBBcnJheVR5cGUsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc2VydmVkV29yZHMuaW5jbHVkZXMobmFtZSkgPyBgJHtuYW1lfSdgIDogbmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcGl0YWxpemUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVR5cGVOYW1lKHR5cGU6IFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHR5cGUuY29uc3RydWN0b3IpIHtcbiAgICBjYXNlIFN0cmluZ1ByaW1pdGl2ZVR5cGU6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIEludFByaW1pdGl2ZVR5cGU6XG4gICAgICByZXR1cm4gXCJpbnRcIjtcbiAgICBjYXNlIFVJbnRQcmltaXRpdmVUeXBlOlxuICAgICAgcmV0dXJuIFwidWludFwiO1xuICAgIGNhc2UgRmxvYXRQcmltaXRpdmVUeXBlOlxuICAgICAgcmV0dXJuIFwiZG91YmxlXCI7XG4gICAgY2FzZSBCaWdJbnRQcmltaXRpdmVUeXBlOlxuICAgICAgcmV0dXJuIFwiYmlnaW50XCI7XG4gICAgY2FzZSBEYXRlUHJpbWl0aXZlVHlwZTpcbiAgICBjYXNlIERhdGVUaW1lUHJpbWl0aXZlVHlwZTpcbiAgICAgIHJldHVybiBcIkRhdGVUaW1lXCI7XG4gICAgY2FzZSBCb29sUHJpbWl0aXZlVHlwZTpcbiAgICAgIHJldHVybiBcImJvb2xcIjtcbiAgICBjYXNlIEJ5dGVzUHJpbWl0aXZlVHlwZTpcbiAgICAgIHJldHVybiBcImJ5dGVbXVwiO1xuICAgIGNhc2UgTW9uZXlQcmltaXRpdmVUeXBlOlxuICAgICAgcmV0dXJuIFwiZGVjaW1hbFwiO1xuICAgIGNhc2UgVXVpZFByaW1pdGl2ZVR5cGU6XG4gICAgICByZXR1cm4gXCJHdWlkXCI7XG4gICAgY2FzZSBDcGZQcmltaXRpdmVUeXBlOlxuICAgIGNhc2UgQ25walByaW1pdGl2ZVR5cGU6XG4gICAgY2FzZSBFbWFpbFByaW1pdGl2ZVR5cGU6XG4gICAgY2FzZSBIdG1sUHJpbWl0aXZlVHlwZTpcbiAgICBjYXNlIFVybFByaW1pdGl2ZVR5cGU6XG4gICAgY2FzZSBIZXhQcmltaXRpdmVUeXBlOlxuICAgIGNhc2UgQmFzZTY0UHJpbWl0aXZlVHlwZTpcbiAgICBjYXNlIFhtbFByaW1pdGl2ZVR5cGU6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIFZvaWRQcmltaXRpdmVUeXBlOlxuICAgICAgcmV0dXJuIFwidm9pZFwiO1xuICAgIGNhc2UgSnNvblByaW1pdGl2ZVR5cGU6XG4gICAgICByZXR1cm4gXCJKc29uRWxlbWVudFwiO1xuICAgIGNhc2UgT3B0aW9uYWxUeXBlOlxuICAgICAgcmV0dXJuIGAke2dlbmVyYXRlVHlwZU5hbWUoKHR5cGUgYXMgT3B0aW9uYWxUeXBlKS5iYXNlKX0gb3B0aW9uYDtcbiAgICBjYXNlIEFycmF5VHlwZTpcbiAgICAgIHJldHVybiBgJHtnZW5lcmF0ZVR5cGVOYW1lKCh0eXBlIGFzIEFycmF5VHlwZSkuYmFzZSl9IGxpc3RgO1xuICAgIGNhc2UgU3RydWN0VHlwZTpcbiAgICAgIHJldHVybiB0eXBlLm5hbWU7XG4gICAgY2FzZSBFbnVtVHlwZTpcbiAgICAgIHJldHVybiB0eXBlLm5hbWU7XG4gICAgY2FzZSBUeXBlUmVmZXJlbmNlOlxuICAgICAgcmV0dXJuIGdlbmVyYXRlVHlwZU5hbWUoKHR5cGUgYXMgVHlwZVJlZmVyZW5jZSkudHlwZSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQlVHOiBnZW5lcmF0ZVR5cGVOYW1lIHdpdGggJHt0eXBlLmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVR5cGUodHlwZTogVHlwZSwganNvbkVsZW1lbnRWYXI6IHN0cmluZywgcGF0aDogc3RyaW5nLCB0YXJnZXRWYXI6IHN0cmluZywgc3VmZml4ID0gMSwgbWF5YmVOdWxsID0gdHJ1ZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAodHlwZS5jb25zdHJ1Y3Rvcikge1xuICAgIGNhc2UgSW50UHJpbWl0aXZlVHlwZToge1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgZGVjb2RlSW50MzIgJHtqc29uRWxlbWVudFZhcn0gJHtwYXRofVxuICAgICAgICAgICAgYFxuICAgICAgICAucmVwbGFjZSgvXFxuIHsxNn0vZ3UsIFwiXFxuXCIpXG4gICAgICAgIC50cmltKCk7XG4gICAgfVxuXG4gICAgY2FzZSBVSW50UHJpbWl0aXZlVHlwZToge1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgZGVjb2RlVUludDMyICR7anNvbkVsZW1lbnRWYXJ9ICR7cGF0aH1cbiAgICAgICAgICAgIGBcbiAgICAgICAgLnJlcGxhY2UoL1xcbiB7MTZ9L2d1LCBcIlxcblwiKVxuICAgICAgICAudHJpbSgpO1xuICAgIH1cblxuICAgIGNhc2UgTW9uZXlQcmltaXRpdmVUeXBlOiB7XG4gICAgICByZXR1cm4gYFxuICAgICAgICAgICAgICAgIChkZWNvZGVNb25leSAke2pzb25FbGVtZW50VmFyfSAke3BhdGh9KSAvIDEwMG1cbiAgICAgICAgICAgIGBcbiAgICAgICAgLnJlcGxhY2UoL1xcbiB7MTZ9L2d1LCBcIlxcblwiKVxuICAgICAgICAudHJpbSgpO1xuICAgIH1cblxuICAgIGNhc2UgRmxvYXRQcmltaXRpdmVUeXBlOiB7XG4gICAgICByZXR1cm4gYFxuICAgICAgICAgICAgICAgIGRlY29kZUZsb2F0ICR7anNvbkVsZW1lbnRWYXJ9ICR7cGF0aH1cbiAgICAgICAgICAgIGBcbiAgICAgICAgLnJlcGxhY2UoL1xcbiB7MTZ9L2d1LCBcIlxcblwiKVxuICAgICAgICAudHJpbSgpO1xuICAgIH1cblxuICAgIGNhc2UgQmlnSW50UHJpbWl0aXZlVHlwZToge1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICBkZWNvZGVCaWdJbnQgJHtqc29uRWxlbWVudFZhcn0gJHtwYXRofVxuICAgICAgICAgICAgYFxuICAgICAgICAucmVwbGFjZSgvXFxuIHsxNn0vZ3UsIFwiXFxuXCIpXG4gICAgICAgIC50cmltKCk7XG4gICAgfVxuXG4gICAgY2FzZSBTdHJpbmdQcmltaXRpdmVUeXBlOiB7XG4gICAgICByZXR1cm4gYFxuICAgICAgICAgICAgICAgIGRlY29kZVN0cmluZyAke2pzb25FbGVtZW50VmFyfSAke3BhdGh9XG4gICAgICAgICAgICBgXG4gICAgICAgIC5yZXBsYWNlKC9cXG4gezE2fS9ndSwgXCJcXG5cIilcbiAgICAgICAgLnRyaW0oKTtcbiAgICB9XG5cbiAgICBjYXNlIEh0bWxQcmltaXRpdmVUeXBlOiB7XG4gICAgICAvLyBUT0RPOiB2YWxpZGF0ZSBIVE1MXG4gICAgICByZXR1cm4gYFxuICAgICAgICAgICAgICAgIGRlY29kZUh0bWwgJHtqc29uRWxlbWVudFZhcn0gJHtwYXRofVxuICAgICAgICAgICAgYFxuICAgICAgICAucmVwbGFjZSgvXFxuIHsxNn0vZ3UsIFwiXFxuXCIpXG4gICAgICAgIC50cmltKCk7XG4gICAgfVxuXG4gICAgY2FzZSBDcGZQcmltaXRpdmVUeXBlOiB7XG4gICAgICAvLyBUT0RPOiB2YWxpZGF0ZSBDUEZcbiAgICAgIHJldHVybiBgXG4gICAgICAgICAgICAgICAgZGVjb2RlQ3BmICR7anNvbkVsZW1lbnRWYXJ9ICR7cGF0aH1cbiAgICAgICAgICAgIGBcbiAgICAgICAgLnJlcGxhY2UoL1xcbiB7MTZ9L2d1LCBcIlxcblwiKVxuICAgICAgICAudHJpbSgpO1xuICAgIH1cblxuICAgIGNhc2UgQ25walByaW1pdGl2ZVR5cGU6IHtcbiAgICAgIC8vIFRPRE86IHZhbGlkYXRlIENOUEpcbiAgICAgIHJldHVybiBgXG4gICAgICAgICAgICAgICAgZGVjb2RlQ25waiAke2pzb25FbGVtZW50VmFyfSAke3BhdGh9XG4gICAgICAgICAgICBgXG4gICAgICAgIC5yZXBsYWNlKC9cXG4gezE2fS9ndSwgXCJcXG5cIilcbiAgICAgICAgLnRyaW0oKTtcbiAgICB9XG5cbiAgICBjYXNlIEVtYWlsUHJpbWl0aXZlVHlwZToge1xuICAgICAgLy8gVE9ETzogdmFsaWRhdGUgRW1haWxcbiAgICAgIHJldHVybiBgXG4gICAgICAgICAgICAgICAgZGVjb2RlRW1haWwgJHtqc29uRWxlbWVudFZhcn0gJHtwYXRofVxuICAgICAgICAgICAgYFxuICAgICAgICAucmVwbGFjZSgvXFxuIHsxNn0vZ3UsIFwiXFxuXCIpXG4gICAgICAgIC50cmltKCk7XG4gICAgfVxuXG4gICAgY2FzZSBVcmxQcmltaXRpdmVUeXBlOiB7XG4gICAgICAvLyBUT0RPOiB2YWxpZGF0ZSBVUkxcbiAgICAgIHJldHVybiBgXG4gICAgICAgICAgICAgICAgZGVjb2RlVXJsICR7anNvbkVsZW1lbnRWYXJ9ICR7cGF0aH1cbiAgICAgICAgICAgIGBcbiAgICAgICAgLnJlcGxhY2UoL1xcbiB7MTZ9L2d1LCBcIlxcblwiKVxuICAgICAgICAudHJpbSgpO1xuICAgIH1cblxuICAgIGNhc2UgVXVpZFByaW1pdGl2ZVR5cGU6IHtcbiAgICAgIC8vIFRPRE86IHZhbGlkYXRlIFVVSURcbiAgICAgIHJldHVybiBgXG4gICAgICAgICAgICAgICAgZGVjb2RlVXVpZCAke2pzb25FbGVtZW50VmFyfSAke3BhdGh9XG4gICAgICAgICAgICBgXG4gICAgICAgIC5yZXBsYWNlKC9cXG4gezE2fS9ndSwgXCJcXG5cIilcbiAgICAgICAgLnRyaW0oKTtcbiAgICB9XG5cbiAgICBjYXNlIEhleFByaW1pdGl2ZVR5cGU6IHtcbiAgICAgIC8vIFRPRE86IHZhbGlkYXRlIEhleFxuICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICBkZWNvZGVIZXggJHtqc29uRWxlbWVudFZhcn0gJHtwYXRofVxuICAgICAgICAgICAgYFxuICAgICAgICAucmVwbGFjZSgvXFxuIHsxNn0vZ3UsIFwiXFxuXCIpXG4gICAgICAgIC50cmltKCk7XG4gICAgfVxuXG4gICAgY2FzZSBCYXNlNjRQcmltaXRpdmVUeXBlOiB7XG4gICAgICAvLyBUT0RPOiB2YWxpZGF0ZSBCYXNlNjRcbiAgICAgIHJldHVybiBgXG4gICAgICAgICAgICAgICAgZGVjb2RlQmFzZTY0ICR7anNvbkVsZW1lbnRWYXJ9ICR7cGF0aH1cbiAgICAgICAgICAgIGBcbiAgICAgICAgLnJlcGxhY2UoL1xcbiB7MTZ9L2d1LCBcIlxcblwiKVxuICAgICAgICAudHJpbSgpO1xuICAgIH1cblxuICAgIGNhc2UgWG1sUHJpbWl0aXZlVHlwZToge1xuICAgICAgLy8gVE9ETzogdmFsaWRhdGUgWE1MXG4gICAgICByZXR1cm4gYFxuICAgICAgICAgICAgICAgIGRlY29kZVhtbCAke2pzb25FbGVtZW50VmFyfSAke3BhdGh9XG4gICAgICAgICAgICBgXG4gICAgICAgIC5yZXBsYWNlKC9cXG4gezE2fS9ndSwgXCJcXG5cIilcbiAgICAgICAgLnRyaW0oKTtcbiAgICB9XG5cbiAgICBjYXNlIEJvb2xQcmltaXRpdmVUeXBlOiB7XG4gICAgICByZXR1cm4gYFxuICAgICAgICAgICAgICAgIGRlY29kZUJvb2wgJHtqc29uRWxlbWVudFZhcn0gJHtwYXRofVxuICAgICAgICAgICAgYFxuICAgICAgICAucmVwbGFjZSgvXFxuIHsxNn0vZ3UsIFwiXFxuXCIpXG4gICAgICAgIC50cmltKCk7XG4gICAgfVxuXG4gICAgY2FzZSBCeXRlc1ByaW1pdGl2ZVR5cGU6IHtcbiAgICAgIHJldHVybiBgXG4gICAgICAgICAgICAgICAgZGVjb2RlQnl0ZXMgJHtqc29uRWxlbWVudFZhcn0gJHtwYXRofVxuICAgICAgICAgICAgYFxuICAgICAgICAucmVwbGFjZSgvXFxuIHsxNn0vZ3UsIFwiXFxuXCIpXG4gICAgICAgIC50cmltKCk7XG4gICAgfVxuXG4gICAgY2FzZSBUeXBlUmVmZXJlbmNlOlxuICAgICAgcmV0dXJuIGRlY29kZVR5cGUoKHR5cGUgYXMgVHlwZVJlZmVyZW5jZSkudHlwZSwganNvbkVsZW1lbnRWYXIsIHBhdGgsIHRhcmdldFZhciwgc3VmZml4KTtcbiAgICBjYXNlIE9wdGlvbmFsVHlwZTpcbiAgICAgIGlmIChuZWVkc1RlbXBWYXJGb3JOdWxsYWJsZS5pbmNsdWRlcygodHlwZSBhcyBPcHRpb25hbFR5cGUpLmJhc2UuY29uc3RydWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBgbWF0Y2ggJHtqc29uRWxlbWVudFZhcn0uVmFsdWVLaW5kIHdpdGhcbiAgICAgICAgICAgICAgICAgIHwgSnNvblZhbHVlS2luZC5OdWxsIHwgSnNvblZhbHVlS2luZC5VbmRlZmluZWQgLT4gTm9uZVxuICAgICAgICAgICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICAgICAgICAgICgke2RlY29kZVR5cGUoKHR5cGUgYXMgT3B0aW9uYWxUeXBlKS5iYXNlLCBqc29uRWxlbWVudFZhciwgcGF0aCwgdGFyZ2V0VmFyLCBzdWZmaXgsIGZhbHNlKS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgIC9cXG4vZ3UsXG4gICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgICAgICAgICAgICAgIFwiLFxuICAgICAgICAgICAgICAgICAgICApfSkgfD4gU29tZVxuICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAucmVwbGFjZSgvXFxuIHsxNn0vZ3UsIFwiXFxuXCIpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCh0eXBlIGFzIEFycmF5VHlwZSkuYmFzZSBpbnN0YW5jZW9mIE9wdGlvbmFsVHlwZSB8fCAodHlwZSBhcyBBcnJheVR5cGUpLmJhc2UgaW5zdGFuY2VvZiBBcnJheVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICAoPi4+KSBkZWNvZGVPcHRpb25hbCAke2RlY29kZVR5cGUoKHR5cGUgYXMgT3B0aW9uYWxUeXBlKS5iYXNlLCBqc29uRWxlbWVudFZhciwgcGF0aCwgdGFyZ2V0VmFyLCBzdWZmaXgsIGZhbHNlKX1cbiAgICAgICAgICAgIGBcbiAgICAgICAgICAucmVwbGFjZSgvXFxuIHsxNn0vZ3UsIFwiXFxuXCIpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICBkZWNvZGVPcHRpb25hbCAke2RlY29kZVR5cGUoKHR5cGUgYXMgT3B0aW9uYWxUeXBlKS5iYXNlLCBqc29uRWxlbWVudFZhciwgcGF0aCwgdGFyZ2V0VmFyLCBzdWZmaXgsIGZhbHNlKX1cbiAgICAgICAgICAgIGBcbiAgICAgICAgLnJlcGxhY2UoL1xcbiB7MTZ9L2d1LCBcIlxcblwiKVxuICAgICAgICAudHJpbSgpO1xuICAgIGNhc2UgRW51bVR5cGU6XG4gICAgY2FzZSBTdHJ1Y3RUeXBlOlxuICAgICAgcmV0dXJuIGBEZWNvZGUke3R5cGUubmFtZX0gJHtqc29uRWxlbWVudFZhcn0gJHtwYXRofWA7XG4gICAgY2FzZSBKc29uUHJpbWl0aXZlVHlwZTpcbiAgICAgIGlmIChtYXliZU51bGwpIHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICAke2pzb25FbGVtZW50VmFyfVxuICAgICAgICAgICAgYFxuICAgICAgICAgIC5yZXBsYWNlKC9cXG4gezE2fS9ndSwgXCJcXG5cIilcbiAgICAgICAgICAudHJpbSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYCR7dGFyZ2V0VmFyfSA8LSAke2pzb25FbGVtZW50VmFyfWA7XG5cbiAgICBjYXNlIERhdGVUaW1lUHJpbWl0aXZlVHlwZToge1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICBkZWNvZGVEYXRlVGltZSAke2pzb25FbGVtZW50VmFyfSAke3BhdGh9XG4gICAgICAgICAgICBgXG4gICAgICAgIC5yZXBsYWNlKC9cXG4gezE2fS9ndSwgXCJcXG5cIilcbiAgICAgICAgLnRyaW0oKTtcbiAgICB9XG5cbiAgICBjYXNlIERhdGVQcmltaXRpdmVUeXBlOiB7XG4gICAgICByZXR1cm4gYFxuICAgICAgICAgICAgICAgIGRlY29kZURhdGUgJHtqc29uRWxlbWVudFZhcn0gJHtwYXRofVxuICAgICAgICAgICAgYFxuICAgICAgICAucmVwbGFjZSgvXFxuIHsxNn0vZ3UsIFwiXFxuXCIpXG4gICAgICAgIC50cmltKCk7XG4gICAgfVxuXG4gICAgY2FzZSBBcnJheVR5cGU6IHtcbiAgICAgIHJldHVybiBgXG4gICAgICAgICAgICAgICAgbWF0Y2ggJHtqc29uRWxlbWVudFZhcn0uVmFsdWVLaW5kIHdpdGhcbiAgICAgICAgICAgICAgICAgIHwgSnNvblZhbHVlS2luZC5BcnJheSAtPlxuICAgICAgICAgICAgICAgICAgICBsZXQgbXV0YWJsZSBsaXN0XyA9IExpc3QuZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgZm9yIGkxIGluIDAgLi4gKCR7anNvbkVsZW1lbnRWYXJ9LkdldEFycmF5TGVuZ3RoKCkgLSAxKSBkb1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gJHtqc29uRWxlbWVudFZhcn0uW2kxXVxuICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJ0aWFsUmVzdWx0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICR7ZGVjb2RlVHlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgYXMgQXJyYXlUeXBlKS5iYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtqc29uRWxlbWVudFZhcn0uW2kxXWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhdGguc2xpY2UoMCwgLTEpfS57aTF9XCJgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRWYXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICApLnJlcGxhY2UoL1xcbi9ndSwgXCJcXG4gICAgICAgICAgICAgICAgICAgICAgXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIGxpc3RfIDwtIGxpc3RfIHw+IExpc3QuYXBwZW5kIFsgcGFydGlhbFJlc3VsdCBdXG4gICAgICAgICAgICAgICAgICAgIGxpc3RfXG4gICAgICAgICAgICAgICAgICB8IF8gLT4gcmFpc2UgKEZhdGFsRXhjZXB0aW9uKCR7cGF0aC5zbGljZSgwLCAtMSl9IG11c3QgYmUgYW4gYXJyYXkuXCIpKVxuICAgICAgICAgICAgYFxuICAgICAgICAucmVwbGFjZSgvXFxuIHsxNn0vZ3UsIFwiXFxuXCIpXG4gICAgICAgIC50cmltKCk7XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQlVHOiBkZWNvZGVUeXBlIHdpdGggJHt0eXBlLmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVR5cGUodHlwZTogVHlwZSwgdmFsdWVWYXI6IHN0cmluZywgcGF0aDogc3RyaW5nLCBzdWZmaXggPSAxLCBpc1JlZiA9IHRydWUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHR5cGUuY29uc3RydWN0b3IpIHtcbiAgICBjYXNlIFN0cmluZ1ByaW1pdGl2ZVR5cGU6IHtcbiAgICAgIHJldHVybiBgcmVzdWx0V3JpdGVyXy5Xcml0ZVN0cmluZ1ZhbHVlKCR7dmFsdWVWYXJ9KWA7XG4gICAgfVxuXG4gICAgY2FzZSBGbG9hdFByaW1pdGl2ZVR5cGU6XG4gICAgY2FzZSBVSW50UHJpbWl0aXZlVHlwZTpcbiAgICBjYXNlIEludFByaW1pdGl2ZVR5cGU6IHtcbiAgICAgIHJldHVybiBgcmVzdWx0V3JpdGVyXy5Xcml0ZU51bWJlclZhbHVlKCR7dmFsdWVWYXJ9KWA7XG4gICAgfVxuXG4gICAgY2FzZSBNb25leVByaW1pdGl2ZVR5cGU6IHtcbiAgICAgIHJldHVybiBgcmVzdWx0V3JpdGVyXy5Xcml0ZU51bWJlclZhbHVlKGludCAoTWF0aC5Sb3VuZCgke3ZhbHVlVmFyfSAqIDEwMG0pKSlgO1xuICAgIH1cblxuICAgIGNhc2UgQmlnSW50UHJpbWl0aXZlVHlwZToge1xuICAgICAgcmV0dXJuIGByZXN1bHRXcml0ZXJfLldyaXRlU3RyaW5nVmFsdWUoJHt2YWx1ZVZhcn0uVG9TdHJpbmcoKSlgO1xuICAgIH1cblxuICAgIGNhc2UgQm9vbFByaW1pdGl2ZVR5cGU6IHtcbiAgICAgIHJldHVybiBgcmVzdWx0V3JpdGVyXy5Xcml0ZUJvb2xlYW5WYWx1ZSgke3ZhbHVlVmFyfSlgO1xuICAgIH1cblxuICAgIGNhc2UgQnl0ZXNQcmltaXRpdmVUeXBlOiB7XG4gICAgICByZXR1cm4gYHJlc3VsdFdyaXRlcl8uV3JpdGVTdHJpbmdWYWx1ZShDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKCR7dmFsdWVWYXJ9KSlgO1xuICAgIH1cblxuICAgIGNhc2UgRGF0ZVRpbWVQcmltaXRpdmVUeXBlOiB7XG4gICAgICByZXR1cm4gYHJlc3VsdFdyaXRlcl8uV3JpdGVTdHJpbmdWYWx1ZSgke3ZhbHVlVmFyfS5Ub1N0cmluZyhcInl5eXktTU0tZGRUSEg6bW06c3MuRkZGRkZGJ1onXCIpKWA7XG4gICAgfVxuXG4gICAgY2FzZSBEYXRlUHJpbWl0aXZlVHlwZToge1xuICAgICAgcmV0dXJuIGByZXN1bHRXcml0ZXJfLldyaXRlU3RyaW5nVmFsdWUoJHt2YWx1ZVZhcn0uVG9TdHJpbmcoXCJ5eXl5LU1NLWRkXCIpKWA7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogZm9ybWF0IHRob3NlXG4gICAgY2FzZSBDcGZQcmltaXRpdmVUeXBlOlxuICAgIGNhc2UgQ25walByaW1pdGl2ZVR5cGU6XG4gICAgY2FzZSBFbWFpbFByaW1pdGl2ZVR5cGU6XG4gICAgY2FzZSBIdG1sUHJpbWl0aXZlVHlwZTpcbiAgICBjYXNlIFVybFByaW1pdGl2ZVR5cGU6XG4gICAgY2FzZSBVdWlkUHJpbWl0aXZlVHlwZTpcbiAgICBjYXNlIEJhc2U2NFByaW1pdGl2ZVR5cGU6XG4gICAgY2FzZSBIZXhQcmltaXRpdmVUeXBlOlxuICAgIGNhc2UgWG1sUHJpbWl0aXZlVHlwZToge1xuICAgICAgcmV0dXJuIGByZXN1bHRXcml0ZXJfLldyaXRlU3RyaW5nVmFsdWUoJHt2YWx1ZVZhcn0pYDtcbiAgICB9XG5cbiAgICBjYXNlIE9wdGlvbmFsVHlwZToge1xuICAgICAgbGV0IHJlYWxCYXNlVHlwZSA9ICh0eXBlIGFzIE9wdGlvbmFsVHlwZSkuYmFzZTtcblxuICAgICAgd2hpbGUgKHJlYWxCYXNlVHlwZSBpbnN0YW5jZW9mIFR5cGVSZWZlcmVuY2UpIHtcbiAgICAgICAgcmVhbEJhc2VUeXBlID0gcmVhbEJhc2VUeXBlLnR5cGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBgXG4gICAgICAgICAgICAgIGlmICgke3ZhbHVlVmFyfS5Jc05vbmUpIHRoZW5cbiAgICAgICAgICAgICAgICByZXN1bHRXcml0ZXJfLldyaXRlTnVsbFZhbHVlKClcbiAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICR7ZW5jb2RlVHlwZShyZWFsQmFzZVR5cGUsIGAke3ZhbHVlVmFyfS5WYWx1ZWAsIHBhdGgsIHN1ZmZpeCwgaXNSZWYpfVxuICAgICAgICAgICAgICBgXG4gICAgICAgIC5yZXBsYWNlKC9cXG4gezE0fS9ndSwgXCJcXG5cIilcbiAgICAgICAgLnRyaW0oKTtcbiAgICB9XG5cbiAgICBjYXNlIFR5cGVSZWZlcmVuY2U6XG4gICAgICByZXR1cm4gZW5jb2RlVHlwZSgodHlwZSBhcyBUeXBlUmVmZXJlbmNlKS50eXBlLCB2YWx1ZVZhciwgcGF0aCwgc3VmZml4LCBpc1JlZik7XG4gICAgY2FzZSBFbnVtVHlwZTpcbiAgICAgIHJldHVybiBgRW5jb2RlJHt0eXBlLm5hbWV9ICR7dmFsdWVWYXJ9IHJlc3VsdFdyaXRlcl8gJHtwYXRofWA7XG4gICAgY2FzZSBTdHJ1Y3RUeXBlOlxuICAgICAgcmV0dXJuIGBFbmNvZGUke3R5cGUubmFtZX0gJHt2YWx1ZVZhcn0gcmVzdWx0V3JpdGVyXyAke3BhdGh9YDtcbiAgICBjYXNlIEpzb25QcmltaXRpdmVUeXBlOlxuICAgICAgcmV0dXJuIGAke3ZhbHVlVmFyfS5Xcml0ZVRvKHJlc3VsdFdyaXRlcl8pYDtcbiAgICBjYXNlIEFycmF5VHlwZToge1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgcmVzdWx0V3JpdGVyXy5Xcml0ZVN0YXJ0QXJyYXkoKVxuICAgICAgICAgICAgICBmb3IgaSR7c3VmZml4fSBpbiAwLi4ke3ZhbHVlVmFyfS5MZW5ndGggLSAxIGRvXG4gICAgICAgICAgICAgICAgJHtlbmNvZGVUeXBlKCh0eXBlIGFzIEFycmF5VHlwZSkuYmFzZSwgYCR7dmFsdWVWYXJ9LltpJHtzdWZmaXh9XWAsIGAke3BhdGh9YCwgc3VmZml4ICsgMSkucmVwbGFjZSgvXFxuL2d1LCBcIlxcbiAgICAgICAgICAgICAgICBcIil9XG4gICAgICAgICAgICAgIHJlc3VsdFdyaXRlcl8uV3JpdGVFbmRBcnJheSgpXG4gICAgICAgICAgICAgIGBcbiAgICAgICAgLnJlcGxhY2UoL1xcbiB7MTR9L2d1LCBcIlxcblwiKVxuICAgICAgICAudHJpbSgpO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEJVRzogZW5jb2RlVHlwZSB3aXRoICR7dHlwZS5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVN0cnVjdChzdHJ1Y3Q6IFN0cnVjdFR5cGUpOiBzdHJpbmcge1xuICByZXR1cm4gYFxudHlwZSAke3N0cnVjdC5uYW1lfSA9IHtcbiAgJHtzdHJ1Y3QuZmllbGRzLm1hcChmaWVsZCA9PiBgJHtjYXBpdGFsaXplKGZpZWxkLm5hbWUpfTogJHtnZW5lcmF0ZVR5cGVOYW1lKGZpZWxkLnR5cGUpfWApLmpvaW4oXCI7XFxuICBcIil9XG59IHdpdGhcbiAgc3RhdGljIG1lbWJlciBDcmVhdGUgKCR7c3RydWN0LmZpZWxkcy5tYXAoZmllbGQgPT4gYCR7aWRlbnQoZmllbGQubmFtZSl9OiAke2dlbmVyYXRlVHlwZU5hbWUoZmllbGQudHlwZSl9YCkuam9pbihcIiwgXCIpfSk6ICR7c3RydWN0Lm5hbWV9ID1cbiAgICB7ICR7c3RydWN0LmZpZWxkcy5tYXAoZmllbGQgPT4gYCR7Y2FwaXRhbGl6ZShmaWVsZC5uYW1lKX0gPSAke2lkZW50KGZpZWxkLm5hbWUpfWApLmpvaW4oXCI7IFwiKX0gfVxuXG5sZXQgRGVjb2RlJHtzdHJ1Y3QubmFtZX0gKGpzb25fOiBKc29uRWxlbWVudCkgKHBhdGhfOiBzdHJpbmcpOiAke3N0cnVjdC5uYW1lfSA9XG4gIGlmIChqc29uXy5WYWx1ZUtpbmQgPD4gSnNvblZhbHVlS2luZC5PYmplY3QpIHRoZW4gcmFpc2UgKEZhdGFsRXhjZXB0aW9uKCRcIid7cGF0aF99JyBtdXN0IGJlIGFuIG9iamVjdC5cIikpXG4gICR7c3RydWN0LmZpZWxkc1xuICAgIC5tYXAoXG4gICAgICBmaWVsZCA9PlxuICAgICAgICBgXG4gIGxldCAke2ZpZWxkLm5hbWV9SnNvbl8gPSBkZWNvZGVKc29uRWxlbWVudFN0cmljdCAke0pTT04uc3RyaW5naWZ5KGZpZWxkLm5hbWUpfSBqc29uXyAkXCJ7cGF0aF99LiR7ZmllbGQubmFtZX1cIlxuICBsZXQgJHtpZGVudChmaWVsZC5uYW1lKX0gPVxuICAgICR7ZGVjb2RlVHlwZShmaWVsZC50eXBlLCBgJHtmaWVsZC5uYW1lfUpzb25fYCwgYCRcIntwYXRoX30uJHtmaWVsZC5uYW1lfVwiYCwgaWRlbnQoZmllbGQubmFtZSkpLnJlcGxhY2UoL1xcbi9ndSwgXCJcXG4gIFwiKX1cbiAgYCxcbiAgICApXG4gICAgLmpvaW4oXCJcIil9XG4gIHsgJHtzdHJ1Y3QuZmllbGRzLm1hcChmaWVsZCA9PiBgJHtjYXBpdGFsaXplKGZpZWxkLm5hbWUpfSA9ICR7aWRlbnQoZmllbGQubmFtZSl9YCkuam9pbihcIjsgXCIpfSB9XG5cbmxldCBFbmNvZGUke3N0cnVjdC5uYW1lfSAob2JqXzogJHtzdHJ1Y3QubmFtZX0pIChyZXN1bHRXcml0ZXJfOiBVdGY4SnNvbldyaXRlcikgKHBhdGhfOiBzdHJpbmcpID1cbiAgcmVzdWx0V3JpdGVyXy5Xcml0ZVN0YXJ0T2JqZWN0KClcbiAgJHtzdHJ1Y3QuZmllbGRzXG4gICAgLm1hcChcbiAgICAgIGZpZWxkID0+XG4gICAgICAgIGBcbiAgcmVzdWx0V3JpdGVyXy5Xcml0ZVByb3BlcnR5TmFtZSgke0pTT04uc3RyaW5naWZ5KGZpZWxkLm5hbWUpfSlcbiAgJHtlbmNvZGVUeXBlKGZpZWxkLnR5cGUsIGBvYmpfLiR7Y2FwaXRhbGl6ZShmaWVsZC5uYW1lKX1gLCBgJFwie3BhdGhffS4ke2ZpZWxkLm5hbWV9XCJgKS5yZXBsYWNlKC9cXG4vZ3UsIFwiXFxuICBcIil9YCxcbiAgICApXG4gICAgLmpvaW4oXCJcXG5cIil9XG4gIHJlc3VsdFdyaXRlcl8uV3JpdGVFbmRPYmplY3QoKWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUVudW0odHlwZTogRW51bVR5cGUpOiBzdHJpbmcge1xuICByZXR1cm4gYFxudHlwZSAke3R5cGUubmFtZX0gPVxuICAke3R5cGUudmFsdWVzLm1hcCgoeyB2YWx1ZSB9KSA9PiBgfCAke2NhcGl0YWxpemUodmFsdWUpfWApLmpvaW4oXCJcXG4gIFwiKX1cblxubGV0IERlY29kZSR7dHlwZS5uYW1lfSAoanNvbl86IEpzb25FbGVtZW50KSAocGF0aF86IHN0cmluZyk6ICR7dHlwZS5uYW1lfSA9XG4gIGlmIChqc29uXy5WYWx1ZUtpbmQgPD4gSnNvblZhbHVlS2luZC5TdHJpbmcpIHRoZW4gcmFpc2UgKEZhdGFsRXhjZXB0aW9uKCRcIid7cGF0aF99JyBtdXN0IGJlIGEgc3RyaW5nLlwiKSlcbiAgbWF0Y2gganNvbl8uR2V0U3RyaW5nKCkgd2l0aFxuICAke3R5cGUudmFsdWVzLm1hcCgoeyB2YWx1ZSB9KSA9PiBgfCBcIiR7dmFsdWV9XCIgLT4gJHt0eXBlLm5hbWV9LiR7Y2FwaXRhbGl6ZSh2YWx1ZSl9YCkuam9pbihcIlxcbiAgXCIpfVxuICB8IF8gLT4gcmFpc2UgKEZhdGFsRXhjZXB0aW9uKCRcIid7cGF0aF99JyBtdXN0IGJlIG9uZSBvZjogKCR7dHlwZS52YWx1ZXMubWFwKCh7IHZhbHVlIH0pID0+IGAnJHt2YWx1ZX0nYCkuam9pbihcIiwgXCIpfSkuXCIpKVxuXG5sZXQgRW5jb2RlJHt0eXBlLm5hbWV9IChvYmpfOiAke3R5cGUubmFtZX0pIChyZXN1bHRXcml0ZXJfOiBVdGY4SnNvbldyaXRlcikgKHBhdGhfOiBzdHJpbmcpID1cbiAgbWF0Y2ggb2JqXyB3aXRoXG4gICR7dHlwZS52YWx1ZXMubWFwKCh7IHZhbHVlIH0pID0+IGB8ICR7dHlwZS5uYW1lfS4ke2NhcGl0YWxpemUodmFsdWUpfSAtPiByZXN1bHRXcml0ZXJfLldyaXRlU3RyaW5nVmFsdWUoXCIke3ZhbHVlfVwiKWApLmpvaW4oXCJcXG4gIFwiKX1cblxuYDtcbn1cbiJdfQ==
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./fsharp-server.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2ZzaGFycC1zZXJ2ZXIuanNcIjtcbiJdfQ==