diff --git a/Tesses.CrossLang.BuildEssentials/src/buildtool.tcross b/Tesses.CrossLang.BuildEssentials/src/buildtool.tcross index 48f1e82..e898ecc 100644 --- a/Tesses.CrossLang.BuildEssentials/src/buildtool.tcross +++ b/Tesses.CrossLang.BuildEssentials/src/buildtool.tcross @@ -67,7 +67,18 @@ func Tesses.CrossLang.BuildTool(pm) var objDir = "obj"; var srcDir = "src"; var resDir = "res"; + var compTime = "none"; var icon = ""; + if(TypeOf(configData.compTime) != "Undefined") + compTime = configData.compTime; + + if(compTime == "full" && !this.AllowFullCompTime) + throw { + Type="CompTimeException", + Message="Failed to build due to having insecure comptime, use --allow-insecure-comptime if using the shell when building if you trust the program.", + ToString=(this)=>$"{this.Type} on line: {this.Line} {this.Message}" + }; + if(TypeOf(configData.name) != "Undefined") name = configData.name; @@ -144,7 +155,7 @@ func Tesses.CrossLang.BuildTool(pm) { if(item.Path == dirStr) return item.Data; } - + func walk_for_compiling(item,dir2) { @@ -205,6 +216,7 @@ func Tesses.CrossLang.BuildTool(pm) walk_for_compiling(dep,dir / outputDir); } + func walk_for_source(sourceDir) { each(var file : FS.Local.EnumeratePaths(sourceDir)) @@ -229,6 +241,53 @@ func Tesses.CrossLang.BuildTool(pm) var output = $"{name}-{version}.crvm"; var outFile = FS.Local.OpenFile(dir / outputDir / output,"wb"); + + + var compTimeEnv = null; + + if(compTime != "none") + { + //dir / outputDir; + + var dict = {}; + + compTimeEnv = VM.CreateEnvironment(dict); + switch(compTime) + { + case "secure_file": + compTimeEnv.RegisterConsole(); + compTimeEnv.RegisterClass(); + compTimeEnv.RegisterCrypto(); + compTimeEnv.RegisterDictionary(); + compTimeEnv.RegisterJson(); + compTimeEnv.RegisterRoot(); + compTimeEnv.RegisterIO(false); + + dict.FS.Local = new SubdirFilesystem(FS.Local,dir); + + break; + case "full": + compTimeEnv.RegisterEverything(); + break; + default: + //secure + compTimeEnv.RegisterConsole(); + compTimeEnv.RegisterClass(); + compTimeEnv.RegisterCrypto(); + compTimeEnv.RegisterDictionary(); + compTimeEnv.RegisterJson(); + compTimeEnv.RegisterRoot(); + compTimeEnv.RegisterIO(false); + + break; + } + compTimeEnv.LockRegister(); + each(var dep : file_deps) + { + compTimeEnv.LoadFileWithDependencies(FS.Local,dir/outputDir/$"{dep.Name}-{dep.Version}.crvm"); + } + } + var result = VM.Compile({ Name = name, @@ -239,7 +298,8 @@ func Tesses.CrossLang.BuildTool(pm) Tools = file_tools, ResourceFileSystem = new SubdirFilesystem(FS.Local, dir / resDir), Dependencies = file_deps, - Output = outFile + Output = outFile, + CompTime = compTimeEnv }); outFile.Close(); diff --git a/Tesses.CrossLang.PackageServer/src/backend/db.tcross b/Tesses.CrossLang.PackageServer/src/backend/db.tcross index 4b6f91a..07ae3e9 100644 --- a/Tesses.CrossLang.PackageServer/src/backend/db.tcross +++ b/Tesses.CrossLang.PackageServer/src/backend/db.tcross @@ -49,6 +49,9 @@ func DB.LoginButton(ctx,active,$accountPage) func DB.CanUploadPackagePrefix(userId, packageName) { var prefix = packageName.Split(".",true,2); + if(prefix.Length >= 1) + prefix = prefix[0]; + else return false; DB.Lock(); var dbCon = DB.Open(); var exec = Sqlite.Exec(dbCon, $"SELECT * FROM reserved_prefixes WHERE prefix = {Sqlite.Escape(prefix)};"); @@ -158,7 +161,7 @@ func DB.UpdateVersion(pkgInfo) //CREATE TABLE IF NOT EXISTS versions (id INTEGER PRIMARY KEY AUTOINCREMENT, packageId INTEGER, version INTEGER, description TEXT, type TEXT, maintainer TEXT, homepage TEXT, repo TEXT, license TEXT); //VALUES ({pkgId},{version},{Sqlite.Escape(description)},{Sqlite.Escape(type)},{Sqlite.Escape(maintainer)},{Sqlite.Escape(homepage)},{Sqlite.Escape(repo)},{Sqlite.Escape(license)}); - Sqlite.Exec(dbCon,$"UPDATE versions SET description = {Sqlite.Escape(description)}, type = {Sqlite.Escape(type)}, maintainer = {Sqlite.Escape(maintainer)}, homepage = {Sqlite.Escape(homepage)}, repo = {Sqlite.Escape(repo)}, license = {Sqlite.Escape(license)}, uploadTime = {Time.Now} WHERE packageId = {pkgId} AND version = {version};"); + Sqlite.Exec(dbCon,$"UPDATE versions SET description = {Sqlite.Escape(description)}, type = {Sqlite.Escape(type)}, maintainer = {Sqlite.Escape(maintainer)}, homepage = {Sqlite.Escape(homepage)}, repo = {Sqlite.Escape(repo)}, license = {Sqlite.Escape(license)}, uploadTime = {DateTime.NowEpoch} WHERE packageId = {pkgId} AND version = {version};"); Sqlite.Close(dbCon); DB.Unlock(); @@ -196,7 +199,7 @@ func DB.AddVersion(pkgInfo) //CREATE TABLE IF NOT EXISTS versions (id INTEGER PRIMARY KEY AUTOINCREMENT, packageId INTEGER, version INTEGER, description TEXT, type TEXT, maintainer TEXT, homepage TEXT, repo TEXT, license TEXT); - Sqlite.Exec(dbCon,$"INSERT INTO versions (packageId,version,description,type,maintainer,homepage,repo,license,uploadTime) VALUES ({pkgId},{version},{Sqlite.Escape(description)},{Sqlite.Escape(type)},{Sqlite.Escape(maintainer)},{Sqlite.Escape(homepage)},{Sqlite.Escape(repo)},{Sqlite.Escape(license)},{Time.Now});"); + Sqlite.Exec(dbCon,$"INSERT INTO versions (packageId,version,description,type,maintainer,homepage,repo,license,uploadTime) VALUES ({pkgId},{version},{Sqlite.Escape(description)},{Sqlite.Escape(type)},{Sqlite.Escape(maintainer)},{Sqlite.Escape(homepage)},{Sqlite.Escape(repo)},{Sqlite.Escape(license)},{DateTime.NowEpoch});"); Sqlite.Close(dbCon); DB.Unlock(); @@ -294,7 +297,19 @@ func DB.GetUserIdFromSession(session) return -1; } - +func DB.GetSessionFromBearer(ctx) +{ + var auth = ctx.RequestHeaders.TryGetFirst("Authorization"); + if(TypeOf(auth) == "String") + { + auth=auth.Split(" ",true,2); + if(auth.Length < 2) return null; + if(auth[0] != "Bearer") return null; + var uid = DB.GetUserIdFromSession(auth[1]); + if(uid != -1) return auth[1]; + } + return null; +} func DB.GetSession(ctx) { var cookie = ctx.RequestHeaders.TryGetFirst("Cookie"); @@ -337,7 +352,7 @@ func DB.CreateCSRF(ctx) var csrf = Crypto.Base64Encode(Crypto.RandomBytes(32, "CPKG")); - var expires = Time.Now + 600; + var expires = DateTime.NowEpoch + 600; DB.Lock(); DB.csrf.Add({ Token = csrf, @@ -358,7 +373,7 @@ func DB.VerifyCSRF(session,csrf) if(csrf.Length == 0) return false; var retVal = false; - var time = Time.Now; + var time = DateTime.NowEpoch; DB.Lock(); var _oldCSRF = DB.csrf; DB.csrf = []; @@ -661,7 +676,6 @@ func DB.QueryPackages(q, offset, limit) DB.Lock(); var dbCon = DB.Open(); var res = Sqlite.Exec(dbCon, sql); - Sqlite.Close(dbCon); DB.Unlock(); diff --git a/Tesses.CrossLang.PackageServer/src/components/package.tcross b/Tesses.CrossLang.PackageServer/src/components/package.tcross index 22e69fa..38bb716 100644 --- a/Tesses.CrossLang.PackageServer/src/components/package.tcross +++ b/Tesses.CrossLang.PackageServer/src/components/package.tcross @@ -1,11 +1,10 @@ func Components.Package(name,version,owner,upload,desc) { - var image = $"./api/v1/package_icon.png?name={Net.Http.UrlEncode(name)}&version={Net.Http.UrlEncode(version)}"; var pkgUrl = $"./package?name={Net.Http.UrlEncode(name)}"; return
  • {"icon"} - {name} | By: {owner} + {name} | By: {owner}
    Updated: {upload} | Latest version: {version}

    {desc}

    diff --git a/Tesses.CrossLang.PackageServer/src/components/shell.tcross b/Tesses.CrossLang.PackageServer/src/components/shell.tcross index 175952a..a127f2e 100644 --- a/Tesses.CrossLang.PackageServer/src/components/shell.tcross +++ b/Tesses.CrossLang.PackageServer/src/components/shell.tcross @@ -1,16 +1,24 @@ func Shell(title,pages,body) { var shell= - + + CPKG - {title} +
    -

    diff --git a/Tesses.CrossLang.PackageServer/src/pages/account.tcross b/Tesses.CrossLang.PackageServer/src/pages/account.tcross index 2875a22..b909d1f 100644 --- a/Tesses.CrossLang.PackageServer/src/pages/account.tcross +++ b/Tesses.CrossLang.PackageServer/src/pages/account.tcross @@ -81,8 +81,7 @@ func Pages.Account(ctx)

    {user.accountName}

    - Packages - + Packages|Reserved Prefixes diff --git a/Tesses.CrossLang.PackageServer/src/pages/index.tcross b/Tesses.CrossLang.PackageServer/src/pages/index.tcross index bdd6c26..37a3fa9 100644 --- a/Tesses.CrossLang.PackageServer/src/pages/index.tcross +++ b/Tesses.CrossLang.PackageServer/src/pages/index.tcross @@ -22,6 +22,8 @@ func Pages.Index(ctx) + + API
    diff --git a/Tesses.CrossLang.PackageServer/src/pages/package.tcross b/Tesses.CrossLang.PackageServer/src/pages/package.tcross index 63036a1..cf90ce7 100644 --- a/Tesses.CrossLang.PackageServer/src/pages/package.tcross +++ b/Tesses.CrossLang.PackageServer/src/pages/package.tcross @@ -1,6 +1,7 @@ func Pages.Package(ctx,name) { var package = DB.GetPackageVersions(name); + var pages = [ { @@ -15,7 +16,34 @@ func Pages.Package(ctx,name) }, DB.LoginButton(ctx,false) ]; - + + var installCmd = ""; + if(package.Length > 0) + { + switch(package[0].type) + { + case "lib": + case "compiler_tool": + installCmd = $"crosslang add-dependency {name}"; + break; + case "console": + installCmd = $"crosslang install-console {name} --version={package[0].version}"; + break; + case "app": + installCmd = $"crosslang install-app {name} --version={package[0].version}"; + break; + case "tool": + installCmd = $"crosslang install-tool {name} --version={package[0].version}"; + break; + case "template": + installCmd = $"crosslang install-template {name} --version={package[0].version}"; + break; + default: + installCmd = "No instructions to install sorry."; + break; + } + + } var html = 0)>
    @@ -29,29 +57,33 @@ func Pages.Package(ctx,name)
  • + +
  • +
    +
    - - - crosslang add-dependency {name} - - + {installCmd}
    -
    + + +
    {Json.Encode({name=name,version = package[0].version })}
    +
    +

    More options and info

    @@ -77,7 +109,7 @@ func Pages.Package(ctx,name)
  • Repo: {package[0].repo}
  • -
  • Last updated: {package[0].uploadDate}
  • +
  • Last updated: {new DateTime(package[0].uploadTime).ToString("%Y/%m/%d %H:%M:%S UTC")}
  • Latest version: {package[0].version}
  • Type: {package[0].type}
  • Download
  • @@ -118,7 +150,7 @@ func Pages.Package(ctx,name)
  • Repo: {package[i].repo}
  • -
  • Uploaded: {package[i].uploadDate}
  • +
  • Uploaded: {new DateTime(package[i].uploadTime).ToString("%Y/%m/%d %H:%M:%S UTC")}
  • Type: {package[i].type}
  • Download
  • diff --git a/Tesses.CrossLang.PackageServer/src/pages/search.tcross b/Tesses.CrossLang.PackageServer/src/pages/search.tcross index 3fba72d..25a41cb 100644 --- a/Tesses.CrossLang.PackageServer/src/pages/search.tcross +++ b/Tesses.CrossLang.PackageServer/src/pages/search.tcross @@ -1,6 +1,8 @@ func Pages.Packages(ctx) { var q = ctx.QueryParams.TryGetFirst("q"); + var page = ParseLong(ctx.QueryParams.TryGetFirst("page")); + page = TypeOf(page) != "Long" ? 1 : page; if(TypeOf(q) != "String") q = ""; var pages = [ { @@ -34,8 +36,8 @@ func Pages.Packages(ctx) +
      - - + +
    ; return Shell("Packages",pages,html); diff --git a/Tesses.CrossLang.PackageServer/src/program.tcross b/Tesses.CrossLang.PackageServer/src/program.tcross index beecb2e..54da5aa 100644 --- a/Tesses.CrossLang.PackageServer/src/program.tcross +++ b/Tesses.CrossLang.PackageServer/src/program.tcross @@ -1,18 +1,15 @@ -var count = 0; func main(args) { - Console.WriteLine("In main"); var dir = "."; if(args.Length > 1) { - dir = args[1]; } DB.Init(dir); //should be a route but its crosslang so we can use mountable - + mountable.Mount("/package_icon.png", (ctx)=>{ ctx.ResponseHeaders.SetValue("Content-Type", "image/png"); @@ -22,7 +19,7 @@ func main(args) /* PUT /api/v1/upload Authorization Bearer - POST /api/v1/login Json object with username and password returns json object with either 200 for success {"token": "TOKEN_VAL"} or non 2XX if fails {"reason": "SOME ERROR"} + POST /api/v1/login Json object with email and password returns json object with either 200 for success {"token": "TOKEN_VAL"} or non 2XX if fails {"reason": "SOME ERROR"} POST /api/v1/logout use Authorization Bearer GET /api/v1/latest?name=PackageName returns 200 OK with json {"version": "1.0.0.0-prod"} if it succeeds if it fails returns a failing status code with {"reason": "SOME ERROR"} GET /api/v1/download?name=PackageName&version=1.0.0.0-prod returns 200 OK with package bytes or 404 if doesn't exist @@ -149,7 +146,7 @@ func main(args) var csrf = ctx.QueryParams.TryGetFirst("csrf"); var result = { Success=false, Reason = "Invalid CSRF"}; - if(DB.VerifyCSRF(session,csrf)) + if(!DB.VerifyCSRF(session,csrf)) { var userId = DB.GetUserIdFromSession(session); result = DB.UploadPackage(userId, filePath); @@ -175,6 +172,100 @@ func main(args) } } + if(ctx.Path == "/api") + { + ctx.WithMimeType("text/html").SendText(Pages.API.Index()); + return true; + } + + if(ctx.Path == "/api-v1") + { + ctx.WithMimeType("text/html").SendText(Pages.API.V1()); + return true; + } + if(ctx.Path == "/api/v1/upload") + { + if(ctx.Method == "PUT") + { + var session = DB.GetSessionFromBearer(ctx); + if(session == null) + { + ctx.StatusCode=401; + ctx.SendJson({ + reason = "You are not logged in" + }); + return true; + } + var userId = DB.GetUserIdFromSession(session); + var filePath = DB.working / "Temp" / $"{DB.GetUniqueNumber()}.crvm"; + + var strm = FS.Local.OpenFile(filePath,"wb"); + + ctx.ReadStream(strm); + strm.Close(); + var result = DB.UploadPackage(userId, filePath); + if(result.Success) + { + ctx.StatusCode = 204; + ctx.ResponseHeaders.SetValue("Content-Length","0"); + ctx.WriteHeaders(); + return true; + } + else { + ctx.StatusCode = 400; + ctx.SendJson({reason = result.Reason}); + return true; + } + } + else { + ctx.StatusCode = 400; + ctx.SendJson({ + reason = $"Expected PUT method got {ctx.Method}" + }); + } + return true; + } + if(ctx.Path == "/api/v1/login") + { + if(ctx.Method == "POST") + { + var json = ctx.ReadJson(); + if(TypeOf(json) != "Dictionary" || TypeOf(json.email) != "String" || TypeOf(json.password) != "String") { + ctx.StatusCode = 400; + ctx.SendJson({ + reason = "Expected a Json Dictionary, with the email and password" + }); + return true; + } + + var accountId = DB.GetAccountId(json.email, json.password); + if(accountId == -1) + { + ctx.StatusCode = 401; + + ctx.SendJson({ + reason = "Invalid credentials" + }); + return true; + } + + + + ctx.SendJson({ + token = DB.CreateSession(accountId) + }); + return true; + + + } + else { + ctx.StatusCode = 400; + ctx.SendJson({ + reason = $"Expected POST method got {ctx.Method}" + }); + } + return true; + } if(ctx.Path == "/api/v1/package_icon.png") { var name = ctx.QueryParams.TryGetFirst("name"); diff --git a/Tesses.CrossLang.Shell/src/main.tcross b/Tesses.CrossLang.Shell/src/main.tcross index 6752117..e9008b5 100644 --- a/Tesses.CrossLang.Shell/src/main.tcross +++ b/Tesses.CrossLang.Shell/src/main.tcross @@ -15,6 +15,7 @@ func main(args) else if(commandName == "build") { var offline=false; + var allowFullCompTime=false; var buildPath = "."; if(dd.Arguments.Count > 1) { @@ -26,12 +27,17 @@ func main(args) { offline = true; } + if(flag == "allow-insecure-comptime") + { + allowFullCompTime=true; + } if(flag == "help") { Console.WriteLine("USAGE: crosslang build [build-flags-and-options]"); Console.WriteLine("FLAGS:"); - Console.WriteLine("offline: build with no internet (don't fetch files)"); - Console.WriteLine("help: this help"); + Console.WriteLine("offline: build with no internet (don't fetch files)"); + Console.WriteLine("help: this help"); + Console.WriteLine("allow-insecure-comptime: Allow full comptime"); Console.WriteLine(); Console.WriteLine("OPTIONS:"); Console.WriteLine("conf=CONFIGSTRING: specify a conf string for compile_tool(s), is the property Config"); @@ -50,6 +56,7 @@ func main(args) pm.Offline = offline; var bt = Tesses.CrossLang.BuildTool(pm); bt.Config = conf; + bt.AllowFullCompTime = allowFullCompTime; bt.BuildProject(buildPath); } else if(commandName == "run") @@ -57,6 +64,7 @@ func main(args) var offline=false; var buildPath = "."; var nobuild=false; + var allowFullCompTime=false; var output=""; each(var flag : dd.Flags) { @@ -64,14 +72,19 @@ func main(args) { offline = true; } + else if(flag == "allow-insecure-comptime") + { + allowFullCompTime=true; + } else if(flag == "help") { Console.WriteLine("USAGE: crosslang run [run-flags-and-options] program-arguments..."); Console.WriteLine("USAGE: crosslang run [run-flags-and-options] -- program-arguments-and-options..."); Console.WriteLine("FLAGS:"); - Console.WriteLine("offline: build with no internet (don't fetch files)"); - Console.WriteLine("help: this help"); - Console.WriteLine("nobuild: don't build, just run"); + Console.WriteLine("offline: build with no internet (don't fetch files)"); + Console.WriteLine("allow-insecure-comptime: Allow full comptime"); + Console.WriteLine("nobuild: don't build, just run"); + Console.WriteLine("help: this help"); Console.WriteLine(); Console.WriteLine("OPTIONS:"); Console.WriteLine("conf=CONFIGSTRING: specify a conf string for compile_tool(s), is the property Config"); @@ -116,6 +129,7 @@ func main(args) pm.Offline = offline; var bt = Tesses.CrossLang.BuildTool(pm); bt.Config = conf; + bt.AllowFullCompTime = allowFullCompTime; output = bt.BuildProject(buildPath).Output; } var env = VM.CreateEnvironment({}); @@ -465,7 +479,7 @@ func main(args) } else if(commandName == "install-console") { - //crosslang install-console + //crosslang install-console ConsoleApp --version=1.0.0.0-prod [--outdir=DIR] } else if(commandName == "install-app") { @@ -606,6 +620,10 @@ func main(args) { //crosslang console myfavoriteapp } + else if(commandName == "app") + { + Tesses.CrossLang.Shell.App(dd); + } else if(commandName == "tool") { @@ -750,13 +768,141 @@ func main(args) } else if(commandName == "upload-package") { - //crosslang upload-package [PACKAGE_NAME] + //crosslang upload-package [--host=HOST --token=TOKEN] [--session=NAME] [PACKAGE_FILE] + var host=null; + var token=null; + var session=null; + var package=null; + var nobuild=false; + each(var option : dd.Options) + { + if(option.Key == "host") + { + host = option.Value; + } + if(option.Key == "token") + { + token = option.Value; + } + if(option.Key == "session") + { + session = option.Value; + } + } + if(dd.Arguments.Length > 1) + { + package = dd.Arguments[1]; + } + else { + if(nobuild) + { + throw {Type="NotImplementedException", Message="nobuild on upload-package is not implemented",ToString=(this)=>$"{this.Type} on line: {this.Line}: {this.Message}"}; + } + else { + + var pm = Tesses.CrossLang.PackageManager(); + pm.Offline = false; + var bt = Tesses.CrossLang.BuildTool(pm); + bt.Config = ""; + bt.AllowFullCompTime = false; + package = bt.BuildProject(".").Output; + } + } + + if(TypeOf(host) != "String" || TypeOf(token) != "String") + { + if(FS.Local.FileExists(Env.CrossLangConfig / "auth.json")) + { + var json = Json.Decode(FS.ReadAllText(FS.Local,Env.CrossLangConfig / "auth.json")); + if(json.Length == 0) + { + Console.WriteLine("The auth.json file is empty, use crosslang login to login"); + return 1; + } + else if(json.Length == 1) + { + host = json[0].host; + token = json[0].token; + } + else { + if(TypeOf(session) != "String") + { + Console.WriteLine("Multiple entries in auth.json file, session is ambiguous."); + Console.WriteLine("Sessions:"); + each(var item : json) + { + Console.WriteLine($"{item.name}: {item.host}"); + } + return 1; + } + else { + var found=false; + each(var item : json) + { + if(item.name == session) + { + found=true; + host = item.host; + token = item.token; + break; + } + } + if(!found) { + Console.WriteLine($"Could not find session with name: {session}"); + return 1; + } + } + } + } + else { Console.WriteLine("No auth.json file, use crosslang login to login"); return 1;} + } + + if(TypeOf(host) != "String" || TypeOf(token) != "String") + { + Console.WriteLine("You are not logged in, use crosslang login to login"); + return 1; + } + var strm = FS.Local.OpenFile(package,"rb"); + if(strm == null) + { + Console.WriteLine("Could not open file"); + return 1; + } + var req = { + Method="PUT", + RequestHeaders = [ + {Key= "Authorization",Value=$"Bearer {token}"} + ], + Body = Net.Http.StreamHttpRequestBody(strm,"application/crvm") + }; + var http = Net.Http.MakeRequest($"{host.TrimEnd('/')}/api/v1/upload",req); + + + if(http.StatusCode == 204) + { + Console.WriteLine("Uploaded package successfully"); + } + else if(http.ResponseHeaders.TryGetFirst("Content-Type") == "application/json") + { + var json = Json.Decode(http.ReadAsString()); + Console.WriteLine($"Failed to upload package, {json.reason.TrimEnd('.')}."); + } + else { + Console.WriteLine($"Failed to upload package."); + } + strm.Close(); + } + else if(commandName == "login") + { + //crosslang login local https://cpkg.tesseslanguage.com/ + //crosslang login [NAME] [HOST] [TOKEN] + } else if(commandName == "configdir") { Console.WriteLine(Env.CrossLangConfig); } - + } else { diff --git a/Tesses.CrossLang.Std/src/exception.tcross b/Tesses.CrossLang.Std/src/exception.tcross index f367803..a5e49cd 100644 --- a/Tesses.CrossLang.Std/src/exception.tcross +++ b/Tesses.CrossLang.Std/src/exception.tcross @@ -1,41 +1,29 @@ -/^ - Create a new exception -^/ -func New.Exception(message,$type,$inner) +class Exception { - if(TypeIsString(type)) + public Message; + public InnerException; + public Exception(message,$inner) { - return { - Message = message, - InnerException = inner, - Type = type, - ToString = Std.Internal.Exception.ToString - }; + this.Message = message; + this.InnerException = inner; } - else + + public ToString() { - return { - Message = message, - InnerException = inner, - Type = "Exception", - ToString = Std.Internal.Exception.ToString - }; + var messagePart = $"{Class.Name(this)}: {Message}"; + if(InnerException != undefined && InnerException != null) + { + var innerEx = InnerException.ToString().Replace("\n","\n\t"); + return $"{messagePart}\nInner exception:\n{innerEx}"; + } + return messagePart; } } -/^Out of range exception^/ -func New.OutOfRangeException(varName, $inner) -{ - return new Exception($"{varName} is out of range.","OutOfRangeException",inner); -} -/^Exception ToString^/ -func Std.Internal.Exception.ToString(this) -{ - var messagePart = $"{this.Type}: {this.Message}"; - if(this.InnerException != undefined && this.InnerException != null) - { - var innerEx = this.InnerException.ToString().Replace("\n","\n\t"); - return $"{messagePart}\nInner exception:\n{innerEx}"; - } - return messagePart; -} +class OutOfRangeException : Exception +{ + public OutOfRangeException(varName,$inner) + { + Exception($"{varName} is out of range.",inner); + } +} \ No newline at end of file diff --git a/build.tcross b/build.tcross index 36fc00b..e1a0c04 100644 --- a/build.tcross +++ b/build.tcross @@ -27,18 +27,21 @@ func main(args) cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Tesses.CrossLang.PackageServer"]); //cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Tesses.CrossLang.WebSite"]); cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Tesses.CrossLang.Std"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Templates/console"]); + cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Templates/console"]); cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Templates/emptyweb"]); cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Templates/web"]); cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Templates/template"]); cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Templates/lib"]); cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Templates/compiletool"]); cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Templates/tool"]); - /*cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Tesses.CrossLang.PackageServer"]); + cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Templates/gui"]); + /* cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Tesses.CrossLang.PackageServer"]); cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Tesses.CrossLang.PackageServer"]); cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Tesses.CrossLang.PackageServer"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Tesses.CrossLang.PackageServer"]);*/ + cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Tesses.CrossLang.PackageServer"]); + cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","Tesses.CrossLang.PackageServer"]); + */ cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm","build","crosslang_shell_archive_maker"]); if(args.Length > 1) diff --git a/crosslang_shell_archive_maker/src/main.tcross b/crosslang_shell_archive_maker/src/main.tcross index 20e9184..75861fd 100644 --- a/crosslang_shell_archive_maker/src/main.tcross +++ b/crosslang_shell_archive_maker/src/main.tcross @@ -54,6 +54,8 @@ func create_archive() copyFile("Templates/web/bin/Tesses.CrossLang.Template.Website-1.0.0.0-prod.crvm", templates / "web.crvm"); copyFile("Templates/emptyweb/bin/Tesses.CrossLang.Template.EmptyWebsite-1.0.0.0-prod.crvm", templates / "emptyweb.crvm"); copyFile("Templates/tool/bin/Tesses.CrossLang.Template.Tool-1.0.0.0-prod.crvm", templates / "tool.crvm"); + copyFile("Templates/gui/bin/Tesses.CrossLang.Template.GUI-1.0.0.0-prod.crvm", templates / "gui.crvm"); + var packageCache = r / "PackageCache"; tmpFS.CreateDirectory(packageCache); diff --git a/newtonsoft_json_config_schema.cs b/newtonsoft_json_config_schema.cs index 10c859e..7684f0a 100644 --- a/newtonsoft_json_config_schema.cs +++ b/newtonsoft_json_config_schema.cs @@ -38,7 +38,7 @@ namespace Tesses.CrossLang public string license {get;set;}=""; //optional, but recommended to tell people what the license is - public string readme {get;set;}=""; //optional but tells people about the package + public string description {get;set;}=""; //optional but tells people about the package } public static void Main(string[] args) diff --git a/project_types.txt b/project_types.txt index 0b39801..467367c 100644 --- a/project_types.txt +++ b/project_types.txt @@ -3,4 +3,4 @@ lib: a library app: a gui app (used for eventual gui system) template: used for project templates compile_tool: run before source is compiled for project if it is in the dependency tree for the project (and is not linked to said projects) -tool: a tool invokable via crosslang \ No newline at end of file +tool: a tool invokable via crosslang (gets Tesses.CrossLang.Args for free) \ No newline at end of file