protected override JSBSchema BuildJsonSchema()
        {
            List <IJSBPart> nProps = new List <IJSBPart>();

            nProps.Add(new JSBString("NodeKey", "NodeKey of the node", maxLength: 100));
            nProps.Add(new JSBString("Description", "Description of the node to make it more readable and understandable"));
            nProps.Add(new JSBString("BehaviorKey", "Key of the behavior to use for lookup", maxLength: 100));
            nProps.Add(new JSBString("BehaviorVersion", "Version of the behavior"));
            nProps.Add(new JSBString("BehaviorConfiguration", "Configuration of the instance of behavior"));
            nProps.Add(new JSBString("DataJsonSchemaModuleKey", "ModuleKey for looking up jsonschema for data", maxLength: 100));
            nProps.Add(new JSBString("DataJsonSchemaKey", "Key for looking up jsonschema for data", maxLength: 100));

            List <IJSBPart> eProps = new List <IJSBPart>();

            eProps.Add(new JSBString("Description", "Description of the edge"));
            eProps.Add(new JSBString("FromNodeKey", "The nodekey of the node that the edge comes from", maxLength: 100, isRequired: true));
            eProps.Add(new JSBString("ToNodeKey", "The nodekey of the node that the edge goes to", maxLength: 100, isRequired: true));

            List <IJSBPart> wfProps = new List <IJSBPart>();

            wfProps.Add(new JSBString("Name", "The version number of the workflow", maxLength: 100, isRequired: true));
            wfProps.Add(new JSBString("Version", "The version number of the workflow", isRequired: true));
            wfProps.Add(new JSBArray("Nodes", "Nodes of the workflow", items: new List <IJSBPart>()
            {
                new JSBObject("Node", "Definition of an node", nProps)
            }, isRequired: true));
            wfProps.Add(new JSBArray("Edges", "Edges of the workflow", items: new List <IJSBPart>()
            {
                new JSBObject("Edge", "Definition of an edge", eProps)
            }, isRequired: true));
            JSBObject objectPart = new JSBObject("WorkflowDefinition", "The easy definition of the schema of a workflow", props: wfProps);

            return(new JSBSchema("WorkflowDefinition", Description, topPart: objectPart));
        }
Beispiel #2
0
        /// <summary>
        /// Generate code from JsonSchemaBuilderSchema
        /// </summary>
        /// <param name="schema"></param>
        /// <returns></returns>
        private string GenerateCode(JSBSchema schema)
        {
            CodeBuilder codeBuilder = new CodeBuilder();

            _rootSchema = schema;
            GenerateStartOfSchema(codeBuilder, schema);
            if (schema.TopPart != null)
            {
                if (schema.TopPart.PartType == JSBPartType.Object)
                {
                    GenerateCodeForBuilderPart(codeBuilder, schema.TopPart.Name, schema.TopPart, schema.Definitions);
                }
                else
                {
                    List <IJSBPart> properties = new List <IJSBPart>();
                    properties.Add(schema.TopPart);

                    JSBObject encasingObject = new JSBObject(schema.Name, schema.Description, props: properties);
                    GenerateCodeForBuilderPart(codeBuilder, schema.Name, encasingObject, schema.Definitions);
                }
            }
            else
            {
                List <IJSBPart> properties     = new List <IJSBPart>();
                JSBObject       encasingObject = new JSBObject(schema.Name, schema.Description, props: properties);
                GenerateCodeForBuilderPart(codeBuilder, schema.Name, encasingObject, schema.Definitions);
            }
            GenerateEndOfSchema(codeBuilder, schema);
            return(codeBuilder.Build());
        }
        protected override JSBSchema BuildJsonSchema()
        {
            List <IJSBPart> tProps = new List <IJSBPart>();

            tProps.Add(new JSBString("Key", "Lookup key for language", isRequired: true));
            tProps.Add(new JSBString("Language", "Returns the language"));
            JSBObject objectPart = new JSBObject("LanguageDefinition", Description, props: tProps);

            return(new JSBSchema("LanguageDefinition", Description, topPart: objectPart));
        }
        public void BuildObject()
        {
            List <IJSBPart> properties   = new List <IJSBPart>();
            string          objectName   = "ObjectName";
            string          description  = "ObjectDescription";
            bool            isRequired   = false;
            bool            isExpandable = false;

            var        varObject = new JSBObject(objectName, description, properties, isRequired: isRequired, isExpandable: isExpandable);
            JsonSchema varSchema = varObject.AsJsonSchema();
        }
        protected override JSBSchema BuildJsonSchema()
        {
            List <IJSBPart> wfProps = new List <IJSBPart>();

            wfProps.Add(new JSBString("Name", "Returns the Module unique name", maxLength: 100, isRequired: true));
            wfProps.Add(new JSBString("Version", "Returns the version of the Module", isRequired: true));
            wfProps.Add(new JSBArray("WorkflowDefinitions", "Returns the embedded workflow definitions", items: new List <IJSBPart>()
            {
                new JSBRef("WorkflowDefinition", "Definition of an workflow", iriReference: new Uri("./WorkflowDefinition.schema.json", UriKind.Relative))
            }, isRequired: true));
            JSBObject objectPart = new JSBObject("ModuleDefinition", "The easy definition of the schema of a module", props: wfProps);

            return(new JSBSchema("ModuleDefinition", Description, topPart: objectPart));
        }
        protected override JSBSchema BuildJsonSchema()
        {
            JSBBoolean booleanPart = new JSBBoolean("BooleanPart", "BooleanPart for testing", isRequired: true);
            JSBInteger integerPart = new JSBInteger("IntegerPart", "IntegerPart for testing");

            List <IJSBPart> properties = new List <IJSBPart>();

            properties.Add(booleanPart);
            properties.Add(integerPart);

            JSBObject objectPart = new JSBObject("MyTopPartObject", "TopPart", props: properties);

            return(new JSBSchema("ObjectAsATopPart", Description, topPart: objectPart));
        }
        protected override JSBSchema BuildJsonSchema()
        {
            JSBBoolean booleanPart = new JSBBoolean("BooleanPart", "BooleanPart for testing", isRequired: true);
            JSBInteger integerPart = new JSBInteger("IntegerPart", "IntegerPart for testing");

            List <IJSBPart> properties = new List <IJSBPart>();

            properties.Add(booleanPart);
            properties.Add(integerPart);

            JSBObject objectPart = new JSBObject("ObjectInAnArray", "ObjectInAnArray is fun", props: properties);

            List <IJSBPart> items = new List <IJSBPart>();

            items.Add(objectPart);
            JSBArray arrayPart = new JSBArray("MyTopPartArray", "TopPart", items);

            return(new JSBSchema("ArrayOfObjectsAsATopPart", Description, topPart: arrayPart));
        }
        protected override JSBSchema BuildJsonSchema()
        {
            List <IJSBPart> definitions = new List <IJSBPart>();

            definitions.Add(new JSBString("FtpType", "Type of FTP", enums: new List <string>()
            {
                "Auto", "FTP", "FTPS"
            }));
            List <IJSBPart> properties = new List <IJSBPart>();

            properties.Add(new JSBString("SourceFileName", "File to move or copy", isRequired: true));
            properties.Add(new JSBString("SourceDirectory", "Location of the file to move or copy", isRequired: true));
            properties.Add(new JSBString("DestinationFileName", "File after move or copy. If filled out a rename will be done under the move or copy operation"));
            properties.Add(new JSBString("DestinationDirectory", "Location of the file should end after move or copy", isRequired: true));
            properties.Add(new JSBString("FtpUser", "User registered on the server", isRequired: true));
            properties.Add(new JSBString("FtpPassword", "Password for the user registered on the server", isRequired: true));
            properties.Add(new JSBString("FtpServer", "Ftp host server", isRequired: true));
            properties.Add(new JSBString("FtpFolderOnServer", "Ftp folder on server if needed"));
            properties.Add(new JSBRef("FtpType", "Type of FTP", iriReference: new Uri("#/definitions/ftpType", UriKind.Relative), isRequired: true));

            JSBObject jsonObject = new JSBObject("FtpInformation", "Data For Copy and Move file operations on FTP", props: properties);

            return(new JSBSchema("FtpInformation", Description, topPart: jsonObject, defs: definitions));
        }
Beispiel #9
0
        private void DoReferenceResolution(IJSBPart jsonSchemaBuilderPart, NamespaceString module)
        {
            switch (jsonSchemaBuilderPart.PartType)
            {
            case JSBPartType.IriReference:
                JSBRef jsonSchemaBuilderIriReference = jsonSchemaBuilderPart as JSBRef;
                if (!jsonSchemaBuilderIriReference.IsFragmentOnly)
                {
                    string relativeLocalFileWithExpandedDot = jsonSchemaBuilderIriReference.RelativeLocalFile;
                    if (relativeLocalFileWithExpandedDot.StartsWith("./") || relativeLocalFileWithExpandedDot.StartsWith(".\\"))
                    {
                        relativeLocalFileWithExpandedDot = Path.Combine(module.ToFilePath, relativeLocalFileWithExpandedDot.Remove(0, 2));
                    }

                    string localFile = Path.Combine(JsonSchemaApplicationRoot, TransformToCamelCase(relativeLocalFileWithExpandedDot));
                    string uriWithoutFragmentString = jsonSchemaBuilderIriReference.IriReference.OriginalString;
                    if (!string.IsNullOrWhiteSpace(jsonSchemaBuilderIriReference.Fragment))
                    {
                        uriWithoutFragmentString = uriWithoutFragmentString.Replace("#" + jsonSchemaBuilderIriReference.Fragment, "");
                    }
                    if (Uri.TryCreate(uriWithoutFragmentString, UriKind.RelativeOrAbsolute, out Uri uriWithoutFragment))
                    {
                        if (!File.Exists(localFile))
                        {
                            if (jsonSchemaBuilderIriReference.IriReference.IsAbsoluteUri && !jsonSchemaBuilderIriReference.IriReference.IsLoopback)
                            {
                                try
                                {
                                    FileInfo fileInfo  = new FileInfo(localFile);
                                    string   directory = fileInfo.Directory.FullName;
                                    if (!Directory.Exists(directory))
                                    {
                                        Directory.CreateDirectory(directory);
                                    }
                                    using (WebClient myWebClient = new WebClient())
                                    {
                                        // Download the Web resource and save it into the current filesystem folder.
                                        myWebClient.DownloadFile(uriWithoutFragment, localFile);
                                        //TODO generate builderparts from schema and register in _registeredJsonSchemas
                                    }
                                }
                                catch (Exception ex)
                                {
                                    throw new CodeGenerationException($"Resource at {uriWithoutFragment} could not be downloaded", ex);
                                }
                            }
                            else
                            {
                                throw new CodeGenerationException($"Iri reference {uriWithoutFragment} was not found locally at {localFile}");
                            }
                        }
                    }
                }
                break;

            case JSBPartType.Schema:
                JSBSchema jsonSchemaBuilderSchema = jsonSchemaBuilderPart as JSBSchema;
                foreach (IJSBPart definition in jsonSchemaBuilderSchema.Definitions.Values)
                {
                    DoReferenceResolution(definition, module);
                }
                if (jsonSchemaBuilderSchema.TopPart != null)
                {
                    DoReferenceResolution(jsonSchemaBuilderSchema.TopPart, module);
                }
                break;

            case JSBPartType.Array:
                JSBArray jsonSchemaBuilderArray = jsonSchemaBuilderPart as JSBArray;
                foreach (IJSBPart part in jsonSchemaBuilderArray.Items)
                {
                    DoReferenceResolution(part, module);
                }
                break;

            case JSBPartType.Object:
                JSBObject jsonSchemaBuilderObject = jsonSchemaBuilderPart as JSBObject;
                foreach (IJSBPart property in jsonSchemaBuilderObject.Properties.Values)
                {
                    DoReferenceResolution(property, module);
                }
                break;

            default:
                break;
            }
        }
Beispiel #10
0
        private void GenerateOrdinaryObject(CodeBuilder codeBuilder, IdentifierString key, JSBObject jsonSchemaBuilderObject, Dictionary <string, IJSBPart> definitions, bool parentIsArray, bool isDefinition = false)
        {
            GenerateComments(codeBuilder, key, jsonSchemaBuilderObject);

            codeBuilder
            .L($"public partial class {TransformToTitleCase(key)}")
            .L("{")
            .IndentIncrease();

            //Add definitions
            if (definitions != null)
            {
                foreach (KeyValuePair <string, IJSBPart> pair in definitions)
                {
                    GenerateCodeForBuilderPart(codeBuilder, pair.Key, pair.Value, isDefinition: true);
                    codeBuilder.EmptyLine();
                }
            }

            //TODO Add own code

            //Add children
            foreach (KeyValuePair <IdentifierString, IJSBPart> pair in jsonSchemaBuilderObject.Properties)
            {
                GenerateCodeForBuilderPart(codeBuilder, pair.Key, pair.Value);
                codeBuilder.EmptyLine();
            }

            codeBuilder
            .IndentDecrease()
            .L("}");


            if (definitions == null && !parentIsArray)// Assume not top part
            {
                codeBuilder
                .L($"[JsonProperty(\"{TransformToCamelCase(key)}\")]")
                .L($"public {TransformToTitleCase(key)} {TransformToTitleCase(key)}Prop {{ get; set; }} ")
                .EmptyLine();
            }
        }
Beispiel #11
0
 private void GenerateEnumObject(CodeBuilder codeBuilder, IdentifierString key, JSBObject jsonSchemaBuilderObject, Dictionary <string, IJSBPart> definitions)
 {
     throw new NotImplementedException("Enum on objects has not been implemented");
 }
Beispiel #12
0
        private void GenerateCodeForBuilderPart(CodeBuilder codeBuilder, IdentifierString key, IJSBPart value, Dictionary <string, IJSBPart> definitions = null, bool parentIsArray = false, bool isDefinition = false)
        {
            switch (value.PartType)
            {
            case JSBPartType.Array:
                JSBArray jsonSchemaBuilderArray = value as JSBArray;
                if (jsonSchemaBuilderArray.Enums != null && jsonSchemaBuilderArray.Enums.Count > 0)
                {
                    GenerateEnumArray(codeBuilder, key, jsonSchemaBuilderArray);
                }
                else
                {
                    GenerateOrdinaryArray(codeBuilder, key, jsonSchemaBuilderArray);
                }
                break;

            case JSBPartType.Boolean:
                JSBBoolean jsonSchemaBuilderBoolean = value as JSBBoolean;
                if (jsonSchemaBuilderBoolean.Enums != null && jsonSchemaBuilderBoolean.Enums.Count > 0)
                {
                    GenerateEnumBoolean(codeBuilder, key, jsonSchemaBuilderBoolean);
                }
                else
                {
                    if (!parentIsArray)
                    {
                        GenerateOrdinaryBoolaen(codeBuilder, key, jsonSchemaBuilderBoolean);
                    }
                }
                break;

            case JSBPartType.Date:
                JSBDate jsonSchemaBuilderDate = value as JSBDate;
                if (jsonSchemaBuilderDate.Enums != null && jsonSchemaBuilderDate.Enums.Count > 0)
                {
                    GenerateEnumDate(codeBuilder, key, jsonSchemaBuilderDate);
                }
                else
                {
                    if (!parentIsArray)
                    {
                        GenerateOrdinaryDate(codeBuilder, key, jsonSchemaBuilderDate);
                    }
                }
                break;

            case JSBPartType.DateTime:
                JSBDateTime jsonSchemaBuilderDateTime = value as JSBDateTime;
                if (jsonSchemaBuilderDateTime.Enums != null && jsonSchemaBuilderDateTime.Enums.Count > 0)
                {
                    GenerateEnumDateTime(codeBuilder, key, jsonSchemaBuilderDateTime);
                }
                else
                {
                    if (!parentIsArray)
                    {
                        GenerateOrdinaryDateTime(codeBuilder, key, jsonSchemaBuilderDateTime);
                    }
                }
                break;

            case JSBPartType.Email:
                JSBEmail jsonSchemaBuilderEmail = value as JSBEmail;
                if (jsonSchemaBuilderEmail.Enums != null && jsonSchemaBuilderEmail.Enums.Count > 0)
                {
                    GenerateEnumEmail(codeBuilder, key, jsonSchemaBuilderEmail);
                }
                else
                {
                    GenerateOrdinaryEmail(codeBuilder, key, jsonSchemaBuilderEmail);
                }
                break;

            case JSBPartType.Integer:
                JSBInteger jsonSchemaBuilderInteger = value as JSBInteger;
                if (jsonSchemaBuilderInteger.Enums != null && jsonSchemaBuilderInteger.Enums.Count > 0)
                {
                    GenerateEnumInteger(codeBuilder, key, jsonSchemaBuilderInteger);
                }
                else
                {
                    if (!parentIsArray)
                    {
                        GenerateOrdinaryInteger(codeBuilder, key, jsonSchemaBuilderInteger);
                    }
                }
                break;

            case JSBPartType.Number:
                JSBNumber jsonSchemaBuilderNumber = value as JSBNumber;
                if (jsonSchemaBuilderNumber.Enums != null && jsonSchemaBuilderNumber.Enums.Count > 0)
                {
                    GenerateEnumNumber(codeBuilder, key, jsonSchemaBuilderNumber);
                }
                else
                {
                    if (!parentIsArray)
                    {
                        GenerateOrdinaryNumber(codeBuilder, key, jsonSchemaBuilderNumber);
                    }
                }
                break;

            case JSBPartType.Object:
                JSBObject jsonSchemaBuilderObject = value as JSBObject;
                if (jsonSchemaBuilderObject.Enums != null && jsonSchemaBuilderObject.Enums.Count > 0)
                {
                    GenerateEnumObject(codeBuilder, key, jsonSchemaBuilderObject, definitions);
                }
                else
                {
                    GenerateOrdinaryObject(codeBuilder, key, jsonSchemaBuilderObject, definitions, parentIsArray);
                }
                break;

            case JSBPartType.String:
                JSBString jsonSchemaBuilderString = value as JSBString;
                if (jsonSchemaBuilderString.Enums != null && jsonSchemaBuilderString.Enums.Count > 0)
                {
                    GenerateEnumString(codeBuilder, key, jsonSchemaBuilderString, isDefinition);
                }
                else
                {
                    GenerateOrdinaryString(codeBuilder, key, jsonSchemaBuilderString);
                }
                break;

            case JSBPartType.Time:
                JSBTime jsonSchemaBuilderTime = value as JSBTime;
                if (jsonSchemaBuilderTime.Enums != null && jsonSchemaBuilderTime.Enums.Count > 0)
                {
                    GenerateEnumTime(codeBuilder, key, jsonSchemaBuilderTime);
                }
                else
                {
                    GenerateOrdinaryTime(codeBuilder, key, jsonSchemaBuilderTime);
                }
                break;

            case JSBPartType.IriReference:
                //Reference cannot be an enum
                if (!parentIsArray)
                {
                    JSBRef jsonSchemaBuilderUriReference = value as JSBRef;
                    GenerateOrdinaryUriReference(codeBuilder, key, jsonSchemaBuilderUriReference);
                }
                break;

            default:
                codeBuilder.L($"throw new NotImplementedException(\"PartType {value.PartType} is not implemented\");");
                break;
            }
        }
        public string Sync()
        {
            bool isUpdate = false;

            if (Request.Parameters.ContainsKey("update"))
            {
                bool.TryParse(Request.Parameters["update"], out isUpdate);
            }


            if ((Authenticated && !GeneratedSyncAuthorized.ContainsKey(AuthenticationLevel)) || (!Authenticated && string.IsNullOrEmpty(GeneratedSync)))
            {
                JSBObject jsControllers = new JSBObject();

                foreach (ControllerRoute tkv in GetControllers())
                {
                    string controllerPath = tkv.Path;
                    //System.Console.WriteLine(controllerPath);
                    ControllerDescriptor template = tkv.Controller;

                    JSBObject jsController = new JSBObject();

                    foreach (KeyValuePair <string, CallDescriptor> mkv in template.Calls.Where(x => !IgnoreSyncAttribute.HasAttribute(x.Value.Info)))
                    {
                        MethodInfo method = mkv.Value.Info;

                        RequiresTokenAttribute requiresVerify = RequiresTokenAttribute.GetAttribute(method);

                        if (requiresVerify == null || (requiresVerify != null && Authenticated && requiresVerify.LevelRequired <= AuthenticationLevel))
                        {
                            string typeName       = template.ControllerType.Name;
                            string controllerName = typeName.Replace("Controller", "").Replace("`1", "");


                            JSBFunction func = CreateLinkFunction(APIBaseUrl, controllerPath, method, false);

                            if (!jsController.Properties.ContainsKey(method.Name))
                            {
                                jsController.AddFunction(method.Name, func);
                            }
                        }
                    }
                    if (jsController.Properties.Any())
                    {
                        jsControllers.AddObject(template.ControllerType.Name.Replace("Controller", "").Replace("`1", ""), jsController);
                    }
                }

                JSBuilder js = new JSBuilder().AssignVariable("Sync", jsControllers);

                if (!isUpdate)
                {
                    js.DefineFunction("SyncGetJson", @"
                        var ajax = new XMLHttpRequest();
                        ajax.onreadystatechange = function () {
                            if (ajax.readyState == 4 && ajax.status == 200)
                                /*callback(JSON.parse(ajax.responseText))*/
                                callback(ResolveReferences(ajax.responseText))
                        };
                        ajax.open('GET', url, true);
                        ajax.setRequestHeader('Accept', 'application/json');
                            ajax.send();
                    ", "url", "callback")
                    .DefineFunction("SyncPostJson", @"
                        var ajax = new XMLHttpRequest();
                        ajax.onreadystatechange = function () {
                            if (ajax.readyState == 4 && ajax.status == 200) {
                                /*callback(JSON.parse(ajax.responseText))*/
                                callback(ResolveReferences(ajax.responseText))
                            }
                        };
                        ajax.open('POST', url, true);
                        ajax.send(data);
                    ", "url", "data", "callback")
                    .DefineFunction("SyncGetRaw", @"
                        var ajax = new XMLHttpRequest();
                        ajax.onreadystatechange = function () {
                            if (ajax.readyState == 4 && ajax.status == 200)
                                /*callback(JSON.parse(ajax.responseText))*/
                                callback(ajax.responseText)
                        };
                        ajax.open('GET', url, true);
                        ajax.setRequestHeader('Accept', 'application/json');
                            ajax.send();
                    ", "url", "callback")
                    .DefineFunction("SyncPostJsonRaw", @"
                        var ajax = new XMLHttpRequest();
                        ajax.onreadystatechange = function () {
                            if (ajax.readyState == 4 && ajax.status == 200) {
                                callback(ajax.responseText)
                            }
                        };
                        ajax.open('POST', url, true);
                        ajax.send(data);
                    ", "url", "data", "callback")
                    .DefineFunction("SyncPostRawRaw", @"
                        var ajax = new XMLHttpRequest();
                        ajax.onreadystatechange = function () {
                            if (ajax.readyState == 4 && ajax.status == 200) {
                                callback(ajax.responseText)
                            }
                        };
                        ajax.open('POST', url, true);
                        ajax.send(data);
                    ", "url", "data", "callback")
                    .DefineFunction("SyncPostRawJson", @"
                        var ajax = new XMLHttpRequest();
                        ajax.onreadystatechange = function () {
                            if (ajax.readyState == 4 && ajax.status == 200) {
                                callback(ResolveReferences(ajax.responseText))
                            }
                        };
                        ajax.open('POST', url, true);
                        ajax.send(data);
                    ", "url", "data", "callback")

                    .DefineFunction("ResolveReferences", @"
                        if (typeof json === 'string')
                            json = JSON.parse(json);

                        var byid = {};
                        var refs = [];
                        json = (function recurse(obj, prop, parent) {
                            if (typeof obj !== 'object' || !obj)
                                return obj;
                            if (Object.prototype.toString.call(obj) === '[object Array]') {
                                for (var i = 0; i < obj.length; i++)
                                    if (typeof obj[i] !== 'object' || !obj[i])
                                        continue;
                                    else if (""$ref "" in obj[i])
                                        obj[i] = recurse(obj[i], i, obj);
                                    else
                                        obj[i] = recurse(obj[i], prop, obj);
                                    return obj;
                                }
                                if (""$ref"" in obj) {
                                    var ref = obj.$ref;
                                    if (ref in byid)
                                    return byid[ref];
                                    refs.push([parent, prop, ref]);
                                    return;
                                } else if (""$id"" in obj) {
                                    var id = obj.$id;
                                    delete obj.$id;
                                    if (""$values"" in obj)
                                    obj = obj.$values.map(recurse);
                                else
                                    for (var prop in obj)
                                        obj[prop] = recurse(obj[prop], prop, obj);
                                    byid[id] = obj;
                                }
                                return obj;
                            })(json);

                        for (var i = 0; i<refs.length; i++) {
                            var ref = refs[i];
                            ref[0][ref[1]] = byid[ref[2]];
                        }
                        return json;", "json");
                }


                if (Authenticated)
                {
                    GeneratedSyncAuthorized.Add(AuthenticationLevel, js.BuildCode());
                }
                else
                {
                    GeneratedSync = js.BuildCode();
                }
            }

            Request.Response.ContentType = "application/javascript";

            string addition = "";

            if (Authenticated)
            {
                addition += $"Sync.Token = '{Token.UrlEncode()}';";
            }

            if (isUpdate)
            {
                return(((Authenticated) ? GeneratedSyncAuthorized[AuthenticationLevel] : GeneratedSync) + "\n" + addition);
            }
            else
            {
                return(((Authenticated) ? "var " + GeneratedSyncAuthorized[AuthenticationLevel] : "var " + GeneratedSync) + "\n" + addition);
            }
        }