From 3ee2a759ac9a86789a0c1929d67513f0be9acabd Mon Sep 17 00:00:00 2001 From: Cold Fry Date: Fri, 17 Apr 2026 09:25:20 +0000 Subject: [PATCH 1/3] build lualib internally --- extern/tstl-test-util.patch | 27 +- internal/lualib/build.go | 114 +- internal/lualib/build_test.go | 244 ++ internal/lualib/features/Map.lua | 5 +- internal/lualib/features/Promise.lua | 3 + internal/lualib/features/Set.lua | 5 +- internal/lualib/features/TsluaIterators.lua | 10 +- internal/lualib/features/WeakMap.lua | 5 +- internal/lualib/features/WeakSet.lua | 5 +- internal/lualib/features_50/Map.lua | 5 +- internal/lualib/features_50/Promise.lua | 3 + internal/lualib/features_50/Set.lua | 5 +- .../lualib/features_50/TsluaIterators.lua | 10 +- internal/lualib/features_50/WeakMap.lua | 5 +- internal/lualib/features_50/WeakSet.lua | 5 +- internal/lualib/lualib.go | 13 + internal/lualib/lualib_bundle.lua | 2538 ++++++++-------- internal/lualib/lualib_bundle_50.lua | 2564 ++++++++--------- internal/lualib/lualib_module_info.json | 4 +- internal/lualib/lualib_module_info_50.json | 4 +- internal/transpiler/modules.go | 13 +- internal/tstltest/testhelper_test.go | 37 +- justfile | 21 +- scripts/update-lualib.sh | 145 +- 24 files changed, 2867 insertions(+), 2923 deletions(-) create mode 100644 internal/lualib/build_test.go diff --git a/extern/tstl-test-util.patch b/extern/tstl-test-util.patch index 49c02b7..0ab1f0b 100644 --- a/extern/tstl-test-util.patch +++ b/extern/tstl-test-util.patch @@ -1,22 +1,31 @@ diff --git a/test/util.ts b/test/util.ts -index 3488572..1864e44 100644 +index 3488572..694642c 100644 --- a/test/util.ts +++ b/test/util.ts -@@ -13,6 +13,13 @@ import { EmitHost, getEmitOutDir, transpileProject } from "../src"; +@@ -11,10 +11,20 @@ import * as tstl from "../src"; + import { createEmitOutputCollector } from "../src/transpilation/output-collector"; + import { EmitHost, getEmitOutDir, transpileProject } from "../src"; import { formatPathToLuaPath, normalizeSlashes } from "../src/utils"; - import { resolveLuaLibDir } from "../src/LuaLib"; - +-import { resolveLuaLibDir } from "../src/LuaLib"; ++ +import { execSync, execFileSync } from "child_process"; + +const USE_TSTL_GO = Boolean(process.env.TSTL_GO); +const TSTL_GO_BIN = path.resolve(__dirname, "../../../tslua"); +const TSTL_GO_CLIENT = path.resolve(__dirname, "../../../tslua-client"); +const TSTL_GO_SOCKET = process.env.TSLUA_SOCKET || path.resolve(__dirname, "../../../tmp/tslua-jest.sock"); -+ + function readLuaLib(target: tstl.LuaTarget) { - return fs.readFileSync(path.join(resolveLuaLibDir(target), "lualib_bundle.lua"), "utf8"); +- return fs.readFileSync(path.join(resolveLuaLibDir(target), "lualib_bundle.lua"), "utf8"); ++ // tslua owns the lualib runtime. Read the committed bundle from ++ // internal/lualib/ so jest runs against the same Lua that tslua emits ++ // from its own transpiler. TSTL's dist/lualib is no longer consulted. ++ const flavor = target === tstl.LuaTarget.Lua50 ? "lualib_bundle_50.lua" : "lualib_bundle.lua"; ++ return fs.readFileSync(path.resolve(__dirname, "../../../internal/lualib", flavor), "utf8"); } -@@ -240,6 +247,10 @@ export abstract class TestBuilder { + + function jsonLib(target: tstl.LuaTarget): string { +@@ -240,6 +250,10 @@ export abstract class TestBuilder { @memoize public getLuaResult(): tstl.TranspileVirtualProjectResult { @@ -27,7 +36,7 @@ index 3488572..1864e44 100644 const program = this.getProgram(); const preEmitDiagnostics = ts.getPreEmitDiagnostics(program); const collector = createEmitOutputCollector(this.options.extension); -@@ -254,6 +265,258 @@ export abstract class TestBuilder { +@@ -254,6 +268,258 @@ export abstract class TestBuilder { return { diagnostics: [...diagnostics], transpiledFiles: collector.files }; } @@ -286,7 +295,7 @@ index 3488572..1864e44 100644 @memoize public getMainLuaFileResult(): ExecutableTranspiledFile { const { transpiledFiles } = this.getLuaResult(); -@@ -452,16 +715,18 @@ export abstract class TestBuilder { +@@ -452,16 +718,18 @@ export abstract class TestBuilder { // Load modules // Json this.injectLuaFile(L, lua, lauxlib, "json", jsonLib(luaTarget)); diff --git a/internal/lualib/build.go b/internal/lualib/build.go index bb7a683..d2225d3 100644 --- a/internal/lualib/build.go +++ b/internal/lualib/build.go @@ -6,6 +6,7 @@ import ( "fmt" "os" "path/filepath" + "regexp" "sort" "strings" @@ -20,6 +21,62 @@ import ( "github.com/realcoldfry/tslua/internal/transpiler" ) +// patchExportRe matches top-level `local function __TS__Foo(` declarations +// in patches.lua. These get added to the bundle's export table. +var patchExportRe = regexp.MustCompile(`(?m)^local function (__TS__\w+)\(`) + +// hasExportLeak reports whether body assigns to name at file scope without +// using `local`, which would make name an implicit global once the body is +// concatenated into the bundle's top-level chunk. Covers: +// +// - bare `name = ...` assignment (e.g. `Map = __TS__Class()`) +// - global function declaration `function name(...)` +// +// Property access and method definitions on an already-bound identifier +// (`Map.prototype.X = ...`, `function Map:method(...)`) are NOT leaks on +// their own; they rely on name being in scope, which the forward +// declaration below guarantees. +func hasExportLeak(body, name string) bool { + q := regexp.QuoteMeta(name) + // `^name*=`: bare top-level assignment. + assignRe := regexp.MustCompile(`(?m)^` + q + `\s*=[^=]`) + if assignRe.MatchString(body) { + return true + } + // `^function (`: global function declaration. + fnRe := regexp.MustCompile(`(?m)^function\s+` + q + `\s*\(`) + return fnRe.MatchString(body) +} + +// wrapFileBody wraps body in `local \ndo\n\nend` when any of +// its exports would otherwise leak as globals. Mirrors TSTL's per-feature +// bundling structure: forward-declared locals outside a `do...end` keep the +// helper locals inside the block scoped while still exposing the exports +// to the rest of the bundle. When no export leaks, body is returned as-is +// (matching TSTL's treatment of simple single-function feature files like +// ArrayAt.ts). +func wrapFileBody(body string, exports []string) string { + if body == "" { + return body + } + var leaks []string + for _, name := range exports { + if hasExportLeak(body, name) { + leaks = append(leaks, name) + } + } + if len(leaks) == 0 { + return body + } + sort.Strings(leaks) + var sb strings.Builder + fmt.Fprintf(&sb, "local %s\n", strings.Join(leaks, ", ")) + sb.WriteString("do\n") + sb.WriteString(body) + sb.WriteString("\nend") + return sb.String() +} + // transpileLualibSource transpiles TSTL's lualib TypeScript source files and // returns the per-file results plus an export→file-index map. func transpileLualibSource(lualibSrcDir, langExtPath, luaTypesPath string, luaTarget transpiler.LuaTarget, overrideDir string) ([]transpiler.TranspileResult, map[string]int, error) { @@ -61,7 +118,7 @@ func transpileLualibSource(lualibSrcDir, langExtPath, luaTypesPath string, luaTa } } - // Copy .d.ts files from the source directory — these aren't transpiled but + // Copy .d.ts files from the source directory. These aren't transpiled but // provide type info for the checker (e.g. SparseArray.d.ts defines the // intersection type that lets isArrayType recognize sparse arrays). if entries, err := os.ReadDir(lualibSrcDir); err == nil { @@ -97,7 +154,7 @@ func transpileLualibSource(lualibSrcDir, langExtPath, luaTypesPath string, luaTa } luaTypesFile := filepath.Join(luaTypesPath, luaTypesVersion) - // Write tsconfig — include declarations/**/*.ts for type info (LuaClass, unpack, etc.) + // Write tsconfig (include declarations/**/*.ts for type info: LuaClass, unpack, etc.) tsconfig := fmt.Sprintf(`{ "compilerOptions": { "target": "ESNext", @@ -135,22 +192,12 @@ func transpileLualibSource(lualibSrcDir, langExtPath, luaTypesPath string, luaTa ExportAsGlobal: true, LuaLibImport: transpiler.LuaLibImportNone, }) - // Filter out function context diagnostics (1011/1012/1013) — these can be false - // positives due to tsgo type deduplication affecting call signature resolution. - var fatalDiags []*ast.Diagnostic - for _, d := range tsDiags { - code := d.Code() - if code == 1011 || code == 1012 || code == 1013 { - continue - } - fatalDiags = append(fatalDiags, d) - } - if len(fatalDiags) > 0 { + if len(tsDiags) > 0 { var msgs []string - for _, d := range fatalDiags { - msgs = append(msgs, fmt.Sprintf("[%d]", d.Code())) + for _, d := range tsDiags { + msgs = append(msgs, fmt.Sprintf("[%d] %s", d.Code(), ast.Diagnostic_MessageKey(d))) } - return nil, nil, fmt.Errorf("transpile diagnostics: %s", strings.Join(msgs, ", ")) + return nil, nil, fmt.Errorf("transpile diagnostics: %s", strings.Join(msgs, "; ")) } // Build a map from exported name → which file provides it. @@ -211,7 +258,7 @@ func BuildBundleFromSource(lualibSrcDir, langExtPath, luaTypesPath string, luaTa for _, r := range ordered { body := stripLuaComments(r.Lua) if body != "" { - sb.WriteString(body) + sb.WriteString(wrapFileBody(body, r.ExportedNames)) sb.WriteString("\n") } for _, e := range r.ExportedNames { @@ -219,6 +266,17 @@ func BuildBundleFromSource(lualibSrcDir, langExtPath, luaTypesPath string, luaTa } } + // Inject tslua-specific pure-Lua patches (Map/Set for-of fast paths) and + // register their exports. Mirrors scripts/update-lualib.sh apply_patches. + patches := stripLuaComments(string(patchesLua)) + if patches != "" { + sb.WriteString(patches) + sb.WriteString("\n") + for _, m := range patchExportRe.FindAllStringSubmatch(patches, -1) { + allExports[m[1]] = true + } + } + // Append return table exporting all public names var exportNames []string for n := range allExports { @@ -278,7 +336,27 @@ func BuildFeatureDataFromSource(lualibSrcDir, langExtPath, luaTypesPath string, moduleInfo[feature] = info body := stripLuaComments(r.Lua) - featureCode[feature] = body + featureCode[feature] = wrapFileBody(body, r.ExportedNames) + } + + // Inject tslua-specific patches as a synthetic feature. Mirrors + // scripts/update-lualib.sh apply_patches_to_features: one feature named + // "TsluaIterators" carrying the Map/Set for-of helpers, depending on the + // Map and Set features whose internal layout they read. + patches := stripLuaComments(string(patchesLua)) + if patches != "" { + var patchExports []string + for _, m := range patchExportRe.FindAllStringSubmatch(patches, -1) { + patchExports = append(patchExports, m[1]) + } + if len(patchExports) > 0 { + const patchFeature = "TsluaIterators" + moduleInfo[patchFeature] = FeatureInfo{ + Exports: patchExports, + Dependencies: []string{"Map", "Set"}, + } + featureCode[patchFeature] = patches + } } // Validate: every dependency should map to a known feature. diff --git a/internal/lualib/build_test.go b/internal/lualib/build_test.go new file mode 100644 index 0000000..476ea5e --- /dev/null +++ b/internal/lualib/build_test.go @@ -0,0 +1,244 @@ +package lualib + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "regexp" + "sort" + "strings" + "testing" + + "github.com/realcoldfry/tslua/internal/transpiler" +) + +// TestCommittedBundleUpToDate asserts that the committed +// internal/lualib/lualib_bundle.lua byte-matches what BuildBundleFromSource +// would produce right now. Catches hand-edits to the committed file and +// drift after transpiler changes. On failure, run `just update-lualib`. +func TestCommittedBundleUpToDate(t *testing.T) { + repoRoot, err := findRepoRootFromTest() + if err != nil { + t.Skipf("cannot locate repo root: %v", err) + } + srcDir := filepath.Join(repoRoot, "extern", "tstl", "src", "lualib") + langExt := filepath.Join(repoRoot, "extern", "tstl", "language-extensions") + luaTypes := filepath.Join(repoRoot, "extern", "tstl", "node_modules", "lua-types") + if _, err := os.Stat(filepath.Join(luaTypes, "5.4.d.ts")); err != nil { + t.Skip("extern/tstl not set up (run `just tstl-setup`)") + } + + built, err := BuildBundleFromSource(srcDir, langExt, luaTypes, transpiler.LuaTargetUniversal, "universal") + if err != nil { + t.Fatalf("BuildBundleFromSource: %v", err) + } + + if built != string(Bundle) { + diffContext := firstDifferingLine(built, string(Bundle)) + t.Fatalf("committed internal/lualib/lualib_bundle.lua is stale. Run `just update-lualib`.\nFirst diff: %s", diffContext) + } +} + +func firstDifferingLine(a, b string) string { + la := strings.Split(a, "\n") + lb := strings.Split(b, "\n") + n := len(la) + if len(lb) < n { + n = len(lb) + } + for i := 0; i < n; i++ { + if la[i] != lb[i] { + return fmt.Sprintf("line %d:\n built: %q\n committed: %q", i+1, la[i], lb[i]) + } + } + if len(la) != len(lb) { + return fmt.Sprintf("line counts differ: built=%d committed=%d", len(la), len(lb)) + } + return "(identical?)" +} + +// TestSelfBuiltBundleExportsStable sanity-checks the export extraction helper +// used by other tooling (lualib-diff, etc.). The extractBundleExports helper +// reads the trailing `return { ... }` table and returns the keys. +var returnTableEntryRe = regexp.MustCompile(`(?m)^\s+(\w+)\s*=\s*\w+,?$`) + +func extractBundleExports(bundle string) []string { + idx := strings.LastIndex(bundle, "\nreturn {") + if idx < 0 { + return nil + } + tail := bundle[idx:] + var names []string + seen := map[string]bool{} + for _, m := range returnTableEntryRe.FindAllStringSubmatch(tail, -1) { + if !seen[m[1]] { + seen[m[1]] = true + names = append(names, m[1]) + } + } + sort.Strings(names) + return names +} + +func TestSelfBuiltBundleExportsStable(t *testing.T) { + repoRoot, err := findRepoRootFromTest() + if err != nil { + t.Skipf("cannot locate repo root: %v", err) + } + srcDir := filepath.Join(repoRoot, "extern", "tstl", "src", "lualib") + langExt := filepath.Join(repoRoot, "extern", "tstl", "language-extensions") + luaTypes := filepath.Join(repoRoot, "extern", "tstl", "node_modules", "lua-types") + if _, err := os.Stat(filepath.Join(luaTypes, "5.4.d.ts")); err != nil { + t.Skip("extern/tstl not set up (run `just tstl-setup`)") + } + + built, err := BuildBundleFromSource(srcDir, langExt, luaTypes, transpiler.LuaTargetUniversal, "universal") + if err != nil { + t.Fatalf("BuildBundleFromSource: %v", err) + } + + gotExports := extractBundleExports(built) + wantExports := extractBundleExports(string(Bundle)) + + if len(gotExports) == 0 || len(wantExports) == 0 { + t.Fatalf("empty export list: got=%d want=%d", len(gotExports), len(wantExports)) + } + + wantSet := map[string]bool{} + for _, n := range wantExports { + wantSet[n] = true + } + gotSet := map[string]bool{} + for _, n := range gotExports { + gotSet[n] = true + } + var missing, extra []string + for n := range wantSet { + if !gotSet[n] { + missing = append(missing, n) + } + } + for n := range gotSet { + if !wantSet[n] { + extra = append(extra, n) + } + } + sort.Strings(missing) + sort.Strings(extra) + if len(missing) > 0 || len(extra) > 0 { + t.Errorf("export set mismatch\nmissing from self-built (%d): %v\nextra in self-built (%d): %v", + len(missing), missing, len(extra), extra) + } +} + +func TestHasExportLeak(t *testing.T) { + cases := []struct { + name string + body string + exp string + want bool + }{ + {"bare assign", "Map = __TS__Class()", "Map", true}, + {"local assign", "local Map = __TS__Class()", "Map", false}, + {"local function", "local function Foo(x)\nend", "Foo", false}, + {"global function decl", "function Foo(x)\nend", "Foo", true}, + {"property set only", "Map.prototype.x = 1", "Map", false}, + {"method def only", "function Map:m() end", "Map", false}, + {"equality not assign", "if Map == nil then end", "Map", false}, + {"name as substring", "SomeMap = {}", "Map", false}, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if got := hasExportLeak(tc.body, tc.exp); got != tc.want { + t.Errorf("hasExportLeak(%q, %q) = %v, want %v", tc.body, tc.exp, got, tc.want) + } + }) + } +} + +func TestWrapFileBody(t *testing.T) { + // No leak: body returned as-is. + body := "local function __TS__ArrayAt(self, i)\nreturn self[i]\nend" + got := wrapFileBody(body, []string{"__TS__ArrayAt"}) + if got != body { + t.Errorf("expected no wrap for non-leaking body; got:\n%s", got) + } + + // Leak: forward-decl + do/end wrap, exports sorted. + body2 := "Map = __TS__Class()\nSet = __TS__Class()" + got2 := wrapFileBody(body2, []string{"Set", "Map"}) + want2 := "local Map, Set\ndo\nMap = __TS__Class()\nSet = __TS__Class()\nend" + if got2 != want2 { + t.Errorf("wrap mismatch:\ngot:\n%s\n\nwant:\n%s", got2, want2) + } +} + +// TestSelfBuiltBundleLeaksNoGlobals mirrors TSTL's "Lualib bundle does not +// assign globals" check: snapshot _G before loading the bundle, load it, then +// assert no new keys appeared. Protects against a regression where +// `export class X` emits `X = ...` at bundle scope (an implicit global). +func TestSelfBuiltBundleLeaksNoGlobals(t *testing.T) { + repoRoot, err := findRepoRootFromTest() + if err != nil { + t.Skipf("cannot locate repo root: %v", err) + } + luaBin, err := exec.LookPath("lua5.4") + if err != nil { + t.Skip("lua5.4 not installed") + } + srcDir := filepath.Join(repoRoot, "extern", "tstl", "src", "lualib") + langExt := filepath.Join(repoRoot, "extern", "tstl", "language-extensions") + luaTypes := filepath.Join(repoRoot, "extern", "tstl", "node_modules", "lua-types") + if _, err := os.Stat(filepath.Join(luaTypes, "5.4.d.ts")); err != nil { + t.Skip("extern/tstl not set up (run `just tstl-setup`)") + } + + built, err := BuildBundleFromSource(srcDir, langExt, luaTypes, transpiler.LuaTargetUniversal, "universal") + if err != nil { + t.Fatalf("BuildBundleFromSource: %v", err) + } + + tmp := t.TempDir() + bundlePath := filepath.Join(tmp, "lualib_bundle.lua") + if err := os.WriteFile(bundlePath, []byte(built), 0o644); err != nil { + t.Fatalf("write bundle: %v", err) + } + // Pure-Lua probe: require the bundle, diff _G before and after. + probe := ` + local pre = {} + for k in pairs(_G) do pre[k] = true end + require("lualib_bundle") + local leaks = {} + for k in pairs(_G) do if not pre[k] then table.insert(leaks, k) end end + table.sort(leaks) + io.write(table.concat(leaks, ",")) + ` + cmd := exec.Command(luaBin, "-e", "package.path='"+tmp+"/?.lua;'..package.path", "-e", probe) + out, err := cmd.CombinedOutput() + if err != nil { + t.Fatalf("lua probe: %v\n%s", err, out) + } + got := strings.TrimSpace(string(out)) + if got != "" { + t.Errorf("lualib bundle leaks globals: %s", got) + } +} + +func findRepoRootFromTest() (string, error) { + cwd, err := os.Getwd() + if err != nil { + return "", err + } + dir := cwd + for { + if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil { + return dir, nil + } + parent := filepath.Dir(dir) + if parent == dir { + return "", os.ErrNotExist + } + dir = parent + } +} diff --git a/internal/lualib/features/Map.lua b/internal/lualib/features/Map.lua index 19b0291..ca19a11 100644 --- a/internal/lualib/features/Map.lua +++ b/internal/lualib/features/Map.lua @@ -1,3 +1,5 @@ +local Map +do Map = __TS__Class() Map.name = "Map" function Map.prototype.____constructor(self, entries) @@ -158,4 +160,5 @@ function Map.prototype.values(self) end } end -Map[Symbol.species] = Map \ No newline at end of file +Map[Symbol.species] = Map +end \ No newline at end of file diff --git a/internal/lualib/features/Promise.lua b/internal/lualib/features/Promise.lua index 45941e0..243a6d5 100644 --- a/internal/lualib/features/Promise.lua +++ b/internal/lualib/features/Promise.lua @@ -1,3 +1,5 @@ +local __TS__Promise +do local function makeDeferredPromiseFactory() local resolve local reject @@ -135,4 +137,5 @@ function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, rejec else return resolve(nil, value) end +end end \ No newline at end of file diff --git a/internal/lualib/features/Set.lua b/internal/lualib/features/Set.lua index bf940f4..8f143f1 100644 --- a/internal/lualib/features/Set.lua +++ b/internal/lualib/features/Set.lua @@ -1,3 +1,5 @@ +local Set +do Set = __TS__Class() Set.name = "Set" function Set.prototype.____constructor(self, values) @@ -206,4 +208,5 @@ function Set.prototype.isDisjointFrom(self, other) end return true end -Set[Symbol.species] = Set \ No newline at end of file +Set[Symbol.species] = Set +end \ No newline at end of file diff --git a/internal/lualib/features/TsluaIterators.lua b/internal/lualib/features/TsluaIterators.lua index cb5e165..e57613e 100644 --- a/internal/lualib/features/TsluaIterators.lua +++ b/internal/lualib/features/TsluaIterators.lua @@ -1,11 +1,3 @@ --- tslua-specific lualib additions. --- These are pure Lua functions with no TypeScript equivalent in TSTL. --- Injected into lualib_bundle.lua by the update-lualib script. - --- Optimized Map/Set iterators using Lua's generic for protocol. --- These avoid creating closure-based iterators and work directly --- with the Map/Set internal linked-list structure. - local function __TS__MapForOfStep(map, prev) local key if prev == nil then @@ -68,4 +60,4 @@ local function __TS__SetForOfStep(set, prev) end local function __TS__SetForOf(set) return __TS__SetForOfStep, set, nil -end +end \ No newline at end of file diff --git a/internal/lualib/features/WeakMap.lua b/internal/lualib/features/WeakMap.lua index 6ef7c5d..467b6bf 100644 --- a/internal/lualib/features/WeakMap.lua +++ b/internal/lualib/features/WeakMap.lua @@ -1,3 +1,5 @@ +local WeakMap +do WeakMap = __TS__Class() WeakMap.name = "WeakMap" function WeakMap.prototype.____constructor(self, entries) @@ -39,4 +41,5 @@ function WeakMap.prototype.set(self, key, value) self.items[key] = value return self end -WeakMap[Symbol.species] = WeakMap \ No newline at end of file +WeakMap[Symbol.species] = WeakMap +end \ No newline at end of file diff --git a/internal/lualib/features/WeakSet.lua b/internal/lualib/features/WeakSet.lua index 0ed9547..d1dc4b0 100644 --- a/internal/lualib/features/WeakSet.lua +++ b/internal/lualib/features/WeakSet.lua @@ -1,3 +1,5 @@ +local WeakSet +do WeakSet = __TS__Class() WeakSet.name = "WeakSet" function WeakSet.prototype.____constructor(self, values) @@ -35,4 +37,5 @@ end function WeakSet.prototype.has(self, value) return self.items[value] == true end -WeakSet[Symbol.species] = WeakSet \ No newline at end of file +WeakSet[Symbol.species] = WeakSet +end \ No newline at end of file diff --git a/internal/lualib/features_50/Map.lua b/internal/lualib/features_50/Map.lua index 19b0291..ca19a11 100644 --- a/internal/lualib/features_50/Map.lua +++ b/internal/lualib/features_50/Map.lua @@ -1,3 +1,5 @@ +local Map +do Map = __TS__Class() Map.name = "Map" function Map.prototype.____constructor(self, entries) @@ -158,4 +160,5 @@ function Map.prototype.values(self) end } end -Map[Symbol.species] = Map \ No newline at end of file +Map[Symbol.species] = Map +end \ No newline at end of file diff --git a/internal/lualib/features_50/Promise.lua b/internal/lualib/features_50/Promise.lua index 6e1c0fd..237e71d 100644 --- a/internal/lualib/features_50/Promise.lua +++ b/internal/lualib/features_50/Promise.lua @@ -1,3 +1,5 @@ +local __TS__Promise +do local function makeDeferredPromiseFactory() local resolve local reject @@ -135,4 +137,5 @@ function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, rejec else return resolve(nil, value) end +end end \ No newline at end of file diff --git a/internal/lualib/features_50/Set.lua b/internal/lualib/features_50/Set.lua index bf940f4..8f143f1 100644 --- a/internal/lualib/features_50/Set.lua +++ b/internal/lualib/features_50/Set.lua @@ -1,3 +1,5 @@ +local Set +do Set = __TS__Class() Set.name = "Set" function Set.prototype.____constructor(self, values) @@ -206,4 +208,5 @@ function Set.prototype.isDisjointFrom(self, other) end return true end -Set[Symbol.species] = Set \ No newline at end of file +Set[Symbol.species] = Set +end \ No newline at end of file diff --git a/internal/lualib/features_50/TsluaIterators.lua b/internal/lualib/features_50/TsluaIterators.lua index cb5e165..e57613e 100644 --- a/internal/lualib/features_50/TsluaIterators.lua +++ b/internal/lualib/features_50/TsluaIterators.lua @@ -1,11 +1,3 @@ --- tslua-specific lualib additions. --- These are pure Lua functions with no TypeScript equivalent in TSTL. --- Injected into lualib_bundle.lua by the update-lualib script. - --- Optimized Map/Set iterators using Lua's generic for protocol. --- These avoid creating closure-based iterators and work directly --- with the Map/Set internal linked-list structure. - local function __TS__MapForOfStep(map, prev) local key if prev == nil then @@ -68,4 +60,4 @@ local function __TS__SetForOfStep(set, prev) end local function __TS__SetForOf(set) return __TS__SetForOfStep, set, nil -end +end \ No newline at end of file diff --git a/internal/lualib/features_50/WeakMap.lua b/internal/lualib/features_50/WeakMap.lua index 6ef7c5d..467b6bf 100644 --- a/internal/lualib/features_50/WeakMap.lua +++ b/internal/lualib/features_50/WeakMap.lua @@ -1,3 +1,5 @@ +local WeakMap +do WeakMap = __TS__Class() WeakMap.name = "WeakMap" function WeakMap.prototype.____constructor(self, entries) @@ -39,4 +41,5 @@ function WeakMap.prototype.set(self, key, value) self.items[key] = value return self end -WeakMap[Symbol.species] = WeakMap \ No newline at end of file +WeakMap[Symbol.species] = WeakMap +end \ No newline at end of file diff --git a/internal/lualib/features_50/WeakSet.lua b/internal/lualib/features_50/WeakSet.lua index 0ed9547..d1dc4b0 100644 --- a/internal/lualib/features_50/WeakSet.lua +++ b/internal/lualib/features_50/WeakSet.lua @@ -1,3 +1,5 @@ +local WeakSet +do WeakSet = __TS__Class() WeakSet.name = "WeakSet" function WeakSet.prototype.____constructor(self, values) @@ -35,4 +37,5 @@ end function WeakSet.prototype.has(self, value) return self.items[value] == true end -WeakSet[Symbol.species] = WeakSet \ No newline at end of file +WeakSet[Symbol.species] = WeakSet +end \ No newline at end of file diff --git a/internal/lualib/lualib.go b/internal/lualib/lualib.go index ed55f22..d69edb9 100644 --- a/internal/lualib/lualib.go +++ b/internal/lualib/lualib.go @@ -27,7 +27,20 @@ var moduleInfoJSON []byte //go:embed lualib_module_info_50.json var moduleInfo50JSON []byte +//go:embed patches.lua +var patchesLua []byte + +// Patches returns the tslua-specific pure-Lua helpers that have no TS source +// (Map/Set for-of fast paths). BuildBundleFromSource and +// BuildFeatureDataFromSource fold these in when producing bundles, so they +// are present in both the committed embedded bundle and any on-demand +// rebuild. +func Patches() []byte { return patchesLua } + // BundleForTarget returns the appropriate lualib bundle for the given target. +// The embedded Bundle / Bundle50 are produced by BuildBundleFromSource at +// development time (via `just update-lualib`). TestCommittedBundleUpToDate +// enforces that they stay byte-equivalent to a fresh rebuild from TS sources. func BundleForTarget(target string) []byte { if target == "5.0" { return Bundle50 diff --git a/internal/lualib/lualib_bundle.lua b/internal/lualib/lualib_bundle.lua index cf388d9..f673d85 100644 --- a/internal/lualib/lualib_bundle.lua +++ b/internal/lualib/lualib_bundle.lua @@ -5,11 +5,9 @@ local function __TS__ArrayAt(self, relativeIndex) end return nil end - local function __TS__ArrayIsArray(value) return type(value) == "table" and (value[1] ~= nil or next(value) == nil) end - local function __TS__ArrayConcat(self, ...) local items = {...} local result = {} @@ -32,25 +30,20 @@ local function __TS__ArrayConcat(self, ...) end return result end - -local __TS__Symbol, Symbol -do - local symbolMetatable = {__tostring = function(self) - return ("Symbol(" .. (self.description or "")) .. ")" - end} - function __TS__Symbol(description) - return setmetatable({description = description}, symbolMetatable) - end - Symbol = { - asyncDispose = __TS__Symbol("Symbol.asyncDispose"), - dispose = __TS__Symbol("Symbol.dispose"), - iterator = __TS__Symbol("Symbol.iterator"), - hasInstance = __TS__Symbol("Symbol.hasInstance"), - species = __TS__Symbol("Symbol.species"), - toStringTag = __TS__Symbol("Symbol.toStringTag") - } -end - +local symbolMetatable = {__tostring = function(self) + return ("Symbol(" .. (self.description or "")) .. ")" +end} +local function __TS__Symbol(description) + return setmetatable({description = description}, symbolMetatable) +end +local Symbol = { + asyncDispose = __TS__Symbol("Symbol.asyncDispose"), + dispose = __TS__Symbol("Symbol.dispose"), + iterator = __TS__Symbol("Symbol.iterator"), + hasInstance = __TS__Symbol("Symbol.hasInstance"), + species = __TS__Symbol("Symbol.species"), + toStringTag = __TS__Symbol("Symbol.toStringTag") +} local function __TS__ArrayEntries(array) local key = 0 return { @@ -64,7 +57,6 @@ local function __TS__ArrayEntries(array) end } end - local function __TS__ArrayEvery(self, callbackfn, thisArg) for i = 1, #self do if not callbackfn(thisArg, self[i], i - 1, self) then @@ -73,7 +65,6 @@ local function __TS__ArrayEvery(self, callbackfn, thisArg) end return true end - local function __TS__ArrayFill(self, value, start, ____end) local relativeStart = start or 0 local relativeEnd = ____end or #self @@ -92,7 +83,6 @@ local function __TS__ArrayFill(self, value, start, ____end) end return self end - local function __TS__ArrayFilter(self, callbackfn, thisArg) local result = {} local len = 0 @@ -104,13 +94,6 @@ local function __TS__ArrayFilter(self, callbackfn, thisArg) end return result end - -local function __TS__ArrayForEach(self, callbackFn, thisArg) - for i = 1, #self do - callbackFn(thisArg, self[i], i - 1, self) - end -end - local function __TS__ArrayFind(self, predicate, thisArg) for i = 1, #self do local elem = self[i] @@ -120,7 +103,6 @@ local function __TS__ArrayFind(self, predicate, thisArg) end return nil end - local function __TS__ArrayFindIndex(self, callbackFn, thisArg) for i = 1, #self do if callbackFn(thisArg, self[i], i - 1, self) then @@ -129,84 +111,125 @@ local function __TS__ArrayFindIndex(self, callbackFn, thisArg) end return -1 end - -local __TS__Iterator -do - local function iteratorGeneratorStep(self) - local co = self.____coroutine - local status, value = coroutine.resume(co) - if not status then - error(value, 0) - end - if coroutine.status(co) == "dead" then - return - end - return true, value - end - local function iteratorIteratorStep(self) - local result = self:next() - if result.done then - return - end - return true, result.value - end - local function iteratorStringStep(self, index) - index = index + 1 - if index > #self then - return - end - return index, string.sub(self, index, index) - end - function __TS__Iterator(iterable) - if type(iterable) == "string" then - return iteratorStringStep, iterable, 0 - elseif iterable.____coroutine ~= nil then - return iteratorGeneratorStep, iterable - elseif iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - return iteratorIteratorStep, iterator +local function __TS__ArrayFlat(self, depth) + if depth == nil then + depth = 1 + end + local result = {} + local len = 0 + for i = 1, #self do + local value = self[i] + if depth > 0 and __TS__ArrayIsArray(value) then + local toAdd + if depth == 1 then + toAdd = value + else + toAdd = __TS__ArrayFlat(value, depth - 1) + end + for j = 1, #toAdd do + local val = toAdd[j] + len = len + 1 + result[len] = val + end else - return ipairs(iterable) + len = len + 1 + result[len] = value end end + return result end - -local __TS__ArrayFrom -do - local function arrayLikeStep(self, index) - index = index + 1 - if index > self.length then - return +local function __TS__ArrayFlatMap(self, callback, thisArg) + local result = {} + local len = 0 + for i = 1, #self do + local value = callback(thisArg, self[i], i - 1, self) + if __TS__ArrayIsArray(value) then + for j = 1, #value do + len = len + 1 + result[len] = value[j] + end + else + len = len + 1 + result[len] = value end - return index, self[index] end - local function arrayLikeIterator(arr) - if type(arr.length) == "number" then - return arrayLikeStep, arr, 0 - end - return __TS__Iterator(arr) + return result +end +local function __TS__ArrayForEach(self, callbackFn, thisArg) + for i = 1, #self do + callbackFn(thisArg, self[i], i - 1, self) end - function __TS__ArrayFrom(arrayLike, mapFn, thisArg) - local result = {} - if mapFn == nil then - for ____, v in arrayLikeIterator(arrayLike) do - result[#result + 1] = v - end - else - local i = 0 - for ____, v in arrayLikeIterator(arrayLike) do - local ____mapFn_3 = mapFn - local ____thisArg_1 = thisArg - local ____v_2 = v - local ____i_0 = i - i = ____i_0 + 1 - result[#result + 1] = ____mapFn_3(____thisArg_1, ____v_2, ____i_0) - end +end +local function iteratorGeneratorStep(self) + local co = self.____coroutine + local status, value = coroutine.resume(co) + if not status then + error(value, 0) + end + if coroutine.status(co) == "dead" then + return + end + return true, value +end +local function iteratorIteratorStep(self) + local result = self:next() + if result.done then + return + end + return true, result.value +end +local function iteratorStringStep(self, index) + index = index + 1 + if index > #self then + return + end + return index, string.sub(self, index, index) +end +local function __TS__Iterator(iterable) + if type(iterable) == "string" then + return iteratorStringStep, iterable, 0 + elseif iterable.____coroutine ~= nil then + return iteratorGeneratorStep, iterable + elseif iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + return iteratorIteratorStep, iterator + else + return ipairs(iterable) + end +end +local function arrayLikeStep(self, index) + index = index + 1 + if index > self.length then + return + end + return index, self[index] +end +local function arrayLikeIterator(arr) + if type(arr.length) == "number" then + return arrayLikeStep, arr, 0 + end + return __TS__Iterator(arr) +end +local function __TS__ArrayFrom(arrayLike, mapFn, thisArg) + local result = {} + if mapFn == nil then + for _, v in arrayLikeIterator(arrayLike) do + result[#result + 1] = v + end + else + local i = 0 + for _, v in arrayLikeIterator(arrayLike) do + local ____result_4 = result + local ____mapFn_3 = mapFn + local ____thisArg_1 = thisArg + local ____v_2 = v + local ____i_0 = i + i = ____i_0 + 1 + ____result_4[#____result_4 + 1] = ____mapFn_3(____thisArg_1, ____v_2, ____i_0) end - return result end + return result end - local function __TS__ArrayIncludes(self, searchElement, fromIndex) if fromIndex == nil then fromIndex = 0 @@ -226,7 +249,6 @@ local function __TS__ArrayIncludes(self, searchElement, fromIndex) end return false end - local function __TS__ArrayIndexOf(self, searchElement, fromIndex) if fromIndex == nil then fromIndex = 0 @@ -251,7 +273,6 @@ local function __TS__ArrayIndexOf(self, searchElement, fromIndex) end return -1 end - local function __TS__ArrayJoin(self, separator) if separator == nil then separator = "," @@ -262,7 +283,6 @@ local function __TS__ArrayJoin(self, separator) end return table.concat(parts, separator) end - local function __TS__ArrayMap(self, callbackfn, thisArg) local result = {} for i = 1, #self do @@ -270,7 +290,6 @@ local function __TS__ArrayMap(self, callbackfn, thisArg) end return result end - local function __TS__ArrayPush(self, ...) local items = {...} local len = #self @@ -280,7 +299,6 @@ local function __TS__ArrayPush(self, ...) end return len end - local function __TS__ArrayPushArray(self, items) local len = #self for i = 1, #items do @@ -289,17 +307,16 @@ local function __TS__ArrayPushArray(self, items) end return len end - local function __TS__CountVarargs(...) return select("#", ...) end - +local __TS__Unpack = table.unpack or unpack local function __TS__ArrayReduce(self, callbackFn, ...) local len = #self local k = 0 local accumulator = nil if __TS__CountVarargs(...) ~= 0 then - accumulator = ... + accumulator = __TS__Unpack({...}) elseif len > 0 then accumulator = self[1] k = 1 @@ -317,13 +334,12 @@ local function __TS__ArrayReduce(self, callbackFn, ...) end return accumulator end - local function __TS__ArrayReduceRight(self, callbackFn, ...) local len = #self local k = len - 1 local accumulator = nil if __TS__CountVarargs(...) ~= 0 then - accumulator = ... + accumulator = __TS__Unpack({...}) elseif len > 0 then accumulator = self[k + 1] k = k - 1 @@ -341,7 +357,6 @@ local function __TS__ArrayReduceRight(self, callbackFn, ...) end return accumulator end - local function __TS__ArrayReverse(self) local i = 1 local j = #self @@ -354,34 +369,18 @@ local function __TS__ArrayReverse(self) end return self end - -local function __TS__ArrayUnshift(self, ...) - local items = {...} - local numItemsToInsert = #items - if numItemsToInsert == 0 then - return #self - end - for i = #self, 1, -1 do - self[i + numItemsToInsert] = self[i] - end - for i = 1, numItemsToInsert do - self[i] = items[i] - end - return #self -end - -local function __TS__ArraySort(self, compareFn) - if compareFn ~= nil then - table.sort( - self, - function(a, b) return compareFn(nil, a, b) < 0 end +local function __TS__ArraySetLength(self, length) + if length < 0 or length ~= length or length == math.huge or math.floor(length) ~= length then + error( + "invalid array length: " .. tostring(length), + 0 ) - else - table.sort(self) end - return self + for i = length + 1, #self do + self[i] = nil + end + return length end - local function __TS__ArraySlice(self, first, last) local len = #self first = first or 0 @@ -417,7 +416,6 @@ local function __TS__ArraySlice(self, first, last) end return out end - local function __TS__ArraySome(self, callbackfn, thisArg) for i = 1, #self do if callbackfn(thisArg, self[i], i - 1, self) then @@ -426,7 +424,17 @@ local function __TS__ArraySome(self, callbackfn, thisArg) end return false end - +local function __TS__ArraySort(self, compareFn) + if compareFn ~= nil then + table.sort( + self, + function(a, b) return compareFn(nil, a, b) < 0 end + ) + else + table.sort(self) + end + return self +end local function __TS__ArraySplice(self, ...) local args = {...} local len = #self @@ -500,7 +508,6 @@ local function __TS__ArraySplice(self, ...) end return out end - local function __TS__ArrayToObject(self) local object = {} for i = 1, #self do @@ -508,98 +515,45 @@ local function __TS__ArrayToObject(self) end return object end - -local function __TS__ArrayFlat(self, depth) - if depth == nil then - depth = 1 - end - local result = {} - local len = 0 - for i = 1, #self do - local value = self[i] - if depth > 0 and __TS__ArrayIsArray(value) then - local toAdd - if depth == 1 then - toAdd = value - else - toAdd = __TS__ArrayFlat(value, depth - 1) - end - for j = 1, #toAdd do - local val = toAdd[j] - len = len + 1 - result[len] = val - end - else - len = len + 1 - result[len] = value - end - end - return result -end - -local function __TS__ArrayFlatMap(self, callback, thisArg) - local result = {} - local len = 0 - for i = 1, #self do - local value = callback(thisArg, self[i], i - 1, self) - if __TS__ArrayIsArray(value) then - for j = 1, #value do - len = len + 1 - result[len] = value[j] - end - else - len = len + 1 - result[len] = value - end - end - return result -end - -local function __TS__ArraySetLength(self, length) - if length < 0 or length ~= length or length == math.huge or math.floor(length) ~= length then - error( - "invalid array length: " .. tostring(length), - 0 - ) - end - for i = length + 1, #self do - self[i] = nil - end - return length -end - -local __TS__Unpack = table.unpack or unpack - local function __TS__ArrayToReversed(self) local copy = {__TS__Unpack(self)} __TS__ArrayReverse(copy) return copy end - local function __TS__ArrayToSorted(self, compareFn) local copy = {__TS__Unpack(self)} __TS__ArraySort(copy, compareFn) return copy end - local function __TS__ArrayToSpliced(self, start, deleteCount, ...) local copy = {__TS__Unpack(self)} __TS__ArraySplice(copy, start, deleteCount, ...) return copy end - +local function __TS__ArrayUnshift(self, ...) + local items = {...} + local numItemsToInsert = #items + if numItemsToInsert == 0 then + return #self + end + for i = #self, 1, -1 do + self[i + numItemsToInsert] = self[i] + end + for i = 1, numItemsToInsert do + self[i] = items[i] + end + return #self +end local function __TS__ArrayWith(self, index, value) local copy = {__TS__Unpack(self)} copy[index + 1] = value return copy end - local function __TS__New(target, ...) local instance = setmetatable({}, target.prototype) instance:____constructor(...) return instance end - local function __TS__InstanceOf(obj, classTbl) if type(classTbl) ~= "table" then error("Right-hand side of 'instanceof' is not an object", 0) @@ -618,206 +572,199 @@ local function __TS__InstanceOf(obj, classTbl) end return false end - local function __TS__Class(self) local c = {prototype = {}} c.prototype.__index = c.prototype c.prototype.constructor = c return c end - local __TS__Promise do - local function makeDeferredPromiseFactory() - local resolve - local reject - local function executor(____, res, rej) - resolve = res - reject = rej - end - return function() - local promise = __TS__New(__TS__Promise, executor) - return promise, resolve, reject - end - end - local makeDeferredPromise = makeDeferredPromiseFactory() - local function isPromiseLike(value) - return __TS__InstanceOf(value, __TS__Promise) - end - local function doNothing(self) - end - local ____pcall = _G.pcall - __TS__Promise = __TS__Class() - __TS__Promise.name = "__TS__Promise" - function __TS__Promise.prototype.____constructor(self, executor) - self.state = 0 - self.fulfilledCallbacks = {} - self.rejectedCallbacks = {} - local success, ____error = ____pcall( - executor, - nil, - function(____, v) return self:resolve(v) end, - function(____, err) return self:reject(err) end - ) - if not success then - self:reject(____error) - end +local function makeDeferredPromiseFactory() + local resolve + local reject + local function executor(____, res, rej) + resolve = res + reject = rej + end + return function() + local promise = __TS__New(__TS__Promise, executor) + return promise, resolve, reject + end +end +local makeDeferredPromise = makeDeferredPromiseFactory() +local function isPromiseLike(value) + return __TS__InstanceOf(value, __TS__Promise) +end +local function doNothing(self) +end +local ____pcall = _G.pcall +__TS__Promise = __TS__Class() +__TS__Promise.name = "__TS__Promise" +function __TS__Promise.prototype.____constructor(self, executor) + self.state = 0 + self.fulfilledCallbacks = {} + self.rejectedCallbacks = {} + local success, ____error = ____pcall( + executor, + nil, + function(____, v) return self:resolve(v) end, + function(____, err) return self:reject(err) end + ) + if not success then + self:reject(____error) end - function __TS__Promise.resolve(value) - if __TS__InstanceOf(value, __TS__Promise) then - return value - end - local promise = __TS__New(__TS__Promise, doNothing) - promise.state = 1 - promise.value = value - return promise - end - function __TS__Promise.reject(reason) - local promise = __TS__New(__TS__Promise, doNothing) - promise.state = 2 - promise.rejectionReason = reason - return promise - end - __TS__Promise.prototype["then"] = function(self, onFulfilled, onRejected) - local promise, resolve, reject = makeDeferredPromise() - self:addCallbacks( - onFulfilled and self:createPromiseResolvingCallback(onFulfilled, resolve, reject) or resolve, - onRejected and self:createPromiseResolvingCallback(onRejected, resolve, reject) or reject - ) - return promise +end +function __TS__Promise.resolve(value) + if __TS__InstanceOf(value, __TS__Promise) then + return value end - function __TS__Promise.prototype.addCallbacks(self, fulfilledCallback, rejectedCallback) - if self.state == 1 then - return fulfilledCallback(nil, self.value) - end - if self.state == 2 then - return rejectedCallback(nil, self.rejectionReason) - end - local ____self_fulfilledCallbacks_0 = self.fulfilledCallbacks - ____self_fulfilledCallbacks_0[#____self_fulfilledCallbacks_0 + 1] = fulfilledCallback - local ____self_rejectedCallbacks_1 = self.rejectedCallbacks - ____self_rejectedCallbacks_1[#____self_rejectedCallbacks_1 + 1] = rejectedCallback + local promise = __TS__New(__TS__Promise, doNothing) + promise.state = 1 + promise.value = value + return promise +end +function __TS__Promise.reject(reason) + local promise = __TS__New(__TS__Promise, doNothing) + promise.state = 2 + promise.rejectionReason = reason + return promise +end +__TS__Promise.prototype["then"] = function(self, onFulfilled, onRejected) + local promise, resolve, reject = makeDeferredPromise() + self:addCallbacks( + onFulfilled and self:createPromiseResolvingCallback(onFulfilled, resolve, reject) or resolve, + onRejected and self:createPromiseResolvingCallback(onRejected, resolve, reject) or reject + ) + return promise +end +function __TS__Promise.prototype.addCallbacks(self, fulfilledCallback, rejectedCallback) + if self.state == 1 then + return fulfilledCallback(nil, self.value) end - function __TS__Promise.prototype.catch(self, onRejected) - return self["then"](self, nil, onRejected) + if self.state == 2 then + return rejectedCallback(nil, self.rejectionReason) end - function __TS__Promise.prototype.finally(self, onFinally) - return self["then"]( - self, - onFinally and (function(____, value) - onFinally(nil) - return value - end) or nil, - onFinally and (function(____, reason) - onFinally(nil) - error(reason, 0) - end) or nil - ) + local ____self_fulfilledCallbacks_0 = self.fulfilledCallbacks + ____self_fulfilledCallbacks_0[#____self_fulfilledCallbacks_0 + 1] = fulfilledCallback + local ____self_rejectedCallbacks_1 = self.rejectedCallbacks + ____self_rejectedCallbacks_1[#____self_rejectedCallbacks_1 + 1] = rejectedCallback +end +function __TS__Promise.prototype.catch(self, onRejected) + return self["then"](self, nil, onRejected) +end +function __TS__Promise.prototype.finally(self, onFinally) + return self["then"]( + self, + onFinally and (function(____, value) + onFinally(nil) + return value + end) or nil, + onFinally and (function(____, reason) + onFinally(nil) + error(reason, 0) + end) or nil + ) +end +function __TS__Promise.prototype.resolve(self, value) + if isPromiseLike(value) then + return value:addCallbacks( + function(____, v) return self:resolve(v) end, + function(____, err) return self:reject(err) end + ) end - function __TS__Promise.prototype.resolve(self, value) - if isPromiseLike(value) then - return value:addCallbacks( - function(____, v) return self:resolve(v) end, - function(____, err) return self:reject(err) end - ) - end - if self.state == 0 then - self.state = 1 - self.value = value - return self:invokeCallbacks(self.fulfilledCallbacks, value) - end + if self.state == 0 then + self.state = 1 + self.value = value + return self:invokeCallbacks(self.fulfilledCallbacks, value) end - function __TS__Promise.prototype.reject(self, reason) - if self.state == 0 then - self.state = 2 - self.rejectionReason = reason - return self:invokeCallbacks(self.rejectedCallbacks, reason) - end +end +function __TS__Promise.prototype.reject(self, reason) + if self.state == 0 then + self.state = 2 + self.rejectionReason = reason + return self:invokeCallbacks(self.rejectedCallbacks, reason) end - function __TS__Promise.prototype.invokeCallbacks(self, callbacks, value) - local callbacksLength = #callbacks - if callbacksLength ~= 0 then - for i = 1, callbacksLength - 1 do - callbacks[i](callbacks, value) - end - return callbacks[callbacksLength](callbacks, value) +end +function __TS__Promise.prototype.invokeCallbacks(self, callbacks, value) + local callbacksLength = #callbacks + if callbacksLength ~= 0 then + for i = 1, callbacksLength - 1 do + callbacks[i](callbacks, value) end + return callbacks[callbacksLength](callbacks, value) end - function __TS__Promise.prototype.createPromiseResolvingCallback(self, f, resolve, reject) - return function(____, value) - local success, resultOrError = ____pcall(f, nil, value) - if not success then - return reject(nil, resultOrError) - end - return self:handleCallbackValue(resultOrError, resolve, reject) +end +function __TS__Promise.prototype.createPromiseResolvingCallback(self, f, resolve, reject) + return function(____, value) + local success, resultOrError = ____pcall(f, nil, value) + if not success then + return reject(nil, resultOrError) end + return self:handleCallbackValue(resultOrError, resolve, reject) end - function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, reject) - if isPromiseLike(value) then - local nextpromise = value - if nextpromise.state == 1 then - return resolve(nil, nextpromise.value) - elseif nextpromise.state == 2 then - return reject(nil, nextpromise.rejectionReason) - else - return nextpromise:addCallbacks(resolve, reject) - end +end +function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, reject) + if isPromiseLike(value) then + local nextpromise = value + if nextpromise.state == 1 then + return resolve(nil, nextpromise.value) + elseif nextpromise.state == 2 then + return reject(nil, nextpromise.rejectionReason) else - return resolve(nil, value) + return nextpromise:addCallbacks(resolve, reject) end + else + return resolve(nil, value) end end - -local __TS__AsyncAwaiter, __TS__Await -do - local ____coroutine = _G.coroutine or ({}) - local cocreate = ____coroutine.create - local coresume = ____coroutine.resume - local costatus = ____coroutine.status - local coyield = ____coroutine.yield - function __TS__AsyncAwaiter(generator) - return __TS__New( - __TS__Promise, - function(____, resolve, reject) - local fulfilled, step, resolved, asyncCoroutine - function fulfilled(self, value) - local success, resultOrError = coresume(asyncCoroutine, value) - if success then - return step(resultOrError) - end - return reject(nil, resultOrError) - end - function step(result) - if resolved then - return - end - if costatus(asyncCoroutine) == "dead" then - return resolve(nil, result) - end - return __TS__Promise.resolve(result):addCallbacks(fulfilled, reject) - end - resolved = false - asyncCoroutine = cocreate(generator) - local success, resultOrError = coresume( - asyncCoroutine, - function(____, v) - resolved = true - return __TS__Promise.resolve(v):addCallbacks(resolve, reject) - end - ) +end +local ____coroutine = _G.coroutine or ({}) +local cocreate = ____coroutine.create +local coresume = ____coroutine.resume +local costatus = ____coroutine.status +local coyield = ____coroutine.yield +local function __TS__AsyncAwaiter(generator) + return __TS__New( + __TS__Promise, + function(____, resolve, reject) + local fulfilled, step, resolved, asyncCoroutine + function fulfilled(self, value) + local success, resultOrError = coresume(asyncCoroutine, value) if success then return step(resultOrError) - else - return reject(nil, resultOrError) end + return reject(nil, resultOrError) end - ) - end - function __TS__Await(thing) - return coyield(thing) - end + function step(result) + if resolved then + return + end + if costatus(asyncCoroutine) == "dead" then + return resolve(nil, result) + end + return __TS__Promise.resolve(result):addCallbacks(fulfilled, reject) + end + resolved = false + asyncCoroutine = cocreate(generator) + local success, resultOrError = coresume( + asyncCoroutine, + function(____, v) + resolved = true + return __TS__Promise.resolve(v):addCallbacks(resolve, reject) + end + ) + if success then + return step(resultOrError) + else + return reject(nil, resultOrError) + end + end + ) +end +local function __TS__Await(thing) + return coyield(thing) end - local function __TS__ClassExtends(target, base) target.____super = base local staticMetatable = setmetatable({__index = base}, base) @@ -842,7 +789,6 @@ local function __TS__ClassExtends(target, base) target.prototype.__tostring = base.prototype.__tostring end end - local function __TS__CloneDescriptor(____bindingPattern0) local value local writable @@ -871,7 +817,6 @@ local function __TS__CloneDescriptor(____bindingPattern0) end return descriptor end - local function __TS__Decorate(self, originalValue, decorators, context) local result = originalValue do @@ -890,18 +835,6 @@ local function __TS__Decorate(self, originalValue, decorators, context) end return result end - -local function __TS__ObjectAssign(target, ...) - local sources = {...} - for i = 1, #sources do - local source = sources[i] - for key in pairs(source) do - target[key] = source[key] - end - end - return target -end - local function __TS__ObjectGetOwnPropertyDescriptor(object, key) local metatable = getmetatable(object) if not metatable then @@ -912,116 +845,113 @@ local function __TS__ObjectGetOwnPropertyDescriptor(object, key) end return rawget(metatable, "_descriptors")[key] end - -local __TS__DescriptorGet -do - local getmetatable = _G.getmetatable - local ____rawget = _G.rawget - function __TS__DescriptorGet(self, metatable, key) - while metatable do - local rawResult = ____rawget(metatable, key) - if rawResult ~= nil then - return rawResult - end - local descriptors = ____rawget(metatable, "_descriptors") - if descriptors then - local descriptor = descriptors[key] - if descriptor ~= nil then - if descriptor.get then - return descriptor.get(self) - end - return descriptor.value +local getmetatable = _G.getmetatable +local ____rawget = _G.rawget +local function __TS__DescriptorGet(self, metatable, key) + while metatable do + local rawResult = ____rawget(metatable, key) + if rawResult ~= nil then + return rawResult + end + local descriptors = ____rawget(metatable, "_descriptors") + if descriptors then + local descriptor = descriptors[key] + if descriptor ~= nil then + if descriptor.get then + return descriptor.get(self) end + return descriptor.value end - metatable = getmetatable(metatable) end + metatable = getmetatable(metatable) end end - -local __TS__DescriptorSet -do - local getmetatable = _G.getmetatable - local ____rawget = _G.rawget - local rawset = _G.rawset - function __TS__DescriptorSet(self, metatable, key, value) - while metatable do - local descriptors = ____rawget(metatable, "_descriptors") - if descriptors then - local descriptor = descriptors[key] - if descriptor ~= nil then - if descriptor.set then - descriptor.set(self, value) - else - if descriptor.writable == false then - error( - ((("Cannot assign to read only property '" .. key) .. "' of object '") .. tostring(self)) .. "'", - 0 - ) - end - descriptor.value = value +local getmetatable = _G.getmetatable +local ____rawget = _G.rawget +local ____rawset = _G.rawset +local function __TS__DescriptorSet(self, metatable, key, value) + while metatable do + local descriptors = ____rawget(metatable, "_descriptors") + if descriptors then + local descriptor = descriptors[key] + if descriptor ~= nil then + if descriptor.set then + descriptor.set(self, value) + else + if descriptor.writable == false then + error( + ((("Cannot assign to read only property '" .. key) .. "' of object '") .. tostring(self)) .. "'", + 0 + ) end - return + descriptor.value = value end + return end - metatable = getmetatable(metatable) end - rawset(self, key, value) + metatable = getmetatable(metatable) end + ____rawset(self, key, value) end - -local __TS__SetDescriptor -do - local getmetatable = _G.getmetatable - local function descriptorIndex(self, key) - return __TS__DescriptorGet( - self, - getmetatable(self), - key - ) +local getmetatable = _G.getmetatable +local function descriptorIndex(self, key) + return __TS__DescriptorGet( + self, + getmetatable(self), + key + ) +end +local function descriptorNewIndex(self, key, value) + return __TS__DescriptorSet( + self, + getmetatable(self), + key, + value + ) +end +local function __TS__SetDescriptor(target, key, desc, isPrototype) + if isPrototype == nil then + isPrototype = false end - local function descriptorNewIndex(self, key, value) - return __TS__DescriptorSet( - self, - getmetatable(self), - key, - value - ) + local ____isPrototype_0 + if isPrototype then + ____isPrototype_0 = target + else + ____isPrototype_0 = getmetatable(target) end - function __TS__SetDescriptor(target, key, desc, isPrototype) - if isPrototype == nil then - isPrototype = false - end - local ____isPrototype_0 - if isPrototype then - ____isPrototype_0 = target - else - ____isPrototype_0 = getmetatable(target) - end - local metatable = ____isPrototype_0 - if not metatable then - metatable = {} - setmetatable(target, metatable) - end - if not isPrototype and not rawget(metatable, "_isOwnDescriptorMetatable") then - local instanceMetatable = {} - instanceMetatable._isOwnDescriptorMetatable = true - setmetatable(instanceMetatable, metatable) - setmetatable(target, instanceMetatable) - metatable = instanceMetatable - end - local value = rawget(target, key) - if value ~= nil then - rawset(target, key, nil) - end - if not rawget(metatable, "_descriptors") then - metatable._descriptors = {} + local metatable = ____isPrototype_0 + if not metatable then + metatable = {} + setmetatable(target, metatable) + end + if not isPrototype and not rawget(metatable, "_isOwnDescriptorMetatable") then + local instanceMetatable = {} + instanceMetatable._isOwnDescriptorMetatable = true + setmetatable(instanceMetatable, metatable) + setmetatable(target, instanceMetatable) + metatable = instanceMetatable + end + local value = rawget(target, key) + if value ~= nil then + rawset(target, key, nil) + end + if not rawget(metatable, "_descriptors") then + metatable._descriptors = {} + end + metatable._descriptors[key] = __TS__CloneDescriptor(desc) + metatable.__index = descriptorIndex + metatable.__newindex = descriptorNewIndex +end +local function __TS__ObjectAssign(target, ...) + local sources = {...} + for i = 1, #sources do + local source = sources[i] + for key in pairs(source) do + target[key] = source[key] end - metatable._descriptors[key] = __TS__CloneDescriptor(desc) - metatable.__index = descriptorIndex - metatable.__newindex = descriptorNewIndex end + return target end - local function __TS__DecorateLegacy(decorators, target, key, desc) local result = target do @@ -1058,140 +988,14 @@ local function __TS__DecorateLegacy(decorators, target, key, desc) end return result end - local function __TS__DecorateParam(paramIndex, decorator) return function(____, target, key) return decorator(nil, target, key, paramIndex) end end - -local function __TS__StringIncludes(self, searchString, position) - if not position then - position = 1 - else - position = position + 1 - end - local index = string.find(self, searchString, position, true) - return index ~= nil -end - -local Error, RangeError, ReferenceError, SyntaxError, TypeError, URIError -do - local function getErrorStack(self, constructor) - if debug == nil then - return nil - end - local level = 1 - while true do - local info = debug.getinfo(level, "f") - level = level + 1 - if not info then - level = 1 - break - elseif info.func == constructor then - break - end - end - if __TS__StringIncludes(_VERSION, "Lua 5.0") then - return debug.traceback(("[Level " .. tostring(level)) .. "]") - elseif _VERSION == "Lua 5.1" then - return string.sub( - debug.traceback("", level), - 2 - ) - else - return debug.traceback(nil, level) - end - end - local function wrapErrorToString(self, getDescription) - return function(self) - local description = getDescription(self) - local caller = debug.getinfo(3, "f") - local isClassicLua = __TS__StringIncludes(_VERSION, "Lua 5.0") - if isClassicLua or caller and caller.func ~= error then - return description - else - return (description .. "\n") .. tostring(self.stack) - end - end - end - local function initErrorClass(self, Type, name) - Type.name = name - return setmetatable( - Type, - {__call = function(____, _self, message) return __TS__New(Type, message) end} - ) - end - local ____initErrorClass_1 = initErrorClass - local ____class_0 = __TS__Class() - ____class_0.name = "" - function ____class_0.prototype.____constructor(self, message) - if message == nil then - message = "" - end - self.message = message - self.name = "Error" - self.stack = getErrorStack(nil, __TS__New) - local metatable = getmetatable(self) - if metatable and not metatable.__errorToStringPatched then - metatable.__errorToStringPatched = true - metatable.__tostring = wrapErrorToString(nil, metatable.__tostring) - end - end - function ____class_0.prototype.__tostring(self) - return self.message ~= "" and (self.name .. ": ") .. self.message or self.name - end - Error = ____initErrorClass_1(nil, ____class_0, "Error") - local function createErrorClass(self, name) - local ____initErrorClass_3 = initErrorClass - local ____class_2 = __TS__Class() - ____class_2.name = ____class_2.name - __TS__ClassExtends(____class_2, Error) - function ____class_2.prototype.____constructor(self, ...) - ____class_2.____super.prototype.____constructor(self, ...) - self.name = name - end - return ____initErrorClass_3(nil, ____class_2, name) - end - RangeError = createErrorClass(nil, "RangeError") - ReferenceError = createErrorClass(nil, "ReferenceError") - SyntaxError = createErrorClass(nil, "SyntaxError") - TypeError = createErrorClass(nil, "TypeError") - URIError = createErrorClass(nil, "URIError") -end - -local function __TS__ObjectGetOwnPropertyDescriptors(object) - local metatable = getmetatable(object) - if not metatable then - return {} - end - return rawget(metatable, "_descriptors") or ({}) -end - -local function __TS__Delete(target, key) - local descriptors = __TS__ObjectGetOwnPropertyDescriptors(target) - local descriptor = descriptors[key] - if descriptor then - if not descriptor.configurable then - error( - __TS__New( - TypeError, - ((("Cannot delete property " .. tostring(key)) .. " of ") .. tostring(target)) .. "." - ), - 0 - ) - end - descriptors[key] = nil - return true - end - target[key] = nil - return true -end - local function __TS__StringAccess(self, index) if index >= 0 and index < #self then return string.sub(self, index + 1, index + 1) end end - local function __TS__DelegatedYield(iterable) if type(iterable) == "string" then for index = 0, #iterable - 1 do @@ -1226,7 +1030,122 @@ local function __TS__DelegatedYield(iterable) end end end - +local function __TS__ObjectGetOwnPropertyDescriptors(object) + local metatable = getmetatable(object) + if not metatable then + return {} + end + return rawget(metatable, "_descriptors") or ({}) +end +local function __TS__StringIncludes(self, searchString, position) + if not position then + position = 1 + else + position = position + 1 + end + local index = string.find(self, searchString, position, true) + return index ~= nil +end +local function getErrorStack(self, constructor) + if debug == nil then + return nil + end + local level = 1 + while true do + local info = debug.getinfo(level, "f") + level = level + 1 + if not info then + level = 1 + break + elseif info.func == constructor then + break + end + end + if __TS__StringIncludes(_VERSION, "Lua 5.0") then + return debug.traceback(("[Level " .. tostring(level)) .. "]") + elseif _VERSION == "Lua 5.1" then + return string.sub( + debug.traceback("", level), + 2 + ) + else + return debug.traceback(nil, level) + end +end +local function wrapErrorToString(self, getDescription) + return function(self) + local description = getDescription(self) + local caller = debug.getinfo(3, "f") + local isClassicLua = __TS__StringIncludes(_VERSION, "Lua 5.0") + if isClassicLua or caller and caller.func ~= error then + return description + else + return (description .. "\n") .. tostring(self.stack) + end + end +end +local function initErrorClass(self, Type, name) + Type.name = name + return setmetatable( + Type, + {__call = function(____, _self, message) return __TS__New(Type, message) end} + ) +end +local ____initErrorClass_1 = initErrorClass +local ____class_0 = __TS__Class() +____class_0.name = ____class_0.name +function ____class_0.prototype.____constructor(self, message) + if message == nil then + message = "" + end + self.name = "Error" + self.message = message + self.stack = getErrorStack(nil, __TS__New) + local metatable = getmetatable(self) + if metatable and not metatable.__errorToStringPatched then + metatable.__errorToStringPatched = true + metatable.__tostring = wrapErrorToString(nil, metatable.__tostring) + end +end +function ____class_0.prototype.__tostring(self) + return self.message ~= "" and (self.name .. ": ") .. self.message or self.name +end +local Error = ____initErrorClass_1(nil, ____class_0, "Error") +local function createErrorClass(self, name) + local ____initErrorClass_3 = initErrorClass + local ____class_2 = __TS__Class() + ____class_2.name = ____class_2.name + __TS__ClassExtends(____class_2, Error) + function ____class_2.prototype.____constructor(self, ...) + ____class_2.____super.prototype.____constructor(self, ...) + self.name = name + end + return ____initErrorClass_3(nil, ____class_2, name) +end +local RangeError = createErrorClass(nil, "RangeError") +local ReferenceError = createErrorClass(nil, "ReferenceError") +local SyntaxError = createErrorClass(nil, "SyntaxError") +local TypeError = createErrorClass(nil, "TypeError") +local URIError = createErrorClass(nil, "URIError") +local function __TS__Delete(target, key) + local descriptors = __TS__ObjectGetOwnPropertyDescriptors(target) + local descriptor = descriptors[key] + if descriptor then + if not descriptor.configurable then + error( + __TS__New( + TypeError, + ((("Cannot delete property " .. tostring(key)) .. " of ") .. tostring(target)) .. "." + ), + 0 + ) + end + descriptors[key] = nil + return true + end + target[key] = nil + return true +end local function __TS__FunctionBind(fn, ...) local boundArgs = {...} return function(____, ...) @@ -1238,44 +1157,38 @@ local function __TS__FunctionBind(fn, ...) return fn(__TS__Unpack(args)) end end - -local __TS__Generator -do - local function generatorIterator(self) - return self +local function generatorIterator(self) + return self +end +local function generatorNext(self, ...) + local co = self.____coroutine + if coroutine.status(co) == "dead" then + return {done = true} end - local function generatorNext(self, ...) - local co = self.____coroutine - if coroutine.status(co) == "dead" then - return {done = true} - end - local status, value = coroutine.resume(co, ...) - if not status then - error(value, 0) - end + local status, value = coroutine.resume(co, ...) + if not status then + error(value, 0) + end + return { + value = value, + done = coroutine.status(co) == "dead" + } +end +local function __TS__Generator(fn) + return function(...) + local args = {...} + local argsLength = __TS__CountVarargs(...) return { - value = value, - done = coroutine.status(co) == "dead" + ____coroutine = coroutine.create(function() return fn(__TS__Unpack(args, 1, argsLength)) end), + [Symbol.iterator] = generatorIterator, + next = generatorNext } end - function __TS__Generator(fn) - return function(...) - local args = {...} - local argsLength = __TS__CountVarargs(...) - return { - ____coroutine = coroutine.create(function() return fn(__TS__Unpack(args, 1, argsLength)) end), - [Symbol.iterator] = generatorIterator, - next = generatorNext - } - end - end end - local function __TS__InstanceOfObject(value) local valueType = type(value) return valueType == "table" or valueType == "function" end - local function __TS__LuaIteratorSpread(self, state, firstKey) local results = {} local key, value = self(state, firstKey) @@ -1285,172 +1198,170 @@ local function __TS__LuaIteratorSpread(self, state, firstKey) end return __TS__Unpack(results) end - local Map do - Map = __TS__Class() - Map.name = "Map" - function Map.prototype.____constructor(self, entries) - self[Symbol.toStringTag] = "Map" - self.items = {} - self.size = 0 - self.nextKey = {} - self.previousKey = {} - if entries == nil then - return - end - local iterable = entries - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break - end - local value = result.value - self:set(value[1], value[2]) - end - else - local array = entries - for ____, kvp in ipairs(array) do - self:set(kvp[1], kvp[2]) - end - end +Map = __TS__Class() +Map.name = "Map" +function Map.prototype.____constructor(self, entries) + self[Symbol.toStringTag] = "Map" + self.items = {} + self.size = 0 + self.nextKey = {} + self.previousKey = {} + if entries == nil then + return end - function Map.prototype.clear(self) - self.items = {} - self.nextKey = {} - self.previousKey = {} - self.firstKey = nil - self.lastKey = nil - self.size = 0 - end - function Map.prototype.delete(self, key) - local contains = self:has(key) - if contains then - self.size = self.size - 1 - local next = self.nextKey[key] - local previous = self.previousKey[key] - if next ~= nil and previous ~= nil then - self.nextKey[previous] = next - self.previousKey[next] = previous - elseif next ~= nil then - self.firstKey = next - self.previousKey[next] = nil - elseif previous ~= nil then - self.lastKey = previous - self.nextKey[previous] = nil - else - self.firstKey = nil - self.lastKey = nil + local iterable = entries + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break end - self.nextKey[key] = nil - self.previousKey[key] = nil + local value = result.value -- Ensures index is offset when tuple is accessed + self:set(value[1], value[2]) end - self.items[key] = nil - return contains - end - function Map.prototype.forEach(self, callback) - for ____, key in __TS__Iterator(self:keys()) do - callback(nil, self.items[key], key, self) + else + local array = entries + for ____, kvp in ipairs(array) do + self:set(kvp[1], kvp[2]) + end + end +end +function Map.prototype.clear(self) + self.items = {} + self.nextKey = {} + self.previousKey = {} + self.firstKey = nil + self.lastKey = nil + self.size = 0 +end +function Map.prototype.delete(self, key) + local contains = self:has(key) + if contains then + self.size = self.size - 1 + local next = self.nextKey[key] + local previous = self.previousKey[key] + if next ~= nil and previous ~= nil then + self.nextKey[previous] = next + self.previousKey[next] = previous + elseif next ~= nil then + self.firstKey = next + self.previousKey[next] = nil + elseif previous ~= nil then + self.lastKey = previous + self.nextKey[previous] = nil + else + self.firstKey = nil + self.lastKey = nil end + self.nextKey[key] = nil + self.previousKey[key] = nil end - function Map.prototype.get(self, key) - return self.items[key] + self.items[key] = nil + return contains +end +function Map.prototype.forEach(self, callback) + for ____, key in __TS__Iterator(self:keys()) do + callback(nil, self.items[key], key, self) end - function Map.prototype.has(self, key) - return self.nextKey[key] ~= nil or self.lastKey == key +end +function Map.prototype.get(self, key) + return self.items[key] +end +function Map.prototype.has(self, key) + return self.nextKey[key] ~= nil or self.lastKey == key +end +function Map.prototype.set(self, key, value) + local isNewValue = not self:has(key) + if isNewValue then + self.size = self.size + 1 end - function Map.prototype.set(self, key, value) - local isNewValue = not self:has(key) - if isNewValue then - self.size = self.size + 1 - end - self.items[key] = value - if self.firstKey == nil then - self.firstKey = key - self.lastKey = key - elseif isNewValue then - self.nextKey[self.lastKey] = key - self.previousKey[key] = self.lastKey - self.lastKey = key - end - return self + self.items[key] = value + if self.firstKey == nil then + self.firstKey = key + self.lastKey = key + elseif isNewValue then + self.nextKey[self.lastKey] = key + self.previousKey[key] = self.lastKey + self.lastKey = key end - Map.prototype[Symbol.iterator] = function(self) - return self:entries() + return self +end +Map.prototype[Symbol.iterator] = function(self) + return self:entries() +end +function Map.prototype.entries(self) + local function getFirstKey() + return self.firstKey end - function Map.prototype.entries(self) - local function getFirstKey() - return self.firstKey - end - local items = self.items - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = {key, items[key]}} + local items = self.items + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] end - } - end - function Map.prototype.keys(self) - local function getFirstKey() - return self.firstKey + return {done = not key, value = {key, items[key]}} end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = key} - end - } + } +end +function Map.prototype.keys(self) + local function getFirstKey() + return self.firstKey end - function Map.prototype.values(self) - local function getFirstKey() - return self.firstKey - end - local items = self.items - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = items[key]} + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] end - } + return {done = not key, value = key} + end + } +end +function Map.prototype.values(self) + local function getFirstKey() + return self.firstKey end - Map[Symbol.species] = Map + local items = self.items + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = items[key]} + end + } +end +Map[Symbol.species] = Map end - local function __TS__MapGroupBy(items, keySelector) local result = __TS__New(Map) local i = 0 @@ -1466,17 +1377,12 @@ local function __TS__MapGroupBy(items, keySelector) end return result end - local __TS__Match = string.match - local __TS__MathAtan2 = math.atan2 or math.atan - local __TS__MathModf = math.modf - local function __TS__NumberIsNaN(value) return value ~= value end - local function __TS__MathSign(val) if __TS__NumberIsNaN(val) or val == 0 then return val @@ -1486,18 +1392,15 @@ local function __TS__MathSign(val) end return 1 end - local function __TS__NumberIsFinite(value) return type(value) == "number" and value == value and value ~= math.huge and value ~= -math.huge end - local function __TS__MathTrunc(val) if not __TS__NumberIsFinite(val) or val == 0 then return val end return val > 0 and math.floor(val) or math.ceil(val) end - local function __TS__Number(value) local valueType = type(value) if valueType == "number" then @@ -1524,112 +1427,9 @@ local function __TS__Number(value) return 0 / 0 end end - local function __TS__NumberIsInteger(value) return __TS__NumberIsFinite(value) and math.floor(value) == value end - -local function __TS__StringSubstring(self, start, ____end) - if ____end ~= ____end then - ____end = 0 - end - if ____end ~= nil and start > ____end then - start, ____end = ____end, start - end - if start >= 0 then - start = start + 1 - else - start = 1 - end - if ____end ~= nil and ____end < 0 then - ____end = 0 - end - return string.sub(self, start, ____end) -end - -local __TS__ParseInt -do - local parseIntBasePattern = "0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTvVwWxXyYzZ" - function __TS__ParseInt(numberString, base) - if base == nil then - base = 10 - local hexMatch = __TS__Match(numberString, "^%s*-?0[xX]") - if hexMatch ~= nil then - base = 16 - numberString = (__TS__Match(hexMatch, "-")) and "-" .. __TS__StringSubstring(numberString, #hexMatch) or __TS__StringSubstring(numberString, #hexMatch) - end - end - if base < 2 or base > 36 then - return 0 / 0 - end - local allowedDigits = base <= 10 and __TS__StringSubstring(parseIntBasePattern, 0, base) or __TS__StringSubstring(parseIntBasePattern, 0, 10 + 2 * (base - 10)) - local pattern = ("^%s*(-?[" .. allowedDigits) .. "]*)" - local number = tonumber((__TS__Match(numberString, pattern)), base) - if number == nil then - return 0 / 0 - end - if number >= 0 then - return math.floor(number) - else - return math.ceil(number) - end - end -end - -local function __TS__ParseFloat(numberString) - local infinityMatch = __TS__Match(numberString, "^%s*(-?Infinity)") - if infinityMatch ~= nil then - return __TS__StringAccess(infinityMatch, 0) == "-" and -math.huge or math.huge - end - local number = tonumber((__TS__Match(numberString, "^%s*(-?%d+%.?%d*)"))) - return number or 0 / 0 -end - -local __TS__NumberToString -do - local radixChars = "0123456789abcdefghijklmnopqrstuvwxyz" - function __TS__NumberToString(self, radix) - if radix == nil or radix == 10 or self == math.huge or self == -math.huge or self ~= self then - return tostring(self) - end - radix = math.floor(radix) - if radix < 2 or radix > 36 then - error("toString() radix argument must be between 2 and 36", 0) - end - local integer, fraction = __TS__MathModf(math.abs(self)) - local result = "" - if radix == 8 then - result = string.format("%o", integer) - elseif radix == 16 then - result = string.format("%x", integer) - else - repeat - do - result = __TS__StringAccess(radixChars, integer % radix) .. result - integer = math.floor(integer / radix) - end - until not (integer ~= 0) - end - if fraction ~= 0 then - result = result .. "." - local delta = 1e-16 - repeat - do - fraction = fraction * radix - delta = delta * radix - local digit = math.floor(fraction) - result = result .. __TS__StringAccess(radixChars, digit) - fraction = fraction - digit - end - until not (fraction >= delta) - end - if self < 0 then - result = "-" .. result - end - return result - end -end - local function __TS__NumberToFixed(self, fractionDigits) if math.abs(self) >= 1e+21 or self ~= self then return tostring(self) @@ -1643,7 +1443,47 @@ local function __TS__NumberToFixed(self, fractionDigits) self ) end - +local radixChars = "0123456789abcdefghijklmnopqrstuvwxyz" +local function __TS__NumberToString(self, radix) + if radix == nil or radix == 10 or self == math.huge or self == -math.huge or self ~= self then + return tostring(self) + end + radix = math.floor(radix) + if radix < 2 or radix > 36 then + error("toString() radix argument must be between 2 and 36", 0) + end + local integer, fraction = __TS__MathModf(math.abs(self)) + local result = "" + if radix == 8 then + result = string.format("%o", integer) + elseif radix == 16 then + result = string.format("%x", integer) + else + repeat + do + result = __TS__StringAccess(radixChars, integer % radix) .. result + integer = math.floor(integer / radix) + end + until not (integer ~= 0) + end + if fraction ~= 0 then + result = result .. "." + local delta = 1e-16 + repeat + do + fraction = fraction * radix + delta = delta * radix + local digit = math.floor(fraction) + result = result .. __TS__StringAccess(radixChars, digit) + fraction = fraction - digit + end + until not (fraction >= delta) + end + if self < 0 then + result = "-" .. result + end + return result +end local function __TS__ObjectDefineProperty(target, key, desc) local luaKey = type(key) == "number" and key + 1 or key local value = rawget(target, luaKey) @@ -1691,7 +1531,6 @@ local function __TS__ObjectDefineProperty(target, key, desc) __TS__SetDescriptor(target, luaKey, descriptor) return target end - local function __TS__ObjectEntries(obj) local result = {} local len = 0 @@ -1701,7 +1540,6 @@ local function __TS__ObjectEntries(obj) end return result end - local function __TS__ObjectFromEntries(entries) local obj = {} local iterable = entries @@ -1722,7 +1560,6 @@ local function __TS__ObjectFromEntries(entries) end return obj end - local function __TS__ObjectGroupBy(items, keySelector) local result = {} local i = 0 @@ -1738,7 +1575,6 @@ local function __TS__ObjectGroupBy(items, keySelector) end return result end - local function __TS__ObjectKeys(obj) local result = {} local len = 0 @@ -1748,7 +1584,6 @@ local function __TS__ObjectKeys(obj) end return result end - local function __TS__ObjectRest(target, usedProperties) local result = {} for property in pairs(target) do @@ -1758,7 +1593,6 @@ local function __TS__ObjectRest(target, usedProperties) end return result end - local function __TS__ObjectValues(obj) local result = {} local len = 0 @@ -1768,7 +1602,56 @@ local function __TS__ObjectValues(obj) end return result end - +local function __TS__ParseFloat(numberString) + local infinityMatch = __TS__Match(numberString, "^%s*(-?Infinity)") + if infinityMatch ~= nil then + return __TS__StringAccess(infinityMatch, 0) == "-" and -math.huge or math.huge + end + local number = tonumber((__TS__Match(numberString, "^%s*(-?%d+%.?%d*)"))) + return number or 0 / 0 +end +local function __TS__StringSubstring(self, start, ____end) + if ____end ~= ____end then + ____end = 0 + end + if ____end ~= nil and start > ____end then + start, ____end = __TS__Unpack({____end, start}) + end + if start >= 0 then + start = start + 1 + else + start = 1 + end + if ____end ~= nil and ____end < 0 then + ____end = 0 + end + return string.sub(self, start, ____end) +end +local parseIntBasePattern = "0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTvVwWxXyYzZ" +local function __TS__ParseInt(numberString, base) + if base == nil then + base = 10 + local hexMatch = __TS__Match(numberString, "^%s*-?0[xX]") + if hexMatch ~= nil then + base = 16 + numberString = (__TS__Match(hexMatch, "-")) and "-" .. __TS__StringSubstring(numberString, #hexMatch) or __TS__StringSubstring(numberString, #hexMatch) + end + end + if base < 2 or base > 36 then + return 0 / 0 + end + local allowedDigits = base <= 10 and __TS__StringSubstring(parseIntBasePattern, 0, base) or __TS__StringSubstring(parseIntBasePattern, 0, 10 + 2 * (base - 10)) + local pattern = ("^%s*(-?[" .. allowedDigits) .. "]*)" + local number = tonumber((__TS__Match(numberString, pattern)), base) + if number == nil then + return 0 / 0 + end + if number >= 0 then + return math.floor(number) + else + return math.ceil(number) + end +end local function __TS__PromiseAll(iterable) local results = {} local toResolve = {} @@ -1813,7 +1696,6 @@ local function __TS__PromiseAll(iterable) end ) end - local function __TS__PromiseAllSettled(iterable) local results = {} local toResolve = {} @@ -1862,7 +1744,6 @@ local function __TS__PromiseAllSettled(iterable) end ) end - local function __TS__PromiseAny(iterable) local rejections = {} local pending = {} @@ -1904,7 +1785,6 @@ local function __TS__PromiseAny(iterable) end ) end - local function __TS__PromiseRace(iterable) local pending = {} for ____, item in __TS__Iterator(iterable) do @@ -1933,329 +1813,218 @@ local function __TS__PromiseRace(iterable) end ) end - local Set do - Set = __TS__Class() - Set.name = "Set" - function Set.prototype.____constructor(self, values) - self[Symbol.toStringTag] = "Set" - self.size = 0 - self.nextKey = {} - self.previousKey = {} - if values == nil then - return - end - local iterable = values - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break - end - self:add(result.value) - end - else - local array = values - for ____, value in ipairs(array) do - self:add(value) - end - end - end - function Set.prototype.add(self, value) - local isNewValue = not self:has(value) - if isNewValue then - self.size = self.size + 1 - end - if self.firstKey == nil then - self.firstKey = value - self.lastKey = value - elseif isNewValue then - self.nextKey[self.lastKey] = value - self.previousKey[value] = self.lastKey - self.lastKey = value - end - return self +Set = __TS__Class() +Set.name = "Set" +function Set.prototype.____constructor(self, values) + self[Symbol.toStringTag] = "Set" + self.size = 0 + self.nextKey = {} + self.previousKey = {} + if values == nil then + return end - function Set.prototype.clear(self) - self.nextKey = {} - self.previousKey = {} - self.firstKey = nil - self.lastKey = nil - self.size = 0 - end - function Set.prototype.delete(self, value) - local contains = self:has(value) - if contains then - self.size = self.size - 1 - local next = self.nextKey[value] - local previous = self.previousKey[value] - if next ~= nil and previous ~= nil then - self.nextKey[previous] = next - self.previousKey[next] = previous - elseif next ~= nil then - self.firstKey = next - self.previousKey[next] = nil - elseif previous ~= nil then - self.lastKey = previous - self.nextKey[previous] = nil - else - self.firstKey = nil - self.lastKey = nil + local iterable = values + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break end - self.nextKey[value] = nil - self.previousKey[value] = nil + self:add(result.value) end - return contains - end - function Set.prototype.forEach(self, callback) - for ____, key in __TS__Iterator(self:keys()) do - callback(nil, key, key, self) - end - end - function Set.prototype.has(self, value) - return self.nextKey[value] ~= nil or self.lastKey == value - end - Set.prototype[Symbol.iterator] = function(self) - return self:values() - end - function Set.prototype.entries(self) - local function getFirstKey() - return self.firstKey + else + local array = values + for ____, value in ipairs(array) do + self:add(value) end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = {key, key}} - end - } end - function Set.prototype.keys(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = key} - end - } +end +function Set.prototype.add(self, value) + local isNewValue = not self:has(value) + if isNewValue then + self.size = self.size + 1 end - function Set.prototype.values(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = key} - end - } + if self.firstKey == nil then + self.firstKey = value + self.lastKey = value + elseif isNewValue then + self.nextKey[self.lastKey] = value + self.previousKey[value] = self.lastKey + self.lastKey = value end - function Set.prototype.union(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - result:add(item) + return self +end +function Set.prototype.clear(self) + self.nextKey = {} + self.previousKey = {} + self.firstKey = nil + self.lastKey = nil + self.size = 0 +end +function Set.prototype.delete(self, value) + local contains = self:has(value) + if contains then + self.size = self.size - 1 + local next = self.nextKey[value] + local previous = self.previousKey[value] + if next ~= nil and previous ~= nil then + self.nextKey[previous] = next + self.previousKey[next] = previous + elseif next ~= nil then + self.firstKey = next + self.previousKey[next] = nil + elseif previous ~= nil then + self.lastKey = previous + self.nextKey[previous] = nil + else + self.firstKey = nil + self.lastKey = nil end - return result + self.nextKey[value] = nil + self.previousKey[value] = nil end - function Set.prototype.intersection(self, other) - local result = __TS__New(Set) - for ____, item in __TS__Iterator(self) do - if other:has(item) then - result:add(item) - end - end - return result + return contains +end +function Set.prototype.forEach(self, callback) + for ____, key in __TS__Iterator(self:keys()) do + callback(nil, key, key, self) end - function Set.prototype.difference(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - result:delete(item) - end - return result +end +function Set.prototype.has(self, value) + return self.nextKey[value] ~= nil or self.lastKey == value +end +Set.prototype[Symbol.iterator] = function(self) + return self:values() +end +function Set.prototype.entries(self) + local function getFirstKey() + return self.firstKey end - function Set.prototype.symmetricDifference(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - if self:has(item) then - result:delete(item) + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) else - result:add(item) + key = nextKey[key] end + return {done = not key, value = {key, key}} end - return result + } +end +function Set.prototype.keys(self) + local function getFirstKey() + return self.firstKey end - function Set.prototype.isSubsetOf(self, other) - for ____, item in __TS__Iterator(self) do - if not other:has(item) then - return false + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] end + return {done = not key, value = key} end - return true + } +end +function Set.prototype.values(self) + local function getFirstKey() + return self.firstKey end - function Set.prototype.isSupersetOf(self, other) - for ____, item in __TS__Iterator(other) do - if not self:has(item) then - return false + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] end + return {done = not key, value = key} end - return true + } +end +function Set.prototype.union(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do + result:add(item) end - function Set.prototype.isDisjointFrom(self, other) - for ____, item in __TS__Iterator(self) do - if other:has(item) then - return false - end + return result +end +function Set.prototype.intersection(self, other) + local result = __TS__New(Set) + for ____, item in __TS__Iterator(self) do + if other:has(item) then + result:add(item) end - return true end - Set[Symbol.species] = Set -end - -local function __TS__SparseArrayNew(...) - local sparseArray = {...} - sparseArray.sparseLength = __TS__CountVarargs(...) - return sparseArray + return result end - -local function __TS__SparseArrayPush(sparseArray, ...) - local args = {...} - local argsLen = __TS__CountVarargs(...) - local listLen = sparseArray.sparseLength - for i = 1, argsLen do - sparseArray[listLen + i] = args[i] +function Set.prototype.difference(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do + result:delete(item) end - sparseArray.sparseLength = listLen + argsLen -end - -local function __TS__SparseArraySpread(sparseArray) - local _unpack = unpack or table.unpack - return _unpack(sparseArray, 1, sparseArray.sparseLength) + return result end - -local WeakMap -do - WeakMap = __TS__Class() - WeakMap.name = "WeakMap" - function WeakMap.prototype.____constructor(self, entries) - self[Symbol.toStringTag] = "WeakMap" - self.items = {} - setmetatable(self.items, {__mode = "k"}) - if entries == nil then - return - end - local iterable = entries - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break - end - local value = result.value - self.items[value[1]] = value[2] - end +function Set.prototype.symmetricDifference(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do + if self:has(item) then + result:delete(item) else - for ____, kvp in ipairs(entries) do - self.items[kvp[1]] = kvp[2] - end + result:add(item) end end - function WeakMap.prototype.delete(self, key) - local contains = self:has(key) - self.items[key] = nil - return contains - end - function WeakMap.prototype.get(self, key) - return self.items[key] - end - function WeakMap.prototype.has(self, key) - return self.items[key] ~= nil - end - function WeakMap.prototype.set(self, key, value) - self.items[key] = value - return self - end - WeakMap[Symbol.species] = WeakMap + return result end - -local WeakSet -do - WeakSet = __TS__Class() - WeakSet.name = "WeakSet" - function WeakSet.prototype.____constructor(self, values) - self[Symbol.toStringTag] = "WeakSet" - self.items = {} - setmetatable(self.items, {__mode = "k"}) - if values == nil then - return - end - local iterable = values - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break - end - self.items[result.value] = true - end - else - for ____, value in ipairs(values) do - self.items[value] = true - end +function Set.prototype.isSubsetOf(self, other) + for ____, item in __TS__Iterator(self) do + if not other:has(item) then + return false end end - function WeakSet.prototype.add(self, value) - self.items[value] = true - return self - end - function WeakSet.prototype.delete(self, value) - local contains = self:has(value) - self.items[value] = nil - return contains + return true +end +function Set.prototype.isSupersetOf(self, other) + for ____, item in __TS__Iterator(other) do + if not self:has(item) then + return false + end end - function WeakSet.prototype.has(self, value) - return self.items[value] == true + return true +end +function Set.prototype.isDisjointFrom(self, other) + for ____, item in __TS__Iterator(self) do + if other:has(item) then + return false + end end - WeakSet[Symbol.species] = WeakSet + return true +end +Set[Symbol.species] = Set end - local function __TS__SourceMapTraceBack(fileName, sourceMap) _G.__TS__sourcemap = _G.__TS__sourcemap or ({}) _G.__TS__sourcemap[fileName] = sourceMap @@ -2312,7 +2081,24 @@ local function __TS__SourceMapTraceBack(fileName, sourceMap) end end end - +local function __TS__SparseArrayNew(...) + local sparseArray = {...} + sparseArray.sparseLength = __TS__CountVarargs(...) + return sparseArray +end +local function __TS__SparseArrayPush(sparseArray, ...) + local args = {...} + local argsLen = __TS__CountVarargs(...) + local listLen = sparseArray.sparseLength + for i = 1, argsLen do + sparseArray[listLen + i] = args[i] + end + sparseArray.sparseLength = listLen + argsLen +end +local function __TS__SparseArraySpread(sparseArray) + local _unpack = unpack or table.unpack + return _unpack(sparseArray, 1, sparseArray.sparseLength) +end local function __TS__Spread(iterable) local arr = {} if type(iterable) == "string" then @@ -2328,7 +2114,6 @@ local function __TS__Spread(iterable) end return __TS__Unpack(arr) end - local function __TS__StringCharAt(self, pos) if pos ~= pos then pos = 0 @@ -2338,7 +2123,6 @@ local function __TS__StringCharAt(self, pos) end return string.sub(self, pos + 1, pos + 1) end - local function __TS__StringCharCodeAt(self, index) if index ~= index then index = 0 @@ -2348,14 +2132,12 @@ local function __TS__StringCharCodeAt(self, index) end return string.byte(self, index + 1) or 0 / 0 end - local function __TS__StringEndsWith(self, searchString, endPosition) if endPosition == nil or endPosition > #self then endPosition = #self end return string.sub(self, endPosition - #searchString + 1, endPosition) == searchString end - local function __TS__StringPadEnd(self, maxLength, fillString) if fillString == nil then fillString = " " @@ -2382,7 +2164,6 @@ local function __TS__StringPadEnd(self, maxLength, fillString) math.floor(maxLength) ) end - local function __TS__StringPadStart(self, maxLength, fillString) if fillString == nil then fillString = " " @@ -2409,102 +2190,95 @@ local function __TS__StringPadStart(self, maxLength, fillString) math.floor(maxLength) ) .. self end - -local __TS__StringReplace -do - local sub = string.sub - function __TS__StringReplace(source, searchValue, replaceValue) - local startPos, endPos = string.find(source, searchValue, nil, true) - if not startPos then - return source - end - local before = sub(source, 1, startPos - 1) - local replacement = type(replaceValue) == "string" and replaceValue or replaceValue(nil, searchValue, startPos - 1, source) - local after = sub(source, endPos + 1) - return (before .. replacement) .. after +local sub = string.sub +local function __TS__StringReplace(source, searchValue, replaceValue) + local startPos, endPos = string.find(source, searchValue, nil, true) + if not startPos then + return source + end + local before = sub(source, 1, startPos - 1) + local ____temp_0 + if type(replaceValue) == "string" then + ____temp_0 = replaceValue + else + ____temp_0 = replaceValue(nil, searchValue, startPos - 1, source) end + local replacement = ____temp_0 + local after = sub(source, endPos + 1) + return (before .. replacement) .. after end - -local __TS__StringSplit -do - local sub = string.sub - local find = string.find - function __TS__StringSplit(source, separator, limit) - if limit == nil then - limit = 4294967295 - end - if limit == 0 then - return {} - end - local result = {} - local resultIndex = 1 - if separator == nil or separator == "" then - for i = 1, #source do - result[resultIndex] = sub(source, i, i) - resultIndex = resultIndex + 1 - end - else - local currentPos = 1 - while resultIndex <= limit do - local startPos, endPos = find(source, separator, currentPos, true) - if not startPos then - break - end - result[resultIndex] = sub(source, currentPos, startPos - 1) - resultIndex = resultIndex + 1 - currentPos = endPos + 1 - end - if resultIndex <= limit then - result[resultIndex] = sub(source, currentPos) +local sub = string.sub +local find = string.find +local function __TS__StringSplit(source, separator, limit) + if limit == nil then + limit = 4294967295 + end + if limit == 0 then + return {} + end + local result = {} + local resultIndex = 1 + if separator == nil or separator == "" then + for i = 1, #source do + result[resultIndex] = sub(source, i, i) + resultIndex = resultIndex + 1 + end + else + local currentPos = 1 + while resultIndex <= limit do + local startPos, endPos = find(source, separator, currentPos, true) + if not startPos then + break end + result[resultIndex] = sub(source, currentPos, startPos - 1) + resultIndex = resultIndex + 1 + currentPos = endPos + 1 + end + if resultIndex <= limit then + result[resultIndex] = sub(source, currentPos) end - return result end + return result end - -local __TS__StringReplaceAll -do - local sub = string.sub - local find = string.find - function __TS__StringReplaceAll(source, searchValue, replaceValue) - if type(replaceValue) == "string" then - local concat = table.concat( - __TS__StringSplit(source, searchValue), - replaceValue - ) - if #searchValue == 0 then - return (replaceValue .. concat) .. replaceValue - end - return concat - end - local parts = {} - local partsIndex = 1 +local sub = string.sub +local find = string.find +local function __TS__StringReplaceAll(source, searchValue, replaceValue) + if type(replaceValue) == "string" then + local concat = table.concat( + __TS__StringSplit(source, searchValue), + replaceValue + ) if #searchValue == 0 then - parts[1] = replaceValue(nil, "", 0, source) - partsIndex = 2 - for i = 1, #source do - parts[partsIndex] = sub(source, i, i) - parts[partsIndex + 1] = replaceValue(nil, "", i, source) - partsIndex = partsIndex + 2 - end - else - local currentPos = 1 - while true do - local startPos, endPos = find(source, searchValue, currentPos, true) - if not startPos then - break - end - parts[partsIndex] = sub(source, currentPos, startPos - 1) - parts[partsIndex + 1] = replaceValue(nil, searchValue, startPos - 1, source) - partsIndex = partsIndex + 2 - currentPos = endPos + 1 + return (replaceValue .. concat) .. replaceValue + end + return concat + end + local parts = {} + local partsIndex = 1 + if #searchValue == 0 then + parts[1] = replaceValue(nil, "", 0, source) + partsIndex = 2 + for i = 1, #source do + parts[partsIndex] = sub(source, i, i) + parts[partsIndex + 1] = replaceValue(nil, "", i, source) + partsIndex = partsIndex + 2 + end + else + local currentPos = 1 + while true do + local startPos, endPos = find(source, searchValue, currentPos, true) + if not startPos then + break end - parts[partsIndex] = sub(source, currentPos) + parts[partsIndex] = sub(source, currentPos, startPos - 1) + parts[partsIndex + 1] = replaceValue(nil, searchValue, startPos - 1, source) + partsIndex = partsIndex + 2 + currentPos = endPos + 1 end - return table.concat(parts) + parts[partsIndex] = sub(source, currentPos) end + return table.concat(parts) end - local function __TS__StringSlice(self, start, ____end) if start == nil or start ~= start then start = 0 @@ -2520,14 +2294,12 @@ local function __TS__StringSlice(self, start, ____end) end return string.sub(self, start, ____end) end - local function __TS__StringStartsWith(self, searchString, position) if position == nil or position < 0 then position = 0 end return string.sub(self, position + 1, #searchString + position) == searchString end - local function __TS__StringSubstr(self, from, length) if from ~= from then from = 0 @@ -2543,41 +2315,33 @@ local function __TS__StringSubstr(self, from, length) end return string.sub(self, from, length) end - local function __TS__StringTrim(self) local result = string.gsub(self, "^[%s ]*(.-)[%s ]*$", "%1") return result end - local function __TS__StringTrimEnd(self) local result = string.gsub(self, "[%s ]*$", "") return result end - local function __TS__StringTrimStart(self) local result = string.gsub(self, "^[%s ]*", "") return result end - -local __TS__SymbolRegistryFor, __TS__SymbolRegistryKeyFor -do - local symbolRegistry = {} - function __TS__SymbolRegistryFor(key) - if not symbolRegistry[key] then - symbolRegistry[key] = __TS__Symbol(key) - end - return symbolRegistry[key] +local symbolRegistry = {} +local function __TS__SymbolRegistryFor(key) + if not symbolRegistry[key] then + symbolRegistry[key] = __TS__Symbol(key) end - function __TS__SymbolRegistryKeyFor(sym) - for key in pairs(symbolRegistry) do - if symbolRegistry[key] == sym then - return key - end + return symbolRegistry[key] +end +local function __TS__SymbolRegistryKeyFor(sym) + for key in pairs(symbolRegistry) do + if symbolRegistry[key] == sym then + return key end - return nil end + return nil end - local function __TS__TypeOf(value) local luaType = type(value) if luaType == "table" then @@ -2588,7 +2352,6 @@ local function __TS__TypeOf(value) return luaType end end - local function __TS__Using(self, cb, ...) local args = {...} local thrownError @@ -2599,7 +2362,7 @@ local function __TS__Using(self, cb, ...) return thrownError end ) - local argArray = {__TS__Unpack(args)} + local argArray = {...} do local i = #argArray - 1 while i >= 0 do @@ -2613,7 +2376,6 @@ local function __TS__Using(self, cb, ...) end return result end - local function __TS__UsingAsync(self, cb, ...) local args = {...} return __TS__AsyncAwaiter(function(____awaiter_resolve) @@ -2649,7 +2411,92 @@ local function __TS__UsingAsync(self, cb, ...) return ____awaiter_resolve(nil, result) end) end - +local WeakMap +do +WeakMap = __TS__Class() +WeakMap.name = "WeakMap" +function WeakMap.prototype.____constructor(self, entries) + self[Symbol.toStringTag] = "WeakMap" + self.items = {} + setmetatable(self.items, {__mode = "k"}) + if entries == nil then + return + end + local iterable = entries + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + local value = result.value -- Ensures index is offset when tuple is accessed + self.items[value[1]] = value[2] + end + else + for ____, kvp in ipairs(entries) do + self.items[kvp[1]] = kvp[2] + end + end +end +function WeakMap.prototype.delete(self, key) + local contains = self:has(key) + self.items[key] = nil + return contains +end +function WeakMap.prototype.get(self, key) + return self.items[key] +end +function WeakMap.prototype.has(self, key) + return self.items[key] ~= nil +end +function WeakMap.prototype.set(self, key, value) + self.items[key] = value + return self +end +WeakMap[Symbol.species] = WeakMap +end +local WeakSet +do +WeakSet = __TS__Class() +WeakSet.name = "WeakSet" +function WeakSet.prototype.____constructor(self, values) + self[Symbol.toStringTag] = "WeakSet" + self.items = {} + setmetatable(self.items, {__mode = "k"}) + if values == nil then + return + end + local iterable = values + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + self.items[result.value] = true + end + else + for ____, value in ipairs(values) do + self.items[value] = true + end + end +end +function WeakSet.prototype.add(self, value) + self.items[value] = true + return self +end +function WeakSet.prototype.delete(self, value) + local contains = self:has(value) + self.items[value] = nil + return contains +end +function WeakSet.prototype.has(self, value) + return self.items[value] == true +end +WeakSet[Symbol.species] = WeakSet +end local function __TS__MapForOfStep(map, prev) local key if prev == nil then @@ -2713,25 +2560,29 @@ end local function __TS__SetForOf(set) return __TS__SetForOfStep, set, nil end - return { - __TS__MapForOf = __TS__MapForOf, - __TS__MapForOfStep = __TS__MapForOfStep, - __TS__MapKeysForOf = __TS__MapKeysForOf, - __TS__MapKeysForOfStep = __TS__MapKeysForOfStep, - __TS__MapValuesForOf = __TS__MapValuesForOf, - __TS__MapValuesForOfStep = __TS__MapValuesForOfStep, - __TS__SetForOf = __TS__SetForOf, - __TS__SetForOfStep = __TS__SetForOfStep, + Error = Error, + Map = Map, + RangeError = RangeError, + ReferenceError = ReferenceError, + Set = Set, + Symbol = Symbol, + SyntaxError = SyntaxError, + TypeError = TypeError, + URIError = URIError, + WeakMap = WeakMap, + WeakSet = WeakSet, __TS__ArrayAt = __TS__ArrayAt, __TS__ArrayConcat = __TS__ArrayConcat, __TS__ArrayEntries = __TS__ArrayEntries, __TS__ArrayEvery = __TS__ArrayEvery, __TS__ArrayFill = __TS__ArrayFill, __TS__ArrayFilter = __TS__ArrayFilter, - __TS__ArrayForEach = __TS__ArrayForEach, __TS__ArrayFind = __TS__ArrayFind, __TS__ArrayFindIndex = __TS__ArrayFindIndex, + __TS__ArrayFlat = __TS__ArrayFlat, + __TS__ArrayFlatMap = __TS__ArrayFlatMap, + __TS__ArrayForEach = __TS__ArrayForEach, __TS__ArrayFrom = __TS__ArrayFrom, __TS__ArrayIncludes = __TS__ArrayIncludes, __TS__ArrayIndexOf = __TS__ArrayIndexOf, @@ -2743,18 +2594,16 @@ return { __TS__ArrayReduce = __TS__ArrayReduce, __TS__ArrayReduceRight = __TS__ArrayReduceRight, __TS__ArrayReverse = __TS__ArrayReverse, - __TS__ArrayUnshift = __TS__ArrayUnshift, - __TS__ArraySort = __TS__ArraySort, + __TS__ArraySetLength = __TS__ArraySetLength, __TS__ArraySlice = __TS__ArraySlice, __TS__ArraySome = __TS__ArraySome, + __TS__ArraySort = __TS__ArraySort, __TS__ArraySplice = __TS__ArraySplice, __TS__ArrayToObject = __TS__ArrayToObject, - __TS__ArrayFlat = __TS__ArrayFlat, - __TS__ArrayFlatMap = __TS__ArrayFlatMap, - __TS__ArraySetLength = __TS__ArraySetLength, __TS__ArrayToReversed = __TS__ArrayToReversed, __TS__ArrayToSorted = __TS__ArrayToSorted, __TS__ArrayToSpliced = __TS__ArrayToSpliced, + __TS__ArrayUnshift = __TS__ArrayUnshift, __TS__ArrayWith = __TS__ArrayWith, __TS__AsyncAwaiter = __TS__AsyncAwaiter, __TS__Await = __TS__Await, @@ -2765,24 +2614,23 @@ return { __TS__Decorate = __TS__Decorate, __TS__DecorateLegacy = __TS__DecorateLegacy, __TS__DecorateParam = __TS__DecorateParam, - __TS__Delete = __TS__Delete, __TS__DelegatedYield = __TS__DelegatedYield, + __TS__Delete = __TS__Delete, __TS__DescriptorGet = __TS__DescriptorGet, __TS__DescriptorSet = __TS__DescriptorSet, - Error = Error, - RangeError = RangeError, - ReferenceError = ReferenceError, - SyntaxError = SyntaxError, - TypeError = TypeError, - URIError = URIError, __TS__FunctionBind = __TS__FunctionBind, __TS__Generator = __TS__Generator, __TS__InstanceOf = __TS__InstanceOf, __TS__InstanceOfObject = __TS__InstanceOfObject, __TS__Iterator = __TS__Iterator, __TS__LuaIteratorSpread = __TS__LuaIteratorSpread, - Map = Map, + __TS__MapForOf = __TS__MapForOf, + __TS__MapForOfStep = __TS__MapForOfStep, __TS__MapGroupBy = __TS__MapGroupBy, + __TS__MapKeysForOf = __TS__MapKeysForOf, + __TS__MapKeysForOfStep = __TS__MapKeysForOfStep, + __TS__MapValuesForOf = __TS__MapValuesForOf, + __TS__MapValuesForOfStep = __TS__MapValuesForOfStep, __TS__Match = __TS__Match, __TS__MathAtan2 = __TS__MathAtan2, __TS__MathModf = __TS__MathModf, @@ -2793,10 +2641,8 @@ return { __TS__NumberIsFinite = __TS__NumberIsFinite, __TS__NumberIsInteger = __TS__NumberIsInteger, __TS__NumberIsNaN = __TS__NumberIsNaN, - __TS__ParseInt = __TS__ParseInt, - __TS__ParseFloat = __TS__ParseFloat, - __TS__NumberToString = __TS__NumberToString, __TS__NumberToFixed = __TS__NumberToFixed, + __TS__NumberToString = __TS__NumberToString, __TS__ObjectAssign = __TS__ObjectAssign, __TS__ObjectDefineProperty = __TS__ObjectDefineProperty, __TS__ObjectEntries = __TS__ObjectEntries, @@ -2814,14 +2660,13 @@ return { __TS__PromiseAllSettled = __TS__PromiseAllSettled, __TS__PromiseAny = __TS__PromiseAny, __TS__PromiseRace = __TS__PromiseRace, - Set = Set, __TS__SetDescriptor = __TS__SetDescriptor, + __TS__SetForOf = __TS__SetForOf, + __TS__SetForOfStep = __TS__SetForOfStep, + __TS__SourceMapTraceBack = __TS__SourceMapTraceBack, __TS__SparseArrayNew = __TS__SparseArrayNew, __TS__SparseArrayPush = __TS__SparseArrayPush, __TS__SparseArraySpread = __TS__SparseArraySpread, - WeakMap = WeakMap, - WeakSet = WeakSet, - __TS__SourceMapTraceBack = __TS__SourceMapTraceBack, __TS__Spread = __TS__Spread, __TS__StringAccess = __TS__StringAccess, __TS__StringCharAt = __TS__StringCharAt, @@ -2841,11 +2686,10 @@ return { __TS__StringTrimEnd = __TS__StringTrimEnd, __TS__StringTrimStart = __TS__StringTrimStart, __TS__Symbol = __TS__Symbol, - Symbol = Symbol, __TS__SymbolRegistryFor = __TS__SymbolRegistryFor, __TS__SymbolRegistryKeyFor = __TS__SymbolRegistryKeyFor, __TS__TypeOf = __TS__TypeOf, __TS__Unpack = __TS__Unpack, __TS__Using = __TS__Using, - __TS__UsingAsync = __TS__UsingAsync + __TS__UsingAsync = __TS__UsingAsync, } diff --git a/internal/lualib/lualib_bundle_50.lua b/internal/lualib/lualib_bundle_50.lua index 6890219..429c047 100644 --- a/internal/lualib/lualib_bundle_50.lua +++ b/internal/lualib/lualib_bundle_50.lua @@ -5,11 +5,9 @@ local function __TS__ArrayAt(self, relativeIndex) end return nil end - local function __TS__ArrayIsArray(value) return type(value) == "table" and (value[1] ~= nil or next(value) == nil) end - local function __TS__ArrayConcat(self, ...) local items = arg local result = {} @@ -32,25 +30,20 @@ local function __TS__ArrayConcat(self, ...) end return result end - -local __TS__Symbol, Symbol -do - local symbolMetatable = {__tostring = function(self) - return ("Symbol(" .. (self.description or "")) .. ")" - end} - function __TS__Symbol(description) - return setmetatable({description = description}, symbolMetatable) - end - Symbol = { - asyncDispose = __TS__Symbol("Symbol.asyncDispose"), - dispose = __TS__Symbol("Symbol.dispose"), - iterator = __TS__Symbol("Symbol.iterator"), - hasInstance = __TS__Symbol("Symbol.hasInstance"), - species = __TS__Symbol("Symbol.species"), - toStringTag = __TS__Symbol("Symbol.toStringTag") - } -end - +local symbolMetatable = {__tostring = function(self) + return ("Symbol(" .. (self.description or "")) .. ")" +end} +local function __TS__Symbol(description) + return setmetatable({description = description}, symbolMetatable) +end +local Symbol = { + asyncDispose = __TS__Symbol("Symbol.asyncDispose"), + dispose = __TS__Symbol("Symbol.dispose"), + iterator = __TS__Symbol("Symbol.iterator"), + hasInstance = __TS__Symbol("Symbol.hasInstance"), + species = __TS__Symbol("Symbol.species"), + toStringTag = __TS__Symbol("Symbol.toStringTag") +} local function __TS__ArrayEntries(array) local key = 0 return { @@ -64,7 +57,6 @@ local function __TS__ArrayEntries(array) end } end - local function __TS__ArrayEvery(self, callbackfn, thisArg) for i = 1, table.getn(self) do if not callbackfn(thisArg, self[i], i - 1, self) then @@ -73,7 +65,6 @@ local function __TS__ArrayEvery(self, callbackfn, thisArg) end return true end - local function __TS__ArrayFill(self, value, start, ____end) local relativeStart = start or 0 local relativeEnd = ____end or table.getn(self) @@ -92,7 +83,6 @@ local function __TS__ArrayFill(self, value, start, ____end) end return self end - local function __TS__ArrayFilter(self, callbackfn, thisArg) local result = {} local len = 0 @@ -104,13 +94,6 @@ local function __TS__ArrayFilter(self, callbackfn, thisArg) end return result end - -local function __TS__ArrayForEach(self, callbackFn, thisArg) - for i = 1, table.getn(self) do - callbackFn(thisArg, self[i], i - 1, self) - end -end - local function __TS__ArrayFind(self, predicate, thisArg) for i = 1, table.getn(self) do local elem = self[i] @@ -120,7 +103,6 @@ local function __TS__ArrayFind(self, predicate, thisArg) end return nil end - local function __TS__ArrayFindIndex(self, callbackFn, thisArg) for i = 1, table.getn(self) do if callbackFn(thisArg, self[i], i - 1, self) then @@ -129,84 +111,125 @@ local function __TS__ArrayFindIndex(self, callbackFn, thisArg) end return -1 end - -local __TS__Iterator -do - local function iteratorGeneratorStep(self) - local co = self.____coroutine - local status, value = coroutine.resume(co) - if not status then - error(value, 0) - end - if coroutine.status(co) == "dead" then - return - end - return true, value - end - local function iteratorIteratorStep(self) - local result = self:next() - if result.done then - return - end - return true, result.value - end - local function iteratorStringStep(self, index) - index = index + 1 - if index > string.len(self) then - return - end - return index, string.sub(self, index, index) - end - function __TS__Iterator(iterable) - if type(iterable) == "string" then - return iteratorStringStep, iterable, 0 - elseif iterable.____coroutine ~= nil then - return iteratorGeneratorStep, iterable - elseif iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - return iteratorIteratorStep, iterator +local function __TS__ArrayFlat(self, depth) + if depth == nil then + depth = 1 + end + local result = {} + local len = 0 + for i = 1, table.getn(self) do + local value = self[i] + if depth > 0 and __TS__ArrayIsArray(value) then + local toAdd + if depth == 1 then + toAdd = value + else + toAdd = __TS__ArrayFlat(value, depth - 1) + end + for j = 1, table.getn(toAdd) do + local val = toAdd[j] + len = len + 1 + result[len] = val + end else - return ipairs(iterable) + len = len + 1 + result[len] = value end end + return result end - -local __TS__ArrayFrom -do - local function arrayLikeStep(self, index) - index = index + 1 - if index > self.length then - return +local function __TS__ArrayFlatMap(self, callback, thisArg) + local result = {} + local len = 0 + for i = 1, table.getn(self) do + local value = callback(thisArg, self[i], i - 1, self) + if __TS__ArrayIsArray(value) then + for j = 1, table.getn(value) do + len = len + 1 + result[len] = value[j] + end + else + len = len + 1 + result[len] = value end - return index, self[index] end - local function arrayLikeIterator(arr) - if type(arr.length) == "number" then - return arrayLikeStep, arr, 0 - end - return __TS__Iterator(arr) + return result +end +local function __TS__ArrayForEach(self, callbackFn, thisArg) + for i = 1, table.getn(self) do + callbackFn(thisArg, self[i], i - 1, self) end - function __TS__ArrayFrom(arrayLike, mapFn, thisArg) - local result = {} - if mapFn == nil then - for ____, v in arrayLikeIterator(arrayLike) do - result[table.getn(result) + 1] = v - end - else - local i = 0 - for ____, v in arrayLikeIterator(arrayLike) do - local ____mapFn_3 = mapFn - local ____thisArg_1 = thisArg - local ____v_2 = v - local ____i_0 = i - i = ____i_0 + 1 - result[table.getn(result) + 1] = ____mapFn_3(____thisArg_1, ____v_2, ____i_0) - end +end +local function iteratorGeneratorStep(self) + local co = self.____coroutine + local status, value = coroutine.resume(co) + if not status then + error(value, 0) + end + if coroutine.status(co) == "dead" then + return + end + return true, value +end +local function iteratorIteratorStep(self) + local result = self:next() + if result.done then + return + end + return true, result.value +end +local function iteratorStringStep(self, index) + index = index + 1 + if index > string.len(self) then + return + end + return index, string.sub(self, index, index) +end +local function __TS__Iterator(iterable) + if type(iterable) == "string" then + return iteratorStringStep, iterable, 0 + elseif iterable.____coroutine ~= nil then + return iteratorGeneratorStep, iterable + elseif iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + return iteratorIteratorStep, iterator + else + return ipairs(iterable) + end +end +local function arrayLikeStep(self, index) + index = index + 1 + if index > self.length then + return + end + return index, self[index] +end +local function arrayLikeIterator(arr) + if type(arr.length) == "number" then + return arrayLikeStep, arr, 0 + end + return __TS__Iterator(arr) +end +local function __TS__ArrayFrom(arrayLike, mapFn, thisArg) + local result = {} + if mapFn == nil then + for _, v in arrayLikeIterator(arrayLike) do + result[table.getn(result) + 1] = v + end + else + local i = 0 + for _, v in arrayLikeIterator(arrayLike) do + local ____result_4 = result + local ____mapFn_3 = mapFn + local ____thisArg_1 = thisArg + local ____v_2 = v + local ____i_0 = i + i = ____i_0 + 1 + ____result_4[table.getn(____result_4) + 1] = ____mapFn_3(____thisArg_1, ____v_2, ____i_0) end - return result end + return result end - local function __TS__ArrayIncludes(self, searchElement, fromIndex) if fromIndex == nil then fromIndex = 0 @@ -226,7 +249,6 @@ local function __TS__ArrayIncludes(self, searchElement, fromIndex) end return false end - local function __TS__ArrayIndexOf(self, searchElement, fromIndex) if fromIndex == nil then fromIndex = 0 @@ -251,7 +273,6 @@ local function __TS__ArrayIndexOf(self, searchElement, fromIndex) end return -1 end - local function __TS__ArrayJoin(self, separator) if separator == nil then separator = "," @@ -262,7 +283,6 @@ local function __TS__ArrayJoin(self, separator) end return table.concat(parts, separator) end - local function __TS__ArrayMap(self, callbackfn, thisArg) local result = {} for i = 1, table.getn(self) do @@ -270,7 +290,6 @@ local function __TS__ArrayMap(self, callbackfn, thisArg) end return result end - local function __TS__ArrayPush(self, ...) local items = arg local len = table.getn(self) @@ -280,7 +299,6 @@ local function __TS__ArrayPush(self, ...) end return len end - local function __TS__ArrayPushArray(self, items) local len = table.getn(self) for i = 1, table.getn(items) do @@ -289,18 +307,16 @@ local function __TS__ArrayPushArray(self, items) end return len end - local function __TS__CountVarargs(...) local args = arg return table.getn(args) end - local function __TS__ArrayReduce(self, callbackFn, ...) local len = table.getn(self) local k = 0 local accumulator = nil if __TS__CountVarargs(unpack(arg)) ~= 0 then - accumulator = unpack(arg) + accumulator = unpack({unpack(arg)}) elseif len > 0 then accumulator = self[1] k = 1 @@ -318,13 +334,12 @@ local function __TS__ArrayReduce(self, callbackFn, ...) end return accumulator end - local function __TS__ArrayReduceRight(self, callbackFn, ...) local len = table.getn(self) local k = len - 1 local accumulator = nil if __TS__CountVarargs(unpack(arg)) ~= 0 then - accumulator = unpack(arg) + accumulator = unpack({unpack(arg)}) elseif len > 0 then accumulator = self[k + 1] k = k - 1 @@ -342,7 +357,6 @@ local function __TS__ArrayReduceRight(self, callbackFn, ...) end return accumulator end - local function __TS__ArrayReverse(self) local i = 1 local j = table.getn(self) @@ -355,34 +369,18 @@ local function __TS__ArrayReverse(self) end return self end - -local function __TS__ArrayUnshift(self, ...) - local items = arg - local numItemsToInsert = table.getn(items) - if numItemsToInsert == 0 then - return table.getn(self) - end - for i = table.getn(self), 1, -1 do - self[i + numItemsToInsert] = self[i] - end - for i = 1, numItemsToInsert do - self[i] = items[i] - end - return table.getn(self) -end - -local function __TS__ArraySort(self, compareFn) - if compareFn ~= nil then - table.sort( - self, - function(a, b) return compareFn(nil, a, b) < 0 end +local function __TS__ArraySetLength(self, length) + if length < 0 or length ~= length or length == 1 / 0 or math.floor(length) ~= length then + error( + "invalid array length: " .. tostring(length), + 0 ) - else - table.sort(self) end - return self + for i = length + 1, table.getn(self) do + self[i] = nil + end + return length end - local function __TS__ArraySlice(self, first, last) local len = table.getn(self) first = first or 0 @@ -418,7 +416,6 @@ local function __TS__ArraySlice(self, first, last) end return out end - local function __TS__ArraySome(self, callbackfn, thisArg) for i = 1, table.getn(self) do if callbackfn(thisArg, self[i], i - 1, self) then @@ -427,7 +424,17 @@ local function __TS__ArraySome(self, callbackfn, thisArg) end return false end - +local function __TS__ArraySort(self, compareFn) + if compareFn ~= nil then + table.sort( + self, + function(a, b) return compareFn(nil, a, b) < 0 end + ) + else + table.sort(self) + end + return self +end local function __TS__ArraySplice(self, ...) local args = arg local len = table.getn(self) @@ -501,7 +508,6 @@ local function __TS__ArraySplice(self, ...) end return out end - local function __TS__ArrayToObject(self) local object = {} for i = 1, table.getn(self) do @@ -509,78 +515,16 @@ local function __TS__ArrayToObject(self) end return object end - -local function __TS__ArrayFlat(self, depth) - if depth == nil then - depth = 1 - end - local result = {} - local len = 0 - for i = 1, table.getn(self) do - local value = self[i] - if depth > 0 and __TS__ArrayIsArray(value) then - local toAdd - if depth == 1 then - toAdd = value - else - toAdd = __TS__ArrayFlat(value, depth - 1) - end - for j = 1, table.getn(toAdd) do - local val = toAdd[j] - len = len + 1 - result[len] = val - end - else - len = len + 1 - result[len] = value - end - end - return result -end - -local function __TS__ArrayFlatMap(self, callback, thisArg) - local result = {} - local len = 0 - for i = 1, table.getn(self) do - local value = callback(thisArg, self[i], i - 1, self) - if __TS__ArrayIsArray(value) then - for j = 1, table.getn(value) do - len = len + 1 - result[len] = value[j] - end - else - len = len + 1 - result[len] = value - end - end - return result -end - -local function __TS__ArraySetLength(self, length) - if length < 0 or length ~= length or length == 1 / 0 or math.floor(length) ~= length then - error( - "invalid array length: " .. tostring(length), - 0 - ) - end - for i = length + 1, table.getn(self) do - self[i] = nil - end - return length -end - local function __TS__ArrayToReversed(self) local copy = {unpack(self)} __TS__ArrayReverse(copy) return copy end - local function __TS__ArrayToSorted(self, compareFn) local copy = {unpack(self)} __TS__ArraySort(copy, compareFn) return copy end - local function __TS__ArrayToSpliced(self, start, deleteCount, ...) local copy = {unpack(self)} __TS__ArraySplice( @@ -591,19 +535,30 @@ local function __TS__ArrayToSpliced(self, start, deleteCount, ...) ) return copy end - +local function __TS__ArrayUnshift(self, ...) + local items = arg + local numItemsToInsert = table.getn(items) + if numItemsToInsert == 0 then + return table.getn(self) + end + for i = table.getn(self), 1, -1 do + self[i + numItemsToInsert] = self[i] + end + for i = 1, numItemsToInsert do + self[i] = items[i] + end + return table.getn(self) +end local function __TS__ArrayWith(self, index, value) local copy = {unpack(self)} copy[index + 1] = value return copy end - local function __TS__New(target, ...) local instance = setmetatable({}, target.prototype) instance:____constructor(unpack(arg)) return instance end - local function __TS__InstanceOf(obj, classTbl) if type(classTbl) ~= "table" then error("Right-hand side of 'instanceof' is not an object", 0) @@ -622,206 +577,199 @@ local function __TS__InstanceOf(obj, classTbl) end return false end - local function __TS__Class(self) local c = {prototype = {}} c.prototype.__index = c.prototype c.prototype.constructor = c return c end - local __TS__Promise do - local function makeDeferredPromiseFactory() - local resolve - local reject - local function executor(____, res, rej) - resolve = res - reject = rej - end - return function() - local promise = __TS__New(__TS__Promise, executor) - return promise, resolve, reject - end - end - local makeDeferredPromise = makeDeferredPromiseFactory() - local function isPromiseLike(value) - return __TS__InstanceOf(value, __TS__Promise) - end - local function doNothing(self) - end - local ____pcall = _G.pcall - __TS__Promise = __TS__Class() - __TS__Promise.name = "__TS__Promise" - function __TS__Promise.prototype.____constructor(self, executor) - self.state = 0 - self.fulfilledCallbacks = {} - self.rejectedCallbacks = {} - local success, ____error = ____pcall( - executor, - nil, - function(____, v) return self:resolve(v) end, - function(____, err) return self:reject(err) end - ) - if not success then - self:reject(____error) - end +local function makeDeferredPromiseFactory() + local resolve + local reject + local function executor(____, res, rej) + resolve = res + reject = rej + end + return function() + local promise = __TS__New(__TS__Promise, executor) + return promise, resolve, reject + end +end +local makeDeferredPromise = makeDeferredPromiseFactory() +local function isPromiseLike(value) + return __TS__InstanceOf(value, __TS__Promise) +end +local function doNothing(self) +end +local ____pcall = _G.pcall +__TS__Promise = __TS__Class() +__TS__Promise.name = "__TS__Promise" +function __TS__Promise.prototype.____constructor(self, executor) + self.state = 0 + self.fulfilledCallbacks = {} + self.rejectedCallbacks = {} + local success, ____error = ____pcall( + executor, + nil, + function(____, v) return self:resolve(v) end, + function(____, err) return self:reject(err) end + ) + if not success then + self:reject(____error) end - function __TS__Promise.resolve(value) - if __TS__InstanceOf(value, __TS__Promise) then - return value - end - local promise = __TS__New(__TS__Promise, doNothing) - promise.state = 1 - promise.value = value - return promise - end - function __TS__Promise.reject(reason) - local promise = __TS__New(__TS__Promise, doNothing) - promise.state = 2 - promise.rejectionReason = reason - return promise - end - __TS__Promise.prototype["then"] = function(self, onFulfilled, onRejected) - local promise, resolve, reject = makeDeferredPromise() - self:addCallbacks( - onFulfilled and self:createPromiseResolvingCallback(onFulfilled, resolve, reject) or resolve, - onRejected and self:createPromiseResolvingCallback(onRejected, resolve, reject) or reject - ) - return promise +end +function __TS__Promise.resolve(value) + if __TS__InstanceOf(value, __TS__Promise) then + return value end - function __TS__Promise.prototype.addCallbacks(self, fulfilledCallback, rejectedCallback) - if self.state == 1 then - return fulfilledCallback(nil, self.value) - end - if self.state == 2 then - return rejectedCallback(nil, self.rejectionReason) - end - local ____self_fulfilledCallbacks_0 = self.fulfilledCallbacks - ____self_fulfilledCallbacks_0[table.getn(____self_fulfilledCallbacks_0) + 1] = fulfilledCallback - local ____self_rejectedCallbacks_1 = self.rejectedCallbacks - ____self_rejectedCallbacks_1[table.getn(____self_rejectedCallbacks_1) + 1] = rejectedCallback + local promise = __TS__New(__TS__Promise, doNothing) + promise.state = 1 + promise.value = value + return promise +end +function __TS__Promise.reject(reason) + local promise = __TS__New(__TS__Promise, doNothing) + promise.state = 2 + promise.rejectionReason = reason + return promise +end +__TS__Promise.prototype["then"] = function(self, onFulfilled, onRejected) + local promise, resolve, reject = makeDeferredPromise() + self:addCallbacks( + onFulfilled and self:createPromiseResolvingCallback(onFulfilled, resolve, reject) or resolve, + onRejected and self:createPromiseResolvingCallback(onRejected, resolve, reject) or reject + ) + return promise +end +function __TS__Promise.prototype.addCallbacks(self, fulfilledCallback, rejectedCallback) + if self.state == 1 then + return fulfilledCallback(nil, self.value) end - function __TS__Promise.prototype.catch(self, onRejected) - return self["then"](self, nil, onRejected) + if self.state == 2 then + return rejectedCallback(nil, self.rejectionReason) end - function __TS__Promise.prototype.finally(self, onFinally) - return self["then"]( - self, - onFinally and (function(____, value) - onFinally(nil) - return value - end) or nil, - onFinally and (function(____, reason) - onFinally(nil) - error(reason, 0) - end) or nil + local ____self_fulfilledCallbacks_0 = self.fulfilledCallbacks + ____self_fulfilledCallbacks_0[table.getn(____self_fulfilledCallbacks_0) + 1] = fulfilledCallback + local ____self_rejectedCallbacks_1 = self.rejectedCallbacks + ____self_rejectedCallbacks_1[table.getn(____self_rejectedCallbacks_1) + 1] = rejectedCallback +end +function __TS__Promise.prototype.catch(self, onRejected) + return self["then"](self, nil, onRejected) +end +function __TS__Promise.prototype.finally(self, onFinally) + return self["then"]( + self, + onFinally and (function(____, value) + onFinally(nil) + return value + end) or nil, + onFinally and (function(____, reason) + onFinally(nil) + error(reason, 0) + end) or nil + ) +end +function __TS__Promise.prototype.resolve(self, value) + if isPromiseLike(value) then + return value:addCallbacks( + function(____, v) return self:resolve(v) end, + function(____, err) return self:reject(err) end ) end - function __TS__Promise.prototype.resolve(self, value) - if isPromiseLike(value) then - return value:addCallbacks( - function(____, v) return self:resolve(v) end, - function(____, err) return self:reject(err) end - ) - end - if self.state == 0 then - self.state = 1 - self.value = value - return self:invokeCallbacks(self.fulfilledCallbacks, value) - end + if self.state == 0 then + self.state = 1 + self.value = value + return self:invokeCallbacks(self.fulfilledCallbacks, value) end - function __TS__Promise.prototype.reject(self, reason) - if self.state == 0 then - self.state = 2 - self.rejectionReason = reason - return self:invokeCallbacks(self.rejectedCallbacks, reason) - end +end +function __TS__Promise.prototype.reject(self, reason) + if self.state == 0 then + self.state = 2 + self.rejectionReason = reason + return self:invokeCallbacks(self.rejectedCallbacks, reason) end - function __TS__Promise.prototype.invokeCallbacks(self, callbacks, value) - local callbacksLength = table.getn(callbacks) - if callbacksLength ~= 0 then - for i = 1, callbacksLength - 1 do - callbacks[i](callbacks, value) - end - return callbacks[callbacksLength](callbacks, value) +end +function __TS__Promise.prototype.invokeCallbacks(self, callbacks, value) + local callbacksLength = table.getn(callbacks) + if callbacksLength ~= 0 then + for i = 1, callbacksLength - 1 do + callbacks[i](callbacks, value) end + return callbacks[callbacksLength](callbacks, value) end - function __TS__Promise.prototype.createPromiseResolvingCallback(self, f, resolve, reject) - return function(____, value) - local success, resultOrError = ____pcall(f, nil, value) - if not success then - return reject(nil, resultOrError) - end - return self:handleCallbackValue(resultOrError, resolve, reject) +end +function __TS__Promise.prototype.createPromiseResolvingCallback(self, f, resolve, reject) + return function(____, value) + local success, resultOrError = ____pcall(f, nil, value) + if not success then + return reject(nil, resultOrError) end + return self:handleCallbackValue(resultOrError, resolve, reject) end - function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, reject) - if isPromiseLike(value) then - local nextpromise = value - if nextpromise.state == 1 then - return resolve(nil, nextpromise.value) - elseif nextpromise.state == 2 then - return reject(nil, nextpromise.rejectionReason) - else - return nextpromise:addCallbacks(resolve, reject) - end +end +function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, reject) + if isPromiseLike(value) then + local nextpromise = value + if nextpromise.state == 1 then + return resolve(nil, nextpromise.value) + elseif nextpromise.state == 2 then + return reject(nil, nextpromise.rejectionReason) else - return resolve(nil, value) + return nextpromise:addCallbacks(resolve, reject) end + else + return resolve(nil, value) end end - -local __TS__AsyncAwaiter, __TS__Await -do - local ____coroutine = _G.coroutine or ({}) - local cocreate = ____coroutine.create - local coresume = ____coroutine.resume - local costatus = ____coroutine.status - local coyield = ____coroutine.yield - function __TS__AsyncAwaiter(generator) - return __TS__New( - __TS__Promise, - function(____, resolve, reject) - local fulfilled, step, resolved, asyncCoroutine - function fulfilled(self, value) - local success, resultOrError = coresume(asyncCoroutine, value) - if success then - return step(resultOrError) - end - return reject(nil, resultOrError) - end - function step(result) - if resolved then - return - end - if costatus(asyncCoroutine) == "dead" then - return resolve(nil, result) - end - return __TS__Promise.resolve(result):addCallbacks(fulfilled, reject) - end - resolved = false - asyncCoroutine = cocreate(generator) - local success, resultOrError = coresume( - asyncCoroutine, - function(____, v) - resolved = true - return __TS__Promise.resolve(v):addCallbacks(resolve, reject) - end - ) +end +local ____coroutine = _G.coroutine or ({}) +local cocreate = ____coroutine.create +local coresume = ____coroutine.resume +local costatus = ____coroutine.status +local coyield = ____coroutine.yield +local function __TS__AsyncAwaiter(generator) + return __TS__New( + __TS__Promise, + function(____, resolve, reject) + local fulfilled, step, resolved, asyncCoroutine + function fulfilled(self, value) + local success, resultOrError = coresume(asyncCoroutine, value) if success then return step(resultOrError) - else - return reject(nil, resultOrError) end + return reject(nil, resultOrError) end - ) - end - function __TS__Await(thing) - return coyield(thing) - end + function step(result) + if resolved then + return + end + if costatus(asyncCoroutine) == "dead" then + return resolve(nil, result) + end + return __TS__Promise.resolve(result):addCallbacks(fulfilled, reject) + end + resolved = false + asyncCoroutine = cocreate(generator) + local success, resultOrError = coresume( + asyncCoroutine, + function(____, v) + resolved = true + return __TS__Promise.resolve(v):addCallbacks(resolve, reject) + end + ) + if success then + return step(resultOrError) + else + return reject(nil, resultOrError) + end + end + ) +end +local function __TS__Await(thing) + return coyield(thing) end - local function __TS__ClassExtends(target, base) target.____super = base local staticMetatable = setmetatable({__index = base}, base) @@ -846,7 +794,6 @@ local function __TS__ClassExtends(target, base) target.prototype.__tostring = base.prototype.__tostring end end - local function __TS__CloneDescriptor(____bindingPattern0) local value local writable @@ -875,7 +822,6 @@ local function __TS__CloneDescriptor(____bindingPattern0) end return descriptor end - local function __TS__Decorate(self, originalValue, decorators, context) local result = originalValue do @@ -894,18 +840,6 @@ local function __TS__Decorate(self, originalValue, decorators, context) end return result end - -local function __TS__ObjectAssign(target, ...) - local sources = arg - for i = 1, table.getn(sources) do - local source = sources[i] - for key in pairs(source) do - target[key] = source[key] - end - end - return target -end - local function __TS__ObjectGetOwnPropertyDescriptor(object, key) local metatable = getmetatable(object) if not metatable then @@ -916,116 +850,113 @@ local function __TS__ObjectGetOwnPropertyDescriptor(object, key) end return rawget(metatable, "_descriptors")[key] end - -local __TS__DescriptorGet -do - local getmetatable = _G.getmetatable - local ____rawget = _G.rawget - function __TS__DescriptorGet(self, metatable, key) - while metatable do - local rawResult = ____rawget(metatable, key) - if rawResult ~= nil then - return rawResult - end - local descriptors = ____rawget(metatable, "_descriptors") - if descriptors then - local descriptor = descriptors[key] - if descriptor ~= nil then - if descriptor.get then - return descriptor.get(self) - end - return descriptor.value +local getmetatable = _G.getmetatable +local ____rawget = _G.rawget +local function __TS__DescriptorGet(self, metatable, key) + while metatable do + local rawResult = ____rawget(metatable, key) + if rawResult ~= nil then + return rawResult + end + local descriptors = ____rawget(metatable, "_descriptors") + if descriptors then + local descriptor = descriptors[key] + if descriptor ~= nil then + if descriptor.get then + return descriptor.get(self) end + return descriptor.value end - metatable = getmetatable(metatable) end + metatable = getmetatable(metatable) end end - -local __TS__DescriptorSet -do - local getmetatable = _G.getmetatable - local ____rawget = _G.rawget - local rawset = _G.rawset - function __TS__DescriptorSet(self, metatable, key, value) - while metatable do - local descriptors = ____rawget(metatable, "_descriptors") - if descriptors then - local descriptor = descriptors[key] - if descriptor ~= nil then - if descriptor.set then - descriptor.set(self, value) - else - if descriptor.writable == false then - error( - ((("Cannot assign to read only property '" .. key) .. "' of object '") .. tostring(self)) .. "'", - 0 - ) - end - descriptor.value = value +local getmetatable = _G.getmetatable +local ____rawget = _G.rawget +local ____rawset = _G.rawset +local function __TS__DescriptorSet(self, metatable, key, value) + while metatable do + local descriptors = ____rawget(metatable, "_descriptors") + if descriptors then + local descriptor = descriptors[key] + if descriptor ~= nil then + if descriptor.set then + descriptor.set(self, value) + else + if descriptor.writable == false then + error( + ((("Cannot assign to read only property '" .. key) .. "' of object '") .. tostring(self)) .. "'", + 0 + ) end - return + descriptor.value = value end + return end - metatable = getmetatable(metatable) end - rawset(self, key, value) + metatable = getmetatable(metatable) end + ____rawset(self, key, value) end - -local __TS__SetDescriptor -do - local getmetatable = _G.getmetatable - local function descriptorIndex(self, key) - return __TS__DescriptorGet( - self, - getmetatable(self), - key - ) +local getmetatable = _G.getmetatable +local function descriptorIndex(self, key) + return __TS__DescriptorGet( + self, + getmetatable(self), + key + ) +end +local function descriptorNewIndex(self, key, value) + return __TS__DescriptorSet( + self, + getmetatable(self), + key, + value + ) +end +local function __TS__SetDescriptor(target, key, desc, isPrototype) + if isPrototype == nil then + isPrototype = false end - local function descriptorNewIndex(self, key, value) - return __TS__DescriptorSet( - self, - getmetatable(self), - key, - value - ) + local ____isPrototype_0 + if isPrototype then + ____isPrototype_0 = target + else + ____isPrototype_0 = getmetatable(target) end - function __TS__SetDescriptor(target, key, desc, isPrototype) - if isPrototype == nil then - isPrototype = false - end - local ____isPrototype_0 - if isPrototype then - ____isPrototype_0 = target - else - ____isPrototype_0 = getmetatable(target) - end - local metatable = ____isPrototype_0 - if not metatable then - metatable = {} - setmetatable(target, metatable) - end - if not isPrototype and not rawget(metatable, "_isOwnDescriptorMetatable") then - local instanceMetatable = {} - instanceMetatable._isOwnDescriptorMetatable = true - setmetatable(instanceMetatable, metatable) - setmetatable(target, instanceMetatable) - metatable = instanceMetatable - end - local value = rawget(target, key) - if value ~= nil then - rawset(target, key, nil) - end - if not rawget(metatable, "_descriptors") then - metatable._descriptors = {} + local metatable = ____isPrototype_0 + if not metatable then + metatable = {} + setmetatable(target, metatable) + end + if not isPrototype and not rawget(metatable, "_isOwnDescriptorMetatable") then + local instanceMetatable = {} + instanceMetatable._isOwnDescriptorMetatable = true + setmetatable(instanceMetatable, metatable) + setmetatable(target, instanceMetatable) + metatable = instanceMetatable + end + local value = rawget(target, key) + if value ~= nil then + rawset(target, key, nil) + end + if not rawget(metatable, "_descriptors") then + metatable._descriptors = {} + end + metatable._descriptors[key] = __TS__CloneDescriptor(desc) + metatable.__index = descriptorIndex + metatable.__newindex = descriptorNewIndex +end +local function __TS__ObjectAssign(target, ...) + local sources = arg + for i = 1, table.getn(sources) do + local source = sources[i] + for key in pairs(source) do + target[key] = source[key] end - metatable._descriptors[key] = __TS__CloneDescriptor(desc) - metatable.__index = descriptorIndex - metatable.__newindex = descriptorNewIndex end + return target end - local function __TS__DecorateLegacy(decorators, target, key, desc) local result = target do @@ -1062,143 +993,14 @@ local function __TS__DecorateLegacy(decorators, target, key, desc) end return result end - local function __TS__DecorateParam(paramIndex, decorator) return function(____, target, key) return decorator(nil, target, key, paramIndex) end end - -local function __TS__StringIncludes(self, searchString, position) - if not position then - position = 1 - else - position = position + 1 - end - local index = string.find(self, searchString, position, true) - return index ~= nil -end - -local Error, RangeError, ReferenceError, SyntaxError, TypeError, URIError -do - local function getErrorStack(self, constructor) - if debug == nil then - return nil - end - local level = 1 - while true do - local info = debug.getinfo(level, "f") - level = level + 1 - if not info then - level = 1 - break - elseif info.func == constructor then - break - end - end - if __TS__StringIncludes(_VERSION, "Lua 5.0") then - return debug.traceback(("[Level " .. tostring(level)) .. "]") - elseif _VERSION == "Lua 5.1" then - return string.sub( - debug.traceback("", level), - 2 - ) - else - return debug.traceback(nil, level) - end - end - local function wrapErrorToString(self, getDescription) - return function(self) - local description = getDescription(self) - local caller = debug.getinfo(3, "f") - local isClassicLua = __TS__StringIncludes(_VERSION, "Lua 5.0") - if isClassicLua or caller and caller.func ~= error then - return description - else - return (description .. "\n") .. tostring(self.stack) - end - end - end - local function initErrorClass(self, Type, name) - Type.name = name - return setmetatable( - Type, - {__call = function(____, _self, message) return __TS__New(Type, message) end} - ) - end - local ____initErrorClass_1 = initErrorClass - local ____class_0 = __TS__Class() - ____class_0.name = "" - function ____class_0.prototype.____constructor(self, message) - if message == nil then - message = "" - end - self.message = message - self.name = "Error" - self.stack = getErrorStack(nil, __TS__New) - local metatable = getmetatable(self) - if metatable and not metatable.__errorToStringPatched then - metatable.__errorToStringPatched = true - metatable.__tostring = wrapErrorToString(nil, metatable.__tostring) - end - end - function ____class_0.prototype.__tostring(self) - return self.message ~= "" and (self.name .. ": ") .. self.message or self.name - end - Error = ____initErrorClass_1(nil, ____class_0, "Error") - local function createErrorClass(self, name) - local ____initErrorClass_3 = initErrorClass - local ____class_2 = __TS__Class() - ____class_2.name = ____class_2.name - __TS__ClassExtends(____class_2, Error) - function ____class_2.prototype.____constructor(self, ...) - ____class_2.____super.prototype.____constructor( - self, - unpack(arg) - ) - self.name = name - end - return ____initErrorClass_3(nil, ____class_2, name) - end - RangeError = createErrorClass(nil, "RangeError") - ReferenceError = createErrorClass(nil, "ReferenceError") - SyntaxError = createErrorClass(nil, "SyntaxError") - TypeError = createErrorClass(nil, "TypeError") - URIError = createErrorClass(nil, "URIError") -end - -local function __TS__ObjectGetOwnPropertyDescriptors(object) - local metatable = getmetatable(object) - if not metatable then - return {} - end - return rawget(metatable, "_descriptors") or ({}) -end - -local function __TS__Delete(target, key) - local descriptors = __TS__ObjectGetOwnPropertyDescriptors(target) - local descriptor = descriptors[key] - if descriptor then - if not descriptor.configurable then - error( - __TS__New( - TypeError, - ((("Cannot delete property " .. tostring(key)) .. " of ") .. tostring(target)) .. "." - ), - 0 - ) - end - descriptors[key] = nil - return true - end - target[key] = nil - return true -end - local function __TS__StringAccess(self, index) if index >= 0 and index < string.len(self) then return string.sub(self, index + 1, index + 1) end end - local function __TS__DelegatedYield(iterable) if type(iterable) == "string" then for index = 0, string.len(iterable) - 1 do @@ -1233,7 +1035,125 @@ local function __TS__DelegatedYield(iterable) end end end - +local function __TS__ObjectGetOwnPropertyDescriptors(object) + local metatable = getmetatable(object) + if not metatable then + return {} + end + return rawget(metatable, "_descriptors") or ({}) +end +local function __TS__StringIncludes(self, searchString, position) + if not position then + position = 1 + else + position = position + 1 + end + local index = string.find(self, searchString, position, true) + return index ~= nil +end +local function getErrorStack(self, constructor) + if debug == nil then + return nil + end + local level = 1 + while true do + local info = debug.getinfo(level, "f") + level = level + 1 + if not info then + level = 1 + break + elseif info.func == constructor then + break + end + end + if __TS__StringIncludes(_VERSION, "Lua 5.0") then + return debug.traceback(("[Level " .. tostring(level)) .. "]") + elseif _VERSION == "Lua 5.1" then + return string.sub( + debug.traceback("", level), + 2 + ) + else + return debug.traceback(nil, level) + end +end +local function wrapErrorToString(self, getDescription) + return function(self) + local description = getDescription(self) + local caller = debug.getinfo(3, "f") + local isClassicLua = __TS__StringIncludes(_VERSION, "Lua 5.0") + if isClassicLua or caller and caller.func ~= error then + return description + else + return (description .. "\n") .. tostring(self.stack) + end + end +end +local function initErrorClass(self, Type, name) + Type.name = name + return setmetatable( + Type, + {__call = function(____, _self, message) return __TS__New(Type, message) end} + ) +end +local ____initErrorClass_1 = initErrorClass +local ____class_0 = __TS__Class() +____class_0.name = ____class_0.name +function ____class_0.prototype.____constructor(self, message) + if message == nil then + message = "" + end + self.name = "Error" + self.message = message + self.stack = getErrorStack(nil, __TS__New) + local metatable = getmetatable(self) + if metatable and not metatable.__errorToStringPatched then + metatable.__errorToStringPatched = true + metatable.__tostring = wrapErrorToString(nil, metatable.__tostring) + end +end +function ____class_0.prototype.__tostring(self) + return self.message ~= "" and (self.name .. ": ") .. self.message or self.name +end +local Error = ____initErrorClass_1(nil, ____class_0, "Error") +local function createErrorClass(self, name) + local ____initErrorClass_3 = initErrorClass + local ____class_2 = __TS__Class() + ____class_2.name = ____class_2.name + __TS__ClassExtends(____class_2, Error) + function ____class_2.prototype.____constructor(self, ...) + ____class_2.____super.prototype.____constructor( + self, + unpack(arg) + ) + self.name = name + end + return ____initErrorClass_3(nil, ____class_2, name) +end +local RangeError = createErrorClass(nil, "RangeError") +local ReferenceError = createErrorClass(nil, "ReferenceError") +local SyntaxError = createErrorClass(nil, "SyntaxError") +local TypeError = createErrorClass(nil, "TypeError") +local URIError = createErrorClass(nil, "URIError") +local function __TS__Delete(target, key) + local descriptors = __TS__ObjectGetOwnPropertyDescriptors(target) + local descriptor = descriptors[key] + if descriptor then + if not descriptor.configurable then + error( + __TS__New( + TypeError, + ((("Cannot delete property " .. tostring(key)) .. " of ") .. tostring(target)) .. "." + ), + 0 + ) + end + descriptors[key] = nil + return true + end + target[key] = nil + return true +end local function __TS__FunctionBind(fn, ...) local boundArgs = arg return function(____, ...) @@ -1245,7 +1165,6 @@ local function __TS__FunctionBind(fn, ...) return fn(unpack(args)) end end - local function __TS__Unpack(list, i, j) if i == 1 and j == nil then return unpack(list) @@ -1257,54 +1176,48 @@ local function __TS__Unpack(list, i, j) do local n = i while n <= j do - slice[n - i + 1] = list[n] + slice[n - i + 1] = list[n] -- We don't want to add 1 to the index into list. n = n + 1 end end return unpack(slice) end end - -local __TS__Generator -do - local function generatorIterator(self) - return self +local function generatorIterator(self) + return self +end +local function generatorNext(self, ...) + local co = self.____coroutine + if coroutine.status(co) == "dead" then + return {done = true} end - local function generatorNext(self, ...) - local co = self.____coroutine - if coroutine.status(co) == "dead" then - return {done = true} - end - local status, value = coroutine.resume( - co, - unpack(arg) - ) - if not status then - error(value, 0) - end + local status, value = coroutine.resume( + co, + unpack(arg) + ) + if not status then + error(value, 0) + end + return { + value = value, + done = coroutine.status(co) == "dead" + } +end +local function __TS__Generator(fn) + return function(...) + local args = arg + local argsLength = __TS__CountVarargs(unpack(arg)) return { - value = value, - done = coroutine.status(co) == "dead" + ____coroutine = coroutine.create(function() return fn(__TS__Unpack(args, 1, argsLength)) end), + [Symbol.iterator] = generatorIterator, + next = generatorNext } end - function __TS__Generator(fn) - return function(...) - local args = arg - local argsLength = __TS__CountVarargs(unpack(arg)) - return { - ____coroutine = coroutine.create(function() return fn(__TS__Unpack(args, 1, argsLength)) end), - [Symbol.iterator] = generatorIterator, - next = generatorNext - } - end - end end - local function __TS__InstanceOfObject(value) local valueType = type(value) return valueType == "table" or valueType == "function" end - local function __TS__LuaIteratorSpread(self, state, firstKey) local results = {} local key, value = self(state, firstKey) @@ -1314,172 +1227,170 @@ local function __TS__LuaIteratorSpread(self, state, firstKey) end return unpack(results) end - local Map do - Map = __TS__Class() - Map.name = "Map" - function Map.prototype.____constructor(self, entries) - self[Symbol.toStringTag] = "Map" - self.items = {} - self.size = 0 - self.nextKey = {} - self.previousKey = {} - if entries == nil then - return - end - local iterable = entries - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break - end - local value = result.value - self:set(value[1], value[2]) - end - else - local array = entries - for ____, kvp in ipairs(array) do - self:set(kvp[1], kvp[2]) - end - end +Map = __TS__Class() +Map.name = "Map" +function Map.prototype.____constructor(self, entries) + self[Symbol.toStringTag] = "Map" + self.items = {} + self.size = 0 + self.nextKey = {} + self.previousKey = {} + if entries == nil then + return end - function Map.prototype.clear(self) - self.items = {} - self.nextKey = {} - self.previousKey = {} - self.firstKey = nil - self.lastKey = nil - self.size = 0 - end - function Map.prototype.delete(self, key) - local contains = self:has(key) - if contains then - self.size = self.size - 1 - local next = self.nextKey[key] - local previous = self.previousKey[key] - if next ~= nil and previous ~= nil then - self.nextKey[previous] = next - self.previousKey[next] = previous - elseif next ~= nil then - self.firstKey = next - self.previousKey[next] = nil - elseif previous ~= nil then - self.lastKey = previous - self.nextKey[previous] = nil - else - self.firstKey = nil - self.lastKey = nil + local iterable = entries + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break end - self.nextKey[key] = nil - self.previousKey[key] = nil + local value = result.value -- Ensures index is offset when tuple is accessed + self:set(value[1], value[2]) end - self.items[key] = nil - return contains - end - function Map.prototype.forEach(self, callback) - for ____, key in __TS__Iterator(self:keys()) do - callback(nil, self.items[key], key, self) + else + local array = entries + for ____, kvp in ipairs(array) do + self:set(kvp[1], kvp[2]) + end + end +end +function Map.prototype.clear(self) + self.items = {} + self.nextKey = {} + self.previousKey = {} + self.firstKey = nil + self.lastKey = nil + self.size = 0 +end +function Map.prototype.delete(self, key) + local contains = self:has(key) + if contains then + self.size = self.size - 1 + local next = self.nextKey[key] + local previous = self.previousKey[key] + if next ~= nil and previous ~= nil then + self.nextKey[previous] = next + self.previousKey[next] = previous + elseif next ~= nil then + self.firstKey = next + self.previousKey[next] = nil + elseif previous ~= nil then + self.lastKey = previous + self.nextKey[previous] = nil + else + self.firstKey = nil + self.lastKey = nil end + self.nextKey[key] = nil + self.previousKey[key] = nil end - function Map.prototype.get(self, key) - return self.items[key] + self.items[key] = nil + return contains +end +function Map.prototype.forEach(self, callback) + for ____, key in __TS__Iterator(self:keys()) do + callback(nil, self.items[key], key, self) end - function Map.prototype.has(self, key) - return self.nextKey[key] ~= nil or self.lastKey == key +end +function Map.prototype.get(self, key) + return self.items[key] +end +function Map.prototype.has(self, key) + return self.nextKey[key] ~= nil or self.lastKey == key +end +function Map.prototype.set(self, key, value) + local isNewValue = not self:has(key) + if isNewValue then + self.size = self.size + 1 end - function Map.prototype.set(self, key, value) - local isNewValue = not self:has(key) - if isNewValue then - self.size = self.size + 1 - end - self.items[key] = value - if self.firstKey == nil then - self.firstKey = key - self.lastKey = key - elseif isNewValue then - self.nextKey[self.lastKey] = key - self.previousKey[key] = self.lastKey - self.lastKey = key - end - return self + self.items[key] = value + if self.firstKey == nil then + self.firstKey = key + self.lastKey = key + elseif isNewValue then + self.nextKey[self.lastKey] = key + self.previousKey[key] = self.lastKey + self.lastKey = key end - Map.prototype[Symbol.iterator] = function(self) - return self:entries() + return self +end +Map.prototype[Symbol.iterator] = function(self) + return self:entries() +end +function Map.prototype.entries(self) + local function getFirstKey() + return self.firstKey end - function Map.prototype.entries(self) - local function getFirstKey() - return self.firstKey - end - local items = self.items - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = {key, items[key]}} + local items = self.items + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] end - } - end - function Map.prototype.keys(self) - local function getFirstKey() - return self.firstKey + return {done = not key, value = {key, items[key]}} end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = key} - end - } + } +end +function Map.prototype.keys(self) + local function getFirstKey() + return self.firstKey end - function Map.prototype.values(self) - local function getFirstKey() - return self.firstKey - end - local items = self.items - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = items[key]} + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] end - } + return {done = not key, value = key} + end + } +end +function Map.prototype.values(self) + local function getFirstKey() + return self.firstKey end - Map[Symbol.species] = Map + local items = self.items + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = items[key]} + end + } +end +Map[Symbol.species] = Map end - local function __TS__MapGroupBy(items, keySelector) local result = __TS__New(Map) local i = 0 @@ -1495,7 +1406,6 @@ local function __TS__MapGroupBy(items, keySelector) end return result end - local function __TS__StringSlice(self, start, ____end) if start == nil or start ~= start then start = 0 @@ -1511,7 +1421,6 @@ local function __TS__StringSlice(self, start, ____end) end return string.sub(self, start, ____end) end - local function __TS__Match(s, pattern, init) local ____temp_0 = {string.find(s, pattern, init)} local start = ____temp_0[1] @@ -1525,18 +1434,14 @@ local function __TS__Match(s, pattern, init) return unpack(captures) end end - local __TS__MathAtan2 = math.atan2 or math.atan - local function __TS__MathModf(x) local integral = x > 0 and math.floor(x) or math.ceil(x) return integral, x - integral end - local function __TS__NumberIsNaN(value) return value ~= value end - local function __TS__MathSign(val) if __TS__NumberIsNaN(val) or val == 0 then return val @@ -1546,18 +1451,15 @@ local function __TS__MathSign(val) end return 1 end - local function __TS__NumberIsFinite(value) return type(value) == "number" and value == value and value ~= 1 / 0 and value ~= -(1 / 0) end - local function __TS__MathTrunc(val) if not __TS__NumberIsFinite(val) or val == 0 then return val end return val > 0 and math.floor(val) or math.ceil(val) end - local function __TS__Number(value) local valueType = type(value) if valueType == "number" then @@ -1584,121 +1486,9 @@ local function __TS__Number(value) return 0 / 0 end end - local function __TS__NumberIsInteger(value) return __TS__NumberIsFinite(value) and math.floor(value) == value end - -local function __TS__StringSubstring(self, start, ____end) - if ____end ~= ____end then - ____end = 0 - end - if ____end ~= nil and start > ____end then - start, ____end = ____end, start - end - if start >= 0 then - start = start + 1 - else - start = 1 - end - if ____end ~= nil and ____end < 0 then - ____end = 0 - end - return string.sub(self, start, ____end) -end - -local __TS__ParseInt -do - local parseIntBasePattern = "0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTvVwWxXyYzZ" - function __TS__ParseInt(numberString, base) - if base == nil then - base = 10 - local hexMatch = __TS__Match(numberString, "^%s*-?0[xX]") - if hexMatch ~= nil then - base = 16 - numberString = (__TS__Match(hexMatch, "-")) and "-" .. __TS__StringSubstring( - numberString, - string.len(hexMatch) - ) or __TS__StringSubstring( - numberString, - string.len(hexMatch) - ) - end - end - if base < 2 or base > 36 then - return 0 / 0 - end - local allowedDigits = base <= 10 and __TS__StringSubstring(parseIntBasePattern, 0, base) or __TS__StringSubstring(parseIntBasePattern, 0, 10 + 2 * (base - 10)) - local pattern = ("^%s*(-?[" .. allowedDigits) .. "]*)" - local number = tonumber((__TS__Match(numberString, pattern)), base) - if number == nil then - return 0 / 0 - end - if number >= 0 then - return math.floor(number) - else - return math.ceil(number) - end - end -end - -local function __TS__ParseFloat(numberString) - local infinityMatch = __TS__Match(numberString, "^%s*(-?Infinity)") - if infinityMatch ~= nil then - return __TS__StringAccess(infinityMatch, 0) == "-" and -(1 / 0) or 1 / 0 - end - local number = tonumber((__TS__Match(numberString, "^%s*(-?%d+%.?%d*)"))) - return number or 0 / 0 -end - -local __TS__NumberToString -do - local radixChars = "0123456789abcdefghijklmnopqrstuvwxyz" - function __TS__NumberToString(self, radix) - if radix == nil or radix == 10 or self == 1 / 0 or self == -(1 / 0) or self ~= self then - return tostring(self) - end - radix = math.floor(radix) - if radix < 2 or radix > 36 then - error("toString() radix argument must be between 2 and 36", 0) - end - local integer, fraction = __TS__MathModf(math.abs(self)) - local result = "" - if radix == 8 then - result = string.format("%o", integer) - elseif radix == 16 then - result = string.format("%x", integer) - else - repeat - do - result = __TS__StringAccess( - radixChars, - math.mod(integer, radix) - ) .. result - integer = math.floor(integer / radix) - end - until not (integer ~= 0) - end - if fraction ~= 0 then - result = result .. "." - local delta = 1e-16 - repeat - do - fraction = fraction * radix - delta = delta * radix - local digit = math.floor(fraction) - result = result .. __TS__StringAccess(radixChars, digit) - fraction = fraction - digit - end - until not (fraction >= delta) - end - if self < 0 then - result = "-" .. result - end - return result - end -end - local function __TS__NumberToFixed(self, fractionDigits) if math.abs(self) >= 1e+21 or self ~= self then return tostring(self) @@ -1712,7 +1502,50 @@ local function __TS__NumberToFixed(self, fractionDigits) self ) end - +local radixChars = "0123456789abcdefghijklmnopqrstuvwxyz" +local function __TS__NumberToString(self, radix) + if radix == nil or radix == 10 or self == 1 / 0 or self == -(1 / 0) or self ~= self then + return tostring(self) + end + radix = math.floor(radix) + if radix < 2 or radix > 36 then + error("toString() radix argument must be between 2 and 36", 0) + end + local integer, fraction = __TS__MathModf(math.abs(self)) + local result = "" + if radix == 8 then + result = string.format("%o", integer) + elseif radix == 16 then + result = string.format("%x", integer) + else + repeat + do + result = __TS__StringAccess( + radixChars, + math.mod(integer, radix) + ) .. result + integer = math.floor(integer / radix) + end + until not (integer ~= 0) + end + if fraction ~= 0 then + result = result .. "." + local delta = 1e-16 + repeat + do + fraction = fraction * radix + delta = delta * radix + local digit = math.floor(fraction) + result = result .. __TS__StringAccess(radixChars, digit) + fraction = fraction - digit + end + until not (fraction >= delta) + end + if self < 0 then + result = "-" .. result + end + return result +end local function __TS__ObjectDefineProperty(target, key, desc) local luaKey = type(key) == "number" and key + 1 or key local value = rawget(target, luaKey) @@ -1760,7 +1593,6 @@ local function __TS__ObjectDefineProperty(target, key, desc) __TS__SetDescriptor(target, luaKey, descriptor) return target end - local function __TS__ObjectEntries(obj) local result = {} local len = 0 @@ -1770,7 +1602,6 @@ local function __TS__ObjectEntries(obj) end return result end - local function __TS__ObjectFromEntries(entries) local obj = {} local iterable = entries @@ -1791,7 +1622,6 @@ local function __TS__ObjectFromEntries(entries) end return obj end - local function __TS__ObjectGroupBy(items, keySelector) local result = {} local i = 0 @@ -1807,7 +1637,6 @@ local function __TS__ObjectGroupBy(items, keySelector) end return result end - local function __TS__ObjectKeys(obj) local result = {} local len = 0 @@ -1817,7 +1646,6 @@ local function __TS__ObjectKeys(obj) end return result end - local function __TS__ObjectRest(target, usedProperties) local result = {} for property in pairs(target) do @@ -1827,7 +1655,6 @@ local function __TS__ObjectRest(target, usedProperties) end return result end - local function __TS__ObjectValues(obj) local result = {} local len = 0 @@ -1837,7 +1664,62 @@ local function __TS__ObjectValues(obj) end return result end - +local function __TS__ParseFloat(numberString) + local infinityMatch = __TS__Match(numberString, "^%s*(-?Infinity)") + if infinityMatch ~= nil then + return __TS__StringAccess(infinityMatch, 0) == "-" and -(1 / 0) or 1 / 0 + end + local number = tonumber((__TS__Match(numberString, "^%s*(-?%d+%.?%d*)"))) + return number or 0 / 0 +end +local function __TS__StringSubstring(self, start, ____end) + if ____end ~= ____end then + ____end = 0 + end + if ____end ~= nil and start > ____end then + start, ____end = unpack({____end, start}) + end + if start >= 0 then + start = start + 1 + else + start = 1 + end + if ____end ~= nil and ____end < 0 then + ____end = 0 + end + return string.sub(self, start, ____end) +end +local parseIntBasePattern = "0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTvVwWxXyYzZ" +local function __TS__ParseInt(numberString, base) + if base == nil then + base = 10 + local hexMatch = __TS__Match(numberString, "^%s*-?0[xX]") + if hexMatch ~= nil then + base = 16 + numberString = (__TS__Match(hexMatch, "-")) and "-" .. __TS__StringSubstring( + numberString, + string.len(hexMatch) + ) or __TS__StringSubstring( + numberString, + string.len(hexMatch) + ) + end + end + if base < 2 or base > 36 then + return 0 / 0 + end + local allowedDigits = base <= 10 and __TS__StringSubstring(parseIntBasePattern, 0, base) or __TS__StringSubstring(parseIntBasePattern, 0, 10 + 2 * (base - 10)) + local pattern = ("^%s*(-?[" .. allowedDigits) .. "]*)" + local number = tonumber((__TS__Match(numberString, pattern)), base) + if number == nil then + return 0 / 0 + end + if number >= 0 then + return math.floor(number) + else + return math.ceil(number) + end +end local function __TS__PromiseAll(iterable) local results = {} local toResolve = {} @@ -1882,7 +1764,6 @@ local function __TS__PromiseAll(iterable) end ) end - local function __TS__PromiseAllSettled(iterable) local results = {} local toResolve = {} @@ -1931,7 +1812,6 @@ local function __TS__PromiseAllSettled(iterable) end ) end - local function __TS__PromiseAny(iterable) local rejections = {} local pending = {} @@ -1973,7 +1853,6 @@ local function __TS__PromiseAny(iterable) end ) end - local function __TS__PromiseRace(iterable) local pending = {} for ____, item in __TS__Iterator(iterable) do @@ -2002,328 +1881,218 @@ local function __TS__PromiseRace(iterable) end ) end - local Set do - Set = __TS__Class() - Set.name = "Set" - function Set.prototype.____constructor(self, values) - self[Symbol.toStringTag] = "Set" - self.size = 0 - self.nextKey = {} - self.previousKey = {} - if values == nil then - return - end - local iterable = values - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break - end - self:add(result.value) - end - else - local array = values - for ____, value in ipairs(array) do - self:add(value) - end - end - end - function Set.prototype.add(self, value) - local isNewValue = not self:has(value) - if isNewValue then - self.size = self.size + 1 - end - if self.firstKey == nil then - self.firstKey = value - self.lastKey = value - elseif isNewValue then - self.nextKey[self.lastKey] = value - self.previousKey[value] = self.lastKey - self.lastKey = value - end - return self +Set = __TS__Class() +Set.name = "Set" +function Set.prototype.____constructor(self, values) + self[Symbol.toStringTag] = "Set" + self.size = 0 + self.nextKey = {} + self.previousKey = {} + if values == nil then + return end - function Set.prototype.clear(self) - self.nextKey = {} - self.previousKey = {} - self.firstKey = nil - self.lastKey = nil - self.size = 0 - end - function Set.prototype.delete(self, value) - local contains = self:has(value) - if contains then - self.size = self.size - 1 - local next = self.nextKey[value] - local previous = self.previousKey[value] - if next ~= nil and previous ~= nil then - self.nextKey[previous] = next - self.previousKey[next] = previous - elseif next ~= nil then - self.firstKey = next - self.previousKey[next] = nil - elseif previous ~= nil then - self.lastKey = previous - self.nextKey[previous] = nil - else - self.firstKey = nil - self.lastKey = nil + local iterable = values + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break end - self.nextKey[value] = nil - self.previousKey[value] = nil + self:add(result.value) end - return contains - end - function Set.prototype.forEach(self, callback) - for ____, key in __TS__Iterator(self:keys()) do - callback(nil, key, key, self) + else + local array = values + for ____, value in ipairs(array) do + self:add(value) end end - function Set.prototype.has(self, value) - return self.nextKey[value] ~= nil or self.lastKey == value - end - Set.prototype[Symbol.iterator] = function(self) - return self:values() +end +function Set.prototype.add(self, value) + local isNewValue = not self:has(value) + if isNewValue then + self.size = self.size + 1 end - function Set.prototype.entries(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = {key, key}} - end - } + if self.firstKey == nil then + self.firstKey = value + self.lastKey = value + elseif isNewValue then + self.nextKey[self.lastKey] = value + self.previousKey[value] = self.lastKey + self.lastKey = value end - function Set.prototype.keys(self) - local function getFirstKey() - return self.firstKey + return self +end +function Set.prototype.clear(self) + self.nextKey = {} + self.previousKey = {} + self.firstKey = nil + self.lastKey = nil + self.size = 0 +end +function Set.prototype.delete(self, value) + local contains = self:has(value) + if contains then + self.size = self.size - 1 + local next = self.nextKey[value] + local previous = self.previousKey[value] + if next ~= nil and previous ~= nil then + self.nextKey[previous] = next + self.previousKey[next] = previous + elseif next ~= nil then + self.firstKey = next + self.previousKey[next] = nil + elseif previous ~= nil then + self.lastKey = previous + self.nextKey[previous] = nil + else + self.firstKey = nil + self.lastKey = nil end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = key} - end - } + self.nextKey[value] = nil + self.previousKey[value] = nil end - function Set.prototype.values(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = key} - end - } + return contains +end +function Set.prototype.forEach(self, callback) + for ____, key in __TS__Iterator(self:keys()) do + callback(nil, key, key, self) end - function Set.prototype.union(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - result:add(item) - end - return result +end +function Set.prototype.has(self, value) + return self.nextKey[value] ~= nil or self.lastKey == value +end +Set.prototype[Symbol.iterator] = function(self) + return self:values() +end +function Set.prototype.entries(self) + local function getFirstKey() + return self.firstKey end - function Set.prototype.intersection(self, other) - local result = __TS__New(Set) - for ____, item in __TS__Iterator(self) do - if other:has(item) then - result:add(item) + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] end + return {done = not key, value = {key, key}} end - return result - end - function Set.prototype.difference(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - result:delete(item) - end - return result + } +end +function Set.prototype.keys(self) + local function getFirstKey() + return self.firstKey end - function Set.prototype.symmetricDifference(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - if self:has(item) then - result:delete(item) + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) else - result:add(item) - end - end - return result - end - function Set.prototype.isSubsetOf(self, other) - for ____, item in __TS__Iterator(self) do - if not other:has(item) then - return false + key = nextKey[key] end + return {done = not key, value = key} end - return true + } +end +function Set.prototype.values(self) + local function getFirstKey() + return self.firstKey end - function Set.prototype.isSupersetOf(self, other) - for ____, item in __TS__Iterator(other) do - if not self:has(item) then - return false + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] end + return {done = not key, value = key} end - return true + } +end +function Set.prototype.union(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do + result:add(item) end - function Set.prototype.isDisjointFrom(self, other) - for ____, item in __TS__Iterator(self) do - if other:has(item) then - return false - end + return result +end +function Set.prototype.intersection(self, other) + local result = __TS__New(Set) + for ____, item in __TS__Iterator(self) do + if other:has(item) then + result:add(item) end - return true end - Set[Symbol.species] = Set -end - -local function __TS__SparseArrayNew(...) - local sparseArray = {unpack(arg)} - sparseArray.sparseLength = __TS__CountVarargs(unpack(arg)) - return sparseArray + return result end - -local function __TS__SparseArrayPush(sparseArray, ...) - local args = arg - local argsLen = __TS__CountVarargs(unpack(arg)) - local listLen = sparseArray.sparseLength - for i = 1, argsLen do - sparseArray[listLen + i] = args[i] +function Set.prototype.difference(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do + result:delete(item) end - sparseArray.sparseLength = listLen + argsLen -end - -local function __TS__SparseArraySpread(sparseArray) - return __TS__Unpack(sparseArray, 1, sparseArray.sparseLength) + return result end - -local WeakMap -do - WeakMap = __TS__Class() - WeakMap.name = "WeakMap" - function WeakMap.prototype.____constructor(self, entries) - self[Symbol.toStringTag] = "WeakMap" - self.items = {} - setmetatable(self.items, {__mode = "k"}) - if entries == nil then - return - end - local iterable = entries - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break - end - local value = result.value - self.items[value[1]] = value[2] - end +function Set.prototype.symmetricDifference(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do + if self:has(item) then + result:delete(item) else - for ____, kvp in ipairs(entries) do - self.items[kvp[1]] = kvp[2] - end + result:add(item) end end - function WeakMap.prototype.delete(self, key) - local contains = self:has(key) - self.items[key] = nil - return contains - end - function WeakMap.prototype.get(self, key) - return self.items[key] - end - function WeakMap.prototype.has(self, key) - return self.items[key] ~= nil - end - function WeakMap.prototype.set(self, key, value) - self.items[key] = value - return self - end - WeakMap[Symbol.species] = WeakMap + return result end - -local WeakSet -do - WeakSet = __TS__Class() - WeakSet.name = "WeakSet" - function WeakSet.prototype.____constructor(self, values) - self[Symbol.toStringTag] = "WeakSet" - self.items = {} - setmetatable(self.items, {__mode = "k"}) - if values == nil then - return - end - local iterable = values - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break - end - self.items[result.value] = true - end - else - for ____, value in ipairs(values) do - self.items[value] = true - end +function Set.prototype.isSubsetOf(self, other) + for ____, item in __TS__Iterator(self) do + if not other:has(item) then + return false end end - function WeakSet.prototype.add(self, value) - self.items[value] = true - return self - end - function WeakSet.prototype.delete(self, value) - local contains = self:has(value) - self.items[value] = nil - return contains + return true +end +function Set.prototype.isSupersetOf(self, other) + for ____, item in __TS__Iterator(other) do + if not self:has(item) then + return false + end end - function WeakSet.prototype.has(self, value) - return self.items[value] == true + return true +end +function Set.prototype.isDisjointFrom(self, other) + for ____, item in __TS__Iterator(self) do + if other:has(item) then + return false + end end - WeakSet[Symbol.species] = WeakSet + return true +end +Set[Symbol.species] = Set end - local function __TS__SourceMapTraceBack(fileName, sourceMap) _G.__TS__sourcemap = _G.__TS__sourcemap or ({}) _G.__TS__sourcemap[fileName] = sourceMap @@ -2380,7 +2149,23 @@ local function __TS__SourceMapTraceBack(fileName, sourceMap) end end end - +local function __TS__SparseArrayNew(...) + local sparseArray = {unpack(arg)} + sparseArray.sparseLength = __TS__CountVarargs(unpack(arg)) + return sparseArray +end +local function __TS__SparseArrayPush(sparseArray, ...) + local args = arg + local argsLen = __TS__CountVarargs(unpack(arg)) + local listLen = sparseArray.sparseLength + for i = 1, argsLen do + sparseArray[listLen + i] = args[i] + end + sparseArray.sparseLength = listLen + argsLen +end +local function __TS__SparseArraySpread(sparseArray) + return __TS__Unpack(sparseArray, 1, sparseArray.sparseLength) +end local function __TS__Spread(iterable) local arr = {} if type(iterable) == "string" then @@ -2396,7 +2181,6 @@ local function __TS__Spread(iterable) end return unpack(arr) end - local function __TS__StringCharAt(self, pos) if pos ~= pos then pos = 0 @@ -2406,7 +2190,6 @@ local function __TS__StringCharAt(self, pos) end return string.sub(self, pos + 1, pos + 1) end - local function __TS__StringCharCodeAt(self, index) if index ~= index then index = 0 @@ -2416,7 +2199,6 @@ local function __TS__StringCharCodeAt(self, index) end return string.byte(self, index + 1) or 0 / 0 end - local function __TS__StringEndsWith(self, searchString, endPosition) if endPosition == nil or endPosition > string.len(self) then endPosition = string.len(self) @@ -2427,7 +2209,6 @@ local function __TS__StringEndsWith(self, searchString, endPosition) endPosition ) == searchString end - local function __TS__StringPadEnd(self, maxLength, fillString) if fillString == nil then fillString = " " @@ -2454,7 +2235,6 @@ local function __TS__StringPadEnd(self, maxLength, fillString) math.floor(maxLength) ) end - local function __TS__StringPadStart(self, maxLength, fillString) if fillString == nil then fillString = " " @@ -2481,102 +2261,95 @@ local function __TS__StringPadStart(self, maxLength, fillString) math.floor(maxLength) ) .. self end - -local __TS__StringReplace -do - local sub = string.sub - function __TS__StringReplace(source, searchValue, replaceValue) - local startPos, endPos = string.find(source, searchValue, nil, true) - if not startPos then - return source - end - local before = sub(source, 1, startPos - 1) - local replacement = type(replaceValue) == "string" and replaceValue or replaceValue(nil, searchValue, startPos - 1, source) - local after = sub(source, endPos + 1) - return (before .. replacement) .. after +local sub = string.sub +local function __TS__StringReplace(source, searchValue, replaceValue) + local startPos, endPos = string.find(source, searchValue, nil, true) + if not startPos then + return source end + local before = sub(source, 1, startPos - 1) + local ____temp_0 + if type(replaceValue) == "string" then + ____temp_0 = replaceValue + else + ____temp_0 = replaceValue(nil, searchValue, startPos - 1, source) + end + local replacement = ____temp_0 + local after = sub(source, endPos + 1) + return (before .. replacement) .. after end - -local __TS__StringSplit -do - local sub = string.sub - local find = string.find - function __TS__StringSplit(source, separator, limit) - if limit == nil then - limit = 4294967295 - end - if limit == 0 then - return {} - end - local result = {} - local resultIndex = 1 - if separator == nil or separator == "" then - for i = 1, string.len(source) do - result[resultIndex] = sub(source, i, i) - resultIndex = resultIndex + 1 - end - else - local currentPos = 1 - while resultIndex <= limit do - local startPos, endPos = find(source, separator, currentPos, true) - if not startPos then - break - end - result[resultIndex] = sub(source, currentPos, startPos - 1) - resultIndex = resultIndex + 1 - currentPos = endPos + 1 - end - if resultIndex <= limit then - result[resultIndex] = sub(source, currentPos) +local sub = string.sub +local find = string.find +local function __TS__StringSplit(source, separator, limit) + if limit == nil then + limit = 4294967295 + end + if limit == 0 then + return {} + end + local result = {} + local resultIndex = 1 + if separator == nil or separator == "" then + for i = 1, string.len(source) do + result[resultIndex] = sub(source, i, i) + resultIndex = resultIndex + 1 + end + else + local currentPos = 1 + while resultIndex <= limit do + local startPos, endPos = find(source, separator, currentPos, true) + if not startPos then + break end + result[resultIndex] = sub(source, currentPos, startPos - 1) + resultIndex = resultIndex + 1 + currentPos = endPos + 1 + end + if resultIndex <= limit then + result[resultIndex] = sub(source, currentPos) end - return result end + return result end - -local __TS__StringReplaceAll -do - local sub = string.sub - local find = string.find - function __TS__StringReplaceAll(source, searchValue, replaceValue) - if type(replaceValue) == "string" then - local concat = table.concat( - __TS__StringSplit(source, searchValue), - replaceValue - ) - if string.len(searchValue) == 0 then - return (replaceValue .. concat) .. replaceValue - end - return concat - end - local parts = {} - local partsIndex = 1 +local sub = string.sub +local find = string.find +local function __TS__StringReplaceAll(source, searchValue, replaceValue) + if type(replaceValue) == "string" then + local concat = table.concat( + __TS__StringSplit(source, searchValue), + replaceValue + ) if string.len(searchValue) == 0 then - parts[1] = replaceValue(nil, "", 0, source) - partsIndex = 2 - for i = 1, string.len(source) do - parts[partsIndex] = sub(source, i, i) - parts[partsIndex + 1] = replaceValue(nil, "", i, source) - partsIndex = partsIndex + 2 - end - else - local currentPos = 1 - while true do - local startPos, endPos = find(source, searchValue, currentPos, true) - if not startPos then - break - end - parts[partsIndex] = sub(source, currentPos, startPos - 1) - parts[partsIndex + 1] = replaceValue(nil, searchValue, startPos - 1, source) - partsIndex = partsIndex + 2 - currentPos = endPos + 1 + return (replaceValue .. concat) .. replaceValue + end + return concat + end + local parts = {} + local partsIndex = 1 + if string.len(searchValue) == 0 then + parts[1] = replaceValue(nil, "", 0, source) + partsIndex = 2 + for i = 1, string.len(source) do + parts[partsIndex] = sub(source, i, i) + parts[partsIndex + 1] = replaceValue(nil, "", i, source) + partsIndex = partsIndex + 2 + end + else + local currentPos = 1 + while true do + local startPos, endPos = find(source, searchValue, currentPos, true) + if not startPos then + break end - parts[partsIndex] = sub(source, currentPos) + parts[partsIndex] = sub(source, currentPos, startPos - 1) + parts[partsIndex + 1] = replaceValue(nil, searchValue, startPos - 1, source) + partsIndex = partsIndex + 2 + currentPos = endPos + 1 end - return table.concat(parts) + parts[partsIndex] = sub(source, currentPos) end + return table.concat(parts) end - local function __TS__StringStartsWith(self, searchString, position) if position == nil or position < 0 then position = 0 @@ -2587,7 +2360,6 @@ local function __TS__StringStartsWith(self, searchString, position) string.len(searchString) + position ) == searchString end - local function __TS__StringSubstr(self, from, length) if from ~= from then from = 0 @@ -2603,41 +2375,33 @@ local function __TS__StringSubstr(self, from, length) end return string.sub(self, from, length) end - local function __TS__StringTrim(self) local result = string.gsub(self, "^[%s ]*(.-)[%s ]*$", "%1") return result end - local function __TS__StringTrimEnd(self) local result = string.gsub(self, "[%s ]*$", "") return result end - local function __TS__StringTrimStart(self) local result = string.gsub(self, "^[%s ]*", "") return result end - -local __TS__SymbolRegistryFor, __TS__SymbolRegistryKeyFor -do - local symbolRegistry = {} - function __TS__SymbolRegistryFor(key) - if not symbolRegistry[key] then - symbolRegistry[key] = __TS__Symbol(key) - end - return symbolRegistry[key] +local symbolRegistry = {} +local function __TS__SymbolRegistryFor(key) + if not symbolRegistry[key] then + symbolRegistry[key] = __TS__Symbol(key) end - function __TS__SymbolRegistryKeyFor(sym) - for key in pairs(symbolRegistry) do - if symbolRegistry[key] == sym then - return key - end + return symbolRegistry[key] +end +local function __TS__SymbolRegistryKeyFor(sym) + for key in pairs(symbolRegistry) do + if symbolRegistry[key] == sym then + return key end - return nil end + return nil end - local function __TS__TypeOf(value) local luaType = type(value) if luaType == "table" then @@ -2648,7 +2412,6 @@ local function __TS__TypeOf(value) return luaType end end - local function __TS__Using(self, cb, ...) local args = arg local thrownError @@ -2659,7 +2422,7 @@ local function __TS__Using(self, cb, ...) return thrownError end ) - local argArray = {unpack(args)} + local argArray = {unpack(arg)} do local i = table.getn(argArray) - 1 while i >= 0 do @@ -2673,7 +2436,6 @@ local function __TS__Using(self, cb, ...) end return result end - local function __TS__UsingAsync(self, cb, ...) local args = arg return __TS__AsyncAwaiter(function(____awaiter_resolve) @@ -2709,7 +2471,92 @@ local function __TS__UsingAsync(self, cb, ...) return ____awaiter_resolve(nil, result) end) end - +local WeakMap +do +WeakMap = __TS__Class() +WeakMap.name = "WeakMap" +function WeakMap.prototype.____constructor(self, entries) + self[Symbol.toStringTag] = "WeakMap" + self.items = {} + setmetatable(self.items, {__mode = "k"}) + if entries == nil then + return + end + local iterable = entries + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + local value = result.value -- Ensures index is offset when tuple is accessed + self.items[value[1]] = value[2] + end + else + for ____, kvp in ipairs(entries) do + self.items[kvp[1]] = kvp[2] + end + end +end +function WeakMap.prototype.delete(self, key) + local contains = self:has(key) + self.items[key] = nil + return contains +end +function WeakMap.prototype.get(self, key) + return self.items[key] +end +function WeakMap.prototype.has(self, key) + return self.items[key] ~= nil +end +function WeakMap.prototype.set(self, key, value) + self.items[key] = value + return self +end +WeakMap[Symbol.species] = WeakMap +end +local WeakSet +do +WeakSet = __TS__Class() +WeakSet.name = "WeakSet" +function WeakSet.prototype.____constructor(self, values) + self[Symbol.toStringTag] = "WeakSet" + self.items = {} + setmetatable(self.items, {__mode = "k"}) + if values == nil then + return + end + local iterable = values + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + self.items[result.value] = true + end + else + for ____, value in ipairs(values) do + self.items[value] = true + end + end +end +function WeakSet.prototype.add(self, value) + self.items[value] = true + return self +end +function WeakSet.prototype.delete(self, value) + local contains = self:has(value) + self.items[value] = nil + return contains +end +function WeakSet.prototype.has(self, value) + return self.items[value] == true +end +WeakSet[Symbol.species] = WeakSet +end local function __TS__MapForOfStep(map, prev) local key if prev == nil then @@ -2773,25 +2620,29 @@ end local function __TS__SetForOf(set) return __TS__SetForOfStep, set, nil end - return { - __TS__MapForOf = __TS__MapForOf, - __TS__MapForOfStep = __TS__MapForOfStep, - __TS__MapKeysForOf = __TS__MapKeysForOf, - __TS__MapKeysForOfStep = __TS__MapKeysForOfStep, - __TS__MapValuesForOf = __TS__MapValuesForOf, - __TS__MapValuesForOfStep = __TS__MapValuesForOfStep, - __TS__SetForOf = __TS__SetForOf, - __TS__SetForOfStep = __TS__SetForOfStep, + Error = Error, + Map = Map, + RangeError = RangeError, + ReferenceError = ReferenceError, + Set = Set, + Symbol = Symbol, + SyntaxError = SyntaxError, + TypeError = TypeError, + URIError = URIError, + WeakMap = WeakMap, + WeakSet = WeakSet, __TS__ArrayAt = __TS__ArrayAt, __TS__ArrayConcat = __TS__ArrayConcat, __TS__ArrayEntries = __TS__ArrayEntries, __TS__ArrayEvery = __TS__ArrayEvery, __TS__ArrayFill = __TS__ArrayFill, __TS__ArrayFilter = __TS__ArrayFilter, - __TS__ArrayForEach = __TS__ArrayForEach, __TS__ArrayFind = __TS__ArrayFind, __TS__ArrayFindIndex = __TS__ArrayFindIndex, + __TS__ArrayFlat = __TS__ArrayFlat, + __TS__ArrayFlatMap = __TS__ArrayFlatMap, + __TS__ArrayForEach = __TS__ArrayForEach, __TS__ArrayFrom = __TS__ArrayFrom, __TS__ArrayIncludes = __TS__ArrayIncludes, __TS__ArrayIndexOf = __TS__ArrayIndexOf, @@ -2803,18 +2654,16 @@ return { __TS__ArrayReduce = __TS__ArrayReduce, __TS__ArrayReduceRight = __TS__ArrayReduceRight, __TS__ArrayReverse = __TS__ArrayReverse, - __TS__ArrayUnshift = __TS__ArrayUnshift, - __TS__ArraySort = __TS__ArraySort, + __TS__ArraySetLength = __TS__ArraySetLength, __TS__ArraySlice = __TS__ArraySlice, __TS__ArraySome = __TS__ArraySome, + __TS__ArraySort = __TS__ArraySort, __TS__ArraySplice = __TS__ArraySplice, __TS__ArrayToObject = __TS__ArrayToObject, - __TS__ArrayFlat = __TS__ArrayFlat, - __TS__ArrayFlatMap = __TS__ArrayFlatMap, - __TS__ArraySetLength = __TS__ArraySetLength, __TS__ArrayToReversed = __TS__ArrayToReversed, __TS__ArrayToSorted = __TS__ArrayToSorted, __TS__ArrayToSpliced = __TS__ArrayToSpliced, + __TS__ArrayUnshift = __TS__ArrayUnshift, __TS__ArrayWith = __TS__ArrayWith, __TS__AsyncAwaiter = __TS__AsyncAwaiter, __TS__Await = __TS__Await, @@ -2825,24 +2674,23 @@ return { __TS__Decorate = __TS__Decorate, __TS__DecorateLegacy = __TS__DecorateLegacy, __TS__DecorateParam = __TS__DecorateParam, - __TS__Delete = __TS__Delete, __TS__DelegatedYield = __TS__DelegatedYield, + __TS__Delete = __TS__Delete, __TS__DescriptorGet = __TS__DescriptorGet, __TS__DescriptorSet = __TS__DescriptorSet, - Error = Error, - RangeError = RangeError, - ReferenceError = ReferenceError, - SyntaxError = SyntaxError, - TypeError = TypeError, - URIError = URIError, __TS__FunctionBind = __TS__FunctionBind, __TS__Generator = __TS__Generator, __TS__InstanceOf = __TS__InstanceOf, __TS__InstanceOfObject = __TS__InstanceOfObject, __TS__Iterator = __TS__Iterator, __TS__LuaIteratorSpread = __TS__LuaIteratorSpread, - Map = Map, + __TS__MapForOf = __TS__MapForOf, + __TS__MapForOfStep = __TS__MapForOfStep, __TS__MapGroupBy = __TS__MapGroupBy, + __TS__MapKeysForOf = __TS__MapKeysForOf, + __TS__MapKeysForOfStep = __TS__MapKeysForOfStep, + __TS__MapValuesForOf = __TS__MapValuesForOf, + __TS__MapValuesForOfStep = __TS__MapValuesForOfStep, __TS__Match = __TS__Match, __TS__MathAtan2 = __TS__MathAtan2, __TS__MathModf = __TS__MathModf, @@ -2853,10 +2701,8 @@ return { __TS__NumberIsFinite = __TS__NumberIsFinite, __TS__NumberIsInteger = __TS__NumberIsInteger, __TS__NumberIsNaN = __TS__NumberIsNaN, - __TS__ParseInt = __TS__ParseInt, - __TS__ParseFloat = __TS__ParseFloat, - __TS__NumberToString = __TS__NumberToString, __TS__NumberToFixed = __TS__NumberToFixed, + __TS__NumberToString = __TS__NumberToString, __TS__ObjectAssign = __TS__ObjectAssign, __TS__ObjectDefineProperty = __TS__ObjectDefineProperty, __TS__ObjectEntries = __TS__ObjectEntries, @@ -2874,14 +2720,13 @@ return { __TS__PromiseAllSettled = __TS__PromiseAllSettled, __TS__PromiseAny = __TS__PromiseAny, __TS__PromiseRace = __TS__PromiseRace, - Set = Set, __TS__SetDescriptor = __TS__SetDescriptor, + __TS__SetForOf = __TS__SetForOf, + __TS__SetForOfStep = __TS__SetForOfStep, + __TS__SourceMapTraceBack = __TS__SourceMapTraceBack, __TS__SparseArrayNew = __TS__SparseArrayNew, __TS__SparseArrayPush = __TS__SparseArrayPush, __TS__SparseArraySpread = __TS__SparseArraySpread, - WeakMap = WeakMap, - WeakSet = WeakSet, - __TS__SourceMapTraceBack = __TS__SourceMapTraceBack, __TS__Spread = __TS__Spread, __TS__StringAccess = __TS__StringAccess, __TS__StringCharAt = __TS__StringCharAt, @@ -2901,11 +2746,10 @@ return { __TS__StringTrimEnd = __TS__StringTrimEnd, __TS__StringTrimStart = __TS__StringTrimStart, __TS__Symbol = __TS__Symbol, - Symbol = Symbol, __TS__SymbolRegistryFor = __TS__SymbolRegistryFor, __TS__SymbolRegistryKeyFor = __TS__SymbolRegistryKeyFor, __TS__TypeOf = __TS__TypeOf, __TS__Unpack = __TS__Unpack, __TS__Using = __TS__Using, - __TS__UsingAsync = __TS__UsingAsync + __TS__UsingAsync = __TS__UsingAsync, } diff --git a/internal/lualib/lualib_module_info.json b/internal/lualib/lualib_module_info.json index 9fb781b..5f37dea 100644 --- a/internal/lualib/lualib_module_info.json +++ b/internal/lualib/lualib_module_info.json @@ -108,11 +108,11 @@ "StringTrimStart": {"exports":["__TS__StringTrimStart"]}, "Symbol": {"exports":["Symbol","__TS__Symbol"]}, "SymbolRegistry": {"exports":["__TS__SymbolRegistryFor","__TS__SymbolRegistryKeyFor"],"dependencies":["Symbol"]}, + "TsluaIterators": {"exports":["__TS__MapForOfStep","__TS__MapForOf","__TS__MapKeysForOfStep","__TS__MapKeysForOf","__TS__MapValuesForOfStep","__TS__MapValuesForOf","__TS__SetForOfStep","__TS__SetForOf"],"dependencies":["Map","Set"]}, "TypeOf": {"exports":["__TS__TypeOf"]}, "Unpack": {"exports":["__TS__Unpack"]}, "Using": {"exports":["__TS__Using"],"dependencies":["Symbol","Unpack"]}, "UsingAsync": {"exports":["__TS__UsingAsync"],"dependencies":["Await","Symbol","Unpack"]}, "WeakMap": {"exports":["WeakMap"],"dependencies":["Class","Symbol"]}, - "WeakSet": {"exports":["WeakSet"],"dependencies":["Class","Symbol"]}, - "TsluaIterators": {"exports":["__TS__MapForOf","__TS__MapForOfStep","__TS__MapKeysForOf","__TS__MapKeysForOfStep","__TS__MapValuesForOf","__TS__MapValuesForOfStep","__TS__SetForOf","__TS__SetForOfStep"],"dependencies":["Map","Set"]} + "WeakSet": {"exports":["WeakSet"],"dependencies":["Class","Symbol"]} } diff --git a/internal/lualib/lualib_module_info_50.json b/internal/lualib/lualib_module_info_50.json index 907196b..41c7ea9 100644 --- a/internal/lualib/lualib_module_info_50.json +++ b/internal/lualib/lualib_module_info_50.json @@ -108,11 +108,11 @@ "StringTrimStart": {"exports":["__TS__StringTrimStart"]}, "Symbol": {"exports":["Symbol","__TS__Symbol"]}, "SymbolRegistry": {"exports":["__TS__SymbolRegistryFor","__TS__SymbolRegistryKeyFor"],"dependencies":["Symbol"]}, + "TsluaIterators": {"exports":["__TS__MapForOfStep","__TS__MapForOf","__TS__MapKeysForOfStep","__TS__MapKeysForOf","__TS__MapValuesForOfStep","__TS__MapValuesForOf","__TS__SetForOfStep","__TS__SetForOf"],"dependencies":["Map","Set"]}, "TypeOf": {"exports":["__TS__TypeOf"]}, "Unpack": {"exports":["__TS__Unpack"]}, "Using": {"exports":["__TS__Using"],"dependencies":["Symbol"]}, "UsingAsync": {"exports":["__TS__UsingAsync"],"dependencies":["Await","Symbol"]}, "WeakMap": {"exports":["WeakMap"],"dependencies":["Class","Symbol"]}, - "WeakSet": {"exports":["WeakSet"],"dependencies":["Class","Symbol"]}, - "TsluaIterators": {"exports":["__TS__MapForOf","__TS__MapForOfStep","__TS__MapKeysForOf","__TS__MapKeysForOfStep","__TS__MapValuesForOf","__TS__MapValuesForOfStep","__TS__SetForOf","__TS__SetForOfStep"],"dependencies":["Map","Set"]} + "WeakSet": {"exports":["WeakSet"],"dependencies":["Class","Symbol"]} } diff --git a/internal/transpiler/modules.go b/internal/transpiler/modules.go index d74db75..e16fad0 100644 --- a/internal/transpiler/modules.go +++ b/internal/transpiler/modules.go @@ -71,12 +71,19 @@ func (t *Transpiler) transformImportDeclaration(node *ast.Node) []lua.Statement if imp.IsTypeOnly { continue } - // Skip const enum imports — they're inlined, no runtime dependency. + // Skip imports whose target is type-only (interface, type alias, + // or a symbol with no value flag). These emit no runtime reference. sym := t.checker.GetSymbolAtLocation(imp.Name()) if sym != nil && sym.Flags&ast.SymbolFlagsAlias != 0 { resolved := checker.Checker_getImmediateAliasedSymbol(t.checker, sym) - if resolved != nil && resolved.Flags&ast.SymbolFlagsConstEnum != 0 { - continue + if resolved != nil { + // Const enums are inlined — no runtime dep. + if resolved.Flags&ast.SymbolFlagsConstEnum != 0 { + continue + } + if resolved.Flags&ast.SymbolFlagsValue == 0 { + continue + } } } name := imp.Name().AsIdentifier().Text diff --git a/internal/tstltest/testhelper_test.go b/internal/tstltest/testhelper_test.go index e6cae0d..f253898 100644 --- a/internal/tstltest/testhelper_test.go +++ b/internal/tstltest/testhelper_test.go @@ -182,14 +182,9 @@ func trackResult(t *testing.T) { } // getLualibBundle returns the appropriate lualib bundle for the target. -// Uses tslua-built bundle if TSLUA_LUALIB=tslua, otherwise the embedded TSTL bundle. +// Always the embedded bundle, which is itself produced by tslua's own +// transpile of the TS sources (see scripts/update-lualib.sh). func getLualibBundle(target transpiler.LuaTarget) []byte { - if tsluaLualibBundle != nil { - if target == transpiler.LuaTargetLua50 && tsluaLualibBundle50 != nil { - return tsluaLualibBundle50 - } - return tsluaLualibBundle - } return lualib.BundleForTarget(string(target)) } @@ -217,39 +212,11 @@ func bundleForResults(o testOpts, target transpiler.LuaTarget, results []transpi return getLualibBundle(target) } -// tslua-built lualib bundles when TSLUA_LUALIB=tslua is set. -var tsluaLualibBundle []byte // universal (Lua 5.1+) -var tsluaLualibBundle50 []byte // Lua 5.0 - func TestMain(m *testing.M) { flag.Parse() if *globalEmitMode != "" { fmt.Fprintf(os.Stderr, "=== EMIT MODE: %s ===\n", *globalEmitMode) } - if os.Getenv("TSLUA_LUALIB") == "tslua" { - fmt.Fprintln(os.Stderr, "=== LUALIB: tslua-built ===") - repoRoot := luatest.FindRepoFile("go.mod") - if repoRoot != "" { - repoRoot = filepath.Dir(repoRoot) - srcDir := filepath.Join(repoRoot, "extern", "tstl", "src", "lualib") - langExtPath := filepath.Join(repoRoot, "extern", "tstl", "language-extensions") - luaTypesPath := filepath.Join(repoRoot, "extern", "tstl", "node_modules", "lua-types") - bundle, err := lualib.BuildBundleFromSource(srcDir, langExtPath, luaTypesPath, transpiler.LuaTargetUniversal, "universal") - if err != nil { - fmt.Fprintf(os.Stderr, "FATAL: build tslua lualib: %v\n", err) - os.Exit(1) - } - tsluaLualibBundle = []byte(bundle) - fmt.Fprintf(os.Stderr, " bundle size: %d bytes\n", len(tsluaLualibBundle)) - bundle50, err := lualib.BuildBundleFromSource(srcDir, langExtPath, luaTypesPath, transpiler.LuaTargetLua50, "5.0") - if err != nil { - fmt.Fprintf(os.Stderr, "WARNING: build tslua lualib 5.0: %v\n", err) - } else { - tsluaLualibBundle50 = []byte(bundle50) - fmt.Fprintf(os.Stderr, " bundle 5.0 size: %d bytes\n", len(tsluaLualibBundle50)) - } - } - } luatest.Setup() code := m.Run() diff --git a/justfile b/justfile index 188cdd3..95ece03 100644 --- a/justfile +++ b/justfile @@ -71,13 +71,8 @@ bench-lua: go run ./cmd/luabench/ --show-lua # Run all 100%-passing Go tests -testall: tstlgen - FORCE_COLOR=1 gotestsum --format short \ - ./internal/transpiler/ \ - ./internal/lua/... \ - ./internal/luatest/ \ - ./internal/resolve/ \ - ./internal/tstltest/ -skip TestCodegen_ +testall *ARGS: tstlgen + FORCE_COLOR=1 gotestsum --format short ./internal/... -skip TestCodegen_ {{ ARGS }} # Run tests with coverage profiling coverage: @@ -121,6 +116,16 @@ migrate-all: update-lualib: ./scripts/update-lualib.sh +# Diff the committed lualib bundle against a fresh rebuild (sanity check +# equivalent to TestCommittedBundleUpToDate). Empty output means in-sync. +lualib-diff: build + #!/usr/bin/env bash + set -euo pipefail + tmp=$(mktemp) + trap 'rm -f "$tmp"' EXIT + ./tslua lualib > "$tmp" + diff -u internal/lualib/lualib_bundle.lua "$tmp" || true + # Setup TSTL test suite (one-time) tstl-setup: #!/usr/bin/env bash @@ -145,7 +150,7 @@ tstl-test *ARGS: build SERVER_PID=$! trap 'kill $SERVER_PID 2>/dev/null; rm -f "$SOCKET"; cd "$ROOT/extern/tstl" && git checkout -- test/util.ts' EXIT for i in $(seq 1 50); do [ -S "$SOCKET" ] && break; sleep 0.1; done - WORKERS=$(( $(getconf _NPROCESSORS_ONLN) / 2 )) + WORKERS=$(( $(getconf _NPROCESSORS_ONLN) / 3 )) [ "$WORKERS" -lt 1 ] && WORKERS=1 cd "$ROOT/extern/tstl" && TSTL_GO=1 npx jest --no-coverage --maxWorkers="$WORKERS" {{ ARGS }} || true diff --git a/scripts/update-lualib.sh b/scripts/update-lualib.sh index 3d3239b..a2e2ab9 100755 --- a/scripts/update-lualib.sh +++ b/scripts/update-lualib.sh @@ -1,130 +1,49 @@ #!/usr/bin/env bash -# Copies TSTL's built lualib bundles into internal/lualib/ and applies -# tslua-specific patches (custom Lua functions not expressible in TS). -# Also generates per-feature .lua files and module info for selective inlining. +# Regenerates internal/lualib/* from tslua's own transpile of TSTL's lualib +# TypeScript source (extern/tstl/src/lualib/). No longer depends on TSTL's +# prebuilt dist/lualib/ output; tslua now owns the runtime. +# +# Outputs: +# internal/lualib/lualib_bundle.lua (universal, Lua 5.1+) +# internal/lualib/lualib_bundle_50.lua (Lua 5.0) +# internal/lualib/features/*.lua (per-feature bodies, universal) +# internal/lualib/features_50/*.lua (per-feature bodies, 5.0) +# internal/lualib/lualib_module_info.json (feature graph, universal) +# internal/lualib/lualib_module_info_50.json (feature graph, 5.0) +# +# Patches (patches.lua) are folded in by BuildBundleFromSource and +# BuildFeatureDataFromSource; no post-hoc shell injection. # # Usage: just update-lualib -# Prerequisites: extern/tstl must be built (just tstl-setup) +# Prerequisites: extern/tstl submodule initialized (src/lualib/ must exist). +# lua-types is vendored via extern/tstl/node_modules; for a +# fresh checkout run `just tstl-setup` once. set -euo pipefail cd "$(dirname "$0")/.." -TSTL_LUALIB="extern/tstl/dist/lualib" -TARGET="internal/lualib" -PATCHES="$TARGET/patches.lua" - -# Extract export names from patches.lua (lines like "local function __TS__Foo(") -patch_exports() { - grep '^local function __TS__' "$PATCHES" | sed 's/local function \(__TS__[A-Za-z0-9_]*\).*/\1/' | sort -u -} - -# Apply patches to a bundle: insert functions before "return {" and add exports -strip_lua_comments() { - local file="$1" - local tmp - tmp=$(mktemp) - # Remove pure comment lines (-- ...) and collapse resulting blank lines - sed '/^[[:space:]]*--/d' "$file" | sed '/^$/N;/^\n$/d' > "$tmp" - mv "$tmp" "$file" -} - -apply_patches() { - local bundle="$1" - local tmp - tmp=$(mktemp) - - # Build export lines for the return table - local exports="" - for name in $(patch_exports); do - exports="$exports $name = $name,\n" - done - - # 1. Insert patch functions before "return {" - # 2. Insert export entries after "return {" - awk -v patches="$PATCHES" -v exports="$exports" ' - /^return \{/ { - # Insert patch file contents before return - while ((getline line < patches) > 0) print line - close(patches) - print "" - print $0 - # Insert exports after "return {" - printf "%s", exports - next - } - { print } - ' "$bundle" > "$tmp" - - mv "$tmp" "$bundle" -} - -# Apply patches to per-feature data: copy patches.lua as a feature file -# and add its entries to the module info JSON. -apply_patches_to_features() { - local features_dir="$1" - local info_file="$2" - - # Map iterators depend on the Map/Set features (they access internal structure) - cp "$PATCHES" "$features_dir/TsluaIterators.lua" - - # Build the patch feature JSON entry - local exports="" - for name in $(patch_exports); do - if [ -n "$exports" ]; then - exports="$exports,\"$name\"" - else - exports="\"$name\"" - fi - done - - # Insert the patch feature entry into the module info JSON (before the closing }) - local tmp - tmp=$(mktemp) - sed '$d' "$info_file" > "$tmp" # remove closing } - # Ensure trailing comma on last real entry - local tmp2 - tmp2=$(mktemp) - sed '$ s/}$/},/' "$tmp" > "$tmp2" && mv "$tmp2" "$tmp" - echo " \"TsluaIterators\": {\"exports\":[$exports],\"dependencies\":[\"Map\",\"Set\"]}" >> "$tmp" - echo "}" >> "$tmp" - mv "$tmp" "$info_file" -} - -# --- Full bundles (for require mode) --- - -if [ ! -f "$TSTL_LUALIB/universal/lualib_bundle.lua" ]; then - echo "error: $TSTL_LUALIB/universal/lualib_bundle.lua not found. Run 'just tstl-setup' first." >&2 +if [ ! -d "extern/tstl/src/lualib" ]; then + echo "error: extern/tstl/src/lualib not found (init submodules)" >&2 exit 1 fi -cp "$TSTL_LUALIB/universal/lualib_bundle.lua" "$TARGET/lualib_bundle.lua" -apply_patches "$TARGET/lualib_bundle.lua" -strip_lua_comments "$TARGET/lualib_bundle.lua" -echo " updated $TARGET/lualib_bundle.lua" - -if [ -f "$TSTL_LUALIB/5.0/lualib_bundle.lua" ]; then - cp "$TSTL_LUALIB/5.0/lualib_bundle.lua" "$TARGET/lualib_bundle_50.lua" - apply_patches "$TARGET/lualib_bundle_50.lua" - strip_lua_comments "$TARGET/lualib_bundle_50.lua" - echo " updated $TARGET/lualib_bundle_50.lua" +if [ ! -d "extern/tstl/node_modules/lua-types" ]; then + echo "error: extern/tstl/node_modules/lua-types not found (run 'just tstl-setup')" >&2 + exit 1 fi -# --- Per-feature files (for inline mode) --- +echo "building tslua..." +go build -o tslua ./cmd/tslua/ + +echo "transpiling lualib bundles..." +./tslua lualib --luaTarget universal > internal/lualib/lualib_bundle.lua +./tslua lualib --luaTarget 5.0 > internal/lualib/lualib_bundle_50.lua -echo " generating per-feature files..." -# Create placeholder dirs so //go:embed doesn't fail during compilation -mkdir -p "$TARGET/features" "$TARGET/features_50" -[ "$(ls -A "$TARGET/features" 2>/dev/null)" ] || echo '-- placeholder' > "$TARGET/features/placeholder.lua" -[ "$(ls -A "$TARGET/features_50" 2>/dev/null)" ] || echo '-- placeholder' > "$TARGET/features_50/placeholder.lua" -# Create placeholder JSON files if missing -[ -f "$TARGET/lualib_module_info.json" ] || echo '{}' > "$TARGET/lualib_module_info.json" -[ -f "$TARGET/lualib_module_info_50.json" ] || echo '{}' > "$TARGET/lualib_module_info_50.json" +echo " internal/lualib/lualib_bundle.lua ($(wc -c < internal/lualib/lualib_bundle.lua) bytes)" +echo " internal/lualib/lualib_bundle_50.lua ($(wc -c < internal/lualib/lualib_bundle_50.lua) bytes)" + +echo "generating per-feature files..." go run ./scripts/gen-lualib-features go run ./scripts/gen-lualib-features --target 5.0 -# Apply patches as a synthetic feature -apply_patches_to_features "$TARGET/features" "$TARGET/lualib_module_info.json" -apply_patches_to_features "$TARGET/features_50" "$TARGET/lualib_module_info_50.json" -echo " updated per-feature files" - echo "done" From c6fbcc7de1ed242ce788cc31028aa1e5d0762392 Mon Sep 17 00:00:00 2001 From: Cold Fry Date: Fri, 17 Apr 2026 09:31:02 +0000 Subject: [PATCH 2/3] cleanup --- .github/workflows/ci.yml | 2 +- justfile | 6 ++++-- scripts/adversarial/check.ts | 6 ++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 49c83cf..72eaa54 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,7 +80,7 @@ jobs: -coverpkg=./internal/transpiler/,./internal/lua/,./internal/lualib/,./internal/lualibinfo/,./internal/sourcemap/ \ -coverprofile=coverage.out \ -covermode=atomic \ - ./internal/transpiler/ ./internal/lua/... ./internal/luatest/ ./internal/tstltest/ \ + ./internal/... \ -skip TestCodegen_ - name: Upload coverage to Codecov diff --git a/justfile b/justfile index 95ece03..306a45b 100644 --- a/justfile +++ b/justfile @@ -80,7 +80,7 @@ coverage: -coverpkg=./internal/transpiler/,./internal/lua/,./internal/lualib/,./internal/lualibinfo/,./internal/sourcemap/ \ -coverprofile=coverage.out \ -covermode=atomic \ - ./internal/transpiler/ ./internal/lua/... ./internal/luatest/ ./internal/tstltest/ \ + ./internal/... \ -skip TestCodegen_ go tool cover -func=coverage.out | grep '^total:' @@ -112,7 +112,9 @@ migrate SPEC: migrate-all: node --require tsx/cjs scripts/migrate/cli.ts -# Copy TSTL's built lualib bundles and apply tslua patches +# Regenerate internal/lualib/ by self-transpiling extern/tstl/src/lualib/ +# (TSTL's TypeScript sources) through tslua. Run this after changing the +# transpiler or bumping extern/tstl. update-lualib: ./scripts/update-lualib.sh diff --git a/scripts/adversarial/check.ts b/scripts/adversarial/check.ts index 0f5726d..70c3f47 100644 --- a/scripts/adversarial/check.ts +++ b/scripts/adversarial/check.ts @@ -254,8 +254,10 @@ try { const serializeLuaCode = fs.readFileSync(path.resolve("scripts/serialize.lua"), "utf-8"); const lualibSrc = path.resolve("internal/lualib/lualib_bundle.lua"); -// TSTL has its own lualib -const tstlLualibSrc = path.resolve("extern/tstl/dist/lualib_bundle.lua"); +// TSTL has its own lualib. Read from its dist output so TSTL-emitted Lua +// runs on TSTL's own runtime (adversarial check compares emitters on their +// respective native runtimes). +const tstlLualibSrc = path.resolve("extern/tstl/dist/lualib/universal/lualib_bundle.lua"); function evalLua(lua: string, useTstlLualib: boolean): string { const tmpDir = fs.mkdtempSync(path.join(require("os").tmpdir(), "tslua-adv-")); From 7da945fb098a6b93e64559461f66944def3e89e4 Mon Sep 17 00:00:00 2001 From: Cold Fry Date: Fri, 17 Apr 2026 09:37:20 +0000 Subject: [PATCH 3/3] temporary indent hack --- internal/lualib/build.go | 16 +- internal/lualib/build_test.go | 4 +- internal/lualib/features/Map.lua | 292 +++---- internal/lualib/features/Promise.lua | 242 +++--- internal/lualib/features/Set.lua | 380 ++++---- internal/lualib/features/WeakMap.lua | 78 +- internal/lualib/features/WeakSet.lua | 70 +- internal/lualib/features_50/Map.lua | 292 +++---- internal/lualib/features_50/Promise.lua | 242 +++--- internal/lualib/features_50/Set.lua | 380 ++++---- internal/lualib/features_50/WeakMap.lua | 78 +- internal/lualib/features_50/WeakSet.lua | 70 +- internal/lualib/lualib_bundle.lua | 1050 +++++++++++------------ internal/lualib/lualib_bundle_50.lua | 1050 +++++++++++------------ 14 files changed, 2128 insertions(+), 2116 deletions(-) diff --git a/internal/lualib/build.go b/internal/lualib/build.go index d2225d3..a0a6426 100644 --- a/internal/lualib/build.go +++ b/internal/lualib/build.go @@ -25,6 +25,10 @@ import ( // in patches.lua. These get added to the bundle's export table. var patchExportRe = regexp.MustCompile(`(?m)^local function (__TS__\w+)\(`) +// TODO: replace this string-based leak detection and wrap with an AST-level +// pass (see TSTL's lualibFileVisitor in extern/tstl/src/lualib-build/plugin.ts, +// which prepends a VariableDeclaration and wraps the body in a DoStatement). + // hasExportLeak reports whether body assigns to name at file scope without // using `local`, which would make name an implicit global once the body is // concatenated into the bundle's top-level chunk. Covers: @@ -72,8 +76,16 @@ func wrapFileBody(body string, exports []string) string { var sb strings.Builder fmt.Fprintf(&sb, "local %s\n", strings.Join(leaks, ", ")) sb.WriteString("do\n") - sb.WriteString(body) - sb.WriteString("\nend") + for _, line := range strings.Split(body, "\n") { + if line == "" { + sb.WriteByte('\n') + continue + } + sb.WriteString(" ") + sb.WriteString(line) + sb.WriteByte('\n') + } + sb.WriteString("end") return sb.String() } diff --git a/internal/lualib/build_test.go b/internal/lualib/build_test.go index 476ea5e..053fead 100644 --- a/internal/lualib/build_test.go +++ b/internal/lualib/build_test.go @@ -165,10 +165,10 @@ func TestWrapFileBody(t *testing.T) { t.Errorf("expected no wrap for non-leaking body; got:\n%s", got) } - // Leak: forward-decl + do/end wrap, exports sorted. + // Leak: forward-decl + do/end wrap, body indented, exports sorted. body2 := "Map = __TS__Class()\nSet = __TS__Class()" got2 := wrapFileBody(body2, []string{"Set", "Map"}) - want2 := "local Map, Set\ndo\nMap = __TS__Class()\nSet = __TS__Class()\nend" + want2 := "local Map, Set\ndo\n Map = __TS__Class()\n Set = __TS__Class()\nend" if got2 != want2 { t.Errorf("wrap mismatch:\ngot:\n%s\n\nwant:\n%s", got2, want2) } diff --git a/internal/lualib/features/Map.lua b/internal/lualib/features/Map.lua index ca19a11..6a1f8cc 100644 --- a/internal/lualib/features/Map.lua +++ b/internal/lualib/features/Map.lua @@ -1,164 +1,164 @@ local Map do -Map = __TS__Class() -Map.name = "Map" -function Map.prototype.____constructor(self, entries) - self[Symbol.toStringTag] = "Map" - self.items = {} - self.size = 0 - self.nextKey = {} - self.previousKey = {} - if entries == nil then - return - end - local iterable = entries - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break + Map = __TS__Class() + Map.name = "Map" + function Map.prototype.____constructor(self, entries) + self[Symbol.toStringTag] = "Map" + self.items = {} + self.size = 0 + self.nextKey = {} + self.previousKey = {} + if entries == nil then + return + end + local iterable = entries + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + local value = result.value -- Ensures index is offset when tuple is accessed + self:set(value[1], value[2]) + end + else + local array = entries + for ____, kvp in ipairs(array) do + self:set(kvp[1], kvp[2]) end - local value = result.value -- Ensures index is offset when tuple is accessed - self:set(value[1], value[2]) end - else - local array = entries - for ____, kvp in ipairs(array) do - self:set(kvp[1], kvp[2]) + end + function Map.prototype.clear(self) + self.items = {} + self.nextKey = {} + self.previousKey = {} + self.firstKey = nil + self.lastKey = nil + self.size = 0 + end + function Map.prototype.delete(self, key) + local contains = self:has(key) + if contains then + self.size = self.size - 1 + local next = self.nextKey[key] + local previous = self.previousKey[key] + if next ~= nil and previous ~= nil then + self.nextKey[previous] = next + self.previousKey[next] = previous + elseif next ~= nil then + self.firstKey = next + self.previousKey[next] = nil + elseif previous ~= nil then + self.lastKey = previous + self.nextKey[previous] = nil + else + self.firstKey = nil + self.lastKey = nil + end + self.nextKey[key] = nil + self.previousKey[key] = nil end + self.items[key] = nil + return contains end -end -function Map.prototype.clear(self) - self.items = {} - self.nextKey = {} - self.previousKey = {} - self.firstKey = nil - self.lastKey = nil - self.size = 0 -end -function Map.prototype.delete(self, key) - local contains = self:has(key) - if contains then - self.size = self.size - 1 - local next = self.nextKey[key] - local previous = self.previousKey[key] - if next ~= nil and previous ~= nil then - self.nextKey[previous] = next - self.previousKey[next] = previous - elseif next ~= nil then - self.firstKey = next - self.previousKey[next] = nil - elseif previous ~= nil then - self.lastKey = previous - self.nextKey[previous] = nil - else - self.firstKey = nil - self.lastKey = nil + function Map.prototype.forEach(self, callback) + for ____, key in __TS__Iterator(self:keys()) do + callback(nil, self.items[key], key, self) end - self.nextKey[key] = nil - self.previousKey[key] = nil end - self.items[key] = nil - return contains -end -function Map.prototype.forEach(self, callback) - for ____, key in __TS__Iterator(self:keys()) do - callback(nil, self.items[key], key, self) + function Map.prototype.get(self, key) + return self.items[key] end -end -function Map.prototype.get(self, key) - return self.items[key] -end -function Map.prototype.has(self, key) - return self.nextKey[key] ~= nil or self.lastKey == key -end -function Map.prototype.set(self, key, value) - local isNewValue = not self:has(key) - if isNewValue then - self.size = self.size + 1 + function Map.prototype.has(self, key) + return self.nextKey[key] ~= nil or self.lastKey == key end - self.items[key] = value - if self.firstKey == nil then - self.firstKey = key - self.lastKey = key - elseif isNewValue then - self.nextKey[self.lastKey] = key - self.previousKey[key] = self.lastKey - self.lastKey = key + function Map.prototype.set(self, key, value) + local isNewValue = not self:has(key) + if isNewValue then + self.size = self.size + 1 + end + self.items[key] = value + if self.firstKey == nil then + self.firstKey = key + self.lastKey = key + elseif isNewValue then + self.nextKey[self.lastKey] = key + self.previousKey[key] = self.lastKey + self.lastKey = key + end + return self end - return self -end -Map.prototype[Symbol.iterator] = function(self) - return self:entries() -end -function Map.prototype.entries(self) - local function getFirstKey() - return self.firstKey + Map.prototype[Symbol.iterator] = function(self) + return self:entries() end - local items = self.items - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = {key, items[key]}} + function Map.prototype.entries(self) + local function getFirstKey() + return self.firstKey end - } -end -function Map.prototype.keys(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + local items = self.items + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = {key, items[key]}} end - return {done = not key, value = key} - end - } -end -function Map.prototype.values(self) - local function getFirstKey() - return self.firstKey + } end - local items = self.items - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + function Map.prototype.keys(self) + local function getFirstKey() + return self.firstKey + end + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = key} end - return {done = not key, value = items[key]} + } + end + function Map.prototype.values(self) + local function getFirstKey() + return self.firstKey end - } -end -Map[Symbol.species] = Map + local items = self.items + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = items[key]} + end + } + end + Map[Symbol.species] = Map end \ No newline at end of file diff --git a/internal/lualib/features/Promise.lua b/internal/lualib/features/Promise.lua index 243a6d5..cc58aa9 100644 --- a/internal/lualib/features/Promise.lua +++ b/internal/lualib/features/Promise.lua @@ -1,141 +1,141 @@ local __TS__Promise do -local function makeDeferredPromiseFactory() - local resolve - local reject - local function executor(____, res, rej) - resolve = res - reject = rej + local function makeDeferredPromiseFactory() + local resolve + local reject + local function executor(____, res, rej) + resolve = res + reject = rej + end + return function() + local promise = __TS__New(__TS__Promise, executor) + return promise, resolve, reject + end end - return function() - local promise = __TS__New(__TS__Promise, executor) - return promise, resolve, reject + local makeDeferredPromise = makeDeferredPromiseFactory() + local function isPromiseLike(value) + return __TS__InstanceOf(value, __TS__Promise) end -end -local makeDeferredPromise = makeDeferredPromiseFactory() -local function isPromiseLike(value) - return __TS__InstanceOf(value, __TS__Promise) -end -local function doNothing(self) -end -local ____pcall = _G.pcall -__TS__Promise = __TS__Class() -__TS__Promise.name = "__TS__Promise" -function __TS__Promise.prototype.____constructor(self, executor) - self.state = 0 - self.fulfilledCallbacks = {} - self.rejectedCallbacks = {} - local success, ____error = ____pcall( - executor, - nil, - function(____, v) return self:resolve(v) end, - function(____, err) return self:reject(err) end - ) - if not success then - self:reject(____error) + local function doNothing(self) end -end -function __TS__Promise.resolve(value) - if __TS__InstanceOf(value, __TS__Promise) then - return value + local ____pcall = _G.pcall + __TS__Promise = __TS__Class() + __TS__Promise.name = "__TS__Promise" + function __TS__Promise.prototype.____constructor(self, executor) + self.state = 0 + self.fulfilledCallbacks = {} + self.rejectedCallbacks = {} + local success, ____error = ____pcall( + executor, + nil, + function(____, v) return self:resolve(v) end, + function(____, err) return self:reject(err) end + ) + if not success then + self:reject(____error) + end end - local promise = __TS__New(__TS__Promise, doNothing) - promise.state = 1 - promise.value = value - return promise -end -function __TS__Promise.reject(reason) - local promise = __TS__New(__TS__Promise, doNothing) - promise.state = 2 - promise.rejectionReason = reason - return promise -end -__TS__Promise.prototype["then"] = function(self, onFulfilled, onRejected) - local promise, resolve, reject = makeDeferredPromise() - self:addCallbacks( - onFulfilled and self:createPromiseResolvingCallback(onFulfilled, resolve, reject) or resolve, - onRejected and self:createPromiseResolvingCallback(onRejected, resolve, reject) or reject - ) - return promise -end -function __TS__Promise.prototype.addCallbacks(self, fulfilledCallback, rejectedCallback) - if self.state == 1 then - return fulfilledCallback(nil, self.value) + function __TS__Promise.resolve(value) + if __TS__InstanceOf(value, __TS__Promise) then + return value + end + local promise = __TS__New(__TS__Promise, doNothing) + promise.state = 1 + promise.value = value + return promise end - if self.state == 2 then - return rejectedCallback(nil, self.rejectionReason) + function __TS__Promise.reject(reason) + local promise = __TS__New(__TS__Promise, doNothing) + promise.state = 2 + promise.rejectionReason = reason + return promise end - local ____self_fulfilledCallbacks_0 = self.fulfilledCallbacks - ____self_fulfilledCallbacks_0[#____self_fulfilledCallbacks_0 + 1] = fulfilledCallback - local ____self_rejectedCallbacks_1 = self.rejectedCallbacks - ____self_rejectedCallbacks_1[#____self_rejectedCallbacks_1 + 1] = rejectedCallback -end -function __TS__Promise.prototype.catch(self, onRejected) - return self["then"](self, nil, onRejected) -end -function __TS__Promise.prototype.finally(self, onFinally) - return self["then"]( - self, - onFinally and (function(____, value) - onFinally(nil) - return value - end) or nil, - onFinally and (function(____, reason) - onFinally(nil) - error(reason, 0) - end) or nil - ) -end -function __TS__Promise.prototype.resolve(self, value) - if isPromiseLike(value) then - return value:addCallbacks( - function(____, v) return self:resolve(v) end, - function(____, err) return self:reject(err) end + __TS__Promise.prototype["then"] = function(self, onFulfilled, onRejected) + local promise, resolve, reject = makeDeferredPromise() + self:addCallbacks( + onFulfilled and self:createPromiseResolvingCallback(onFulfilled, resolve, reject) or resolve, + onRejected and self:createPromiseResolvingCallback(onRejected, resolve, reject) or reject ) + return promise + end + function __TS__Promise.prototype.addCallbacks(self, fulfilledCallback, rejectedCallback) + if self.state == 1 then + return fulfilledCallback(nil, self.value) + end + if self.state == 2 then + return rejectedCallback(nil, self.rejectionReason) + end + local ____self_fulfilledCallbacks_0 = self.fulfilledCallbacks + ____self_fulfilledCallbacks_0[#____self_fulfilledCallbacks_0 + 1] = fulfilledCallback + local ____self_rejectedCallbacks_1 = self.rejectedCallbacks + ____self_rejectedCallbacks_1[#____self_rejectedCallbacks_1 + 1] = rejectedCallback end - if self.state == 0 then - self.state = 1 - self.value = value - return self:invokeCallbacks(self.fulfilledCallbacks, value) + function __TS__Promise.prototype.catch(self, onRejected) + return self["then"](self, nil, onRejected) end -end -function __TS__Promise.prototype.reject(self, reason) - if self.state == 0 then - self.state = 2 - self.rejectionReason = reason - return self:invokeCallbacks(self.rejectedCallbacks, reason) + function __TS__Promise.prototype.finally(self, onFinally) + return self["then"]( + self, + onFinally and (function(____, value) + onFinally(nil) + return value + end) or nil, + onFinally and (function(____, reason) + onFinally(nil) + error(reason, 0) + end) or nil + ) end -end -function __TS__Promise.prototype.invokeCallbacks(self, callbacks, value) - local callbacksLength = #callbacks - if callbacksLength ~= 0 then - for i = 1, callbacksLength - 1 do - callbacks[i](callbacks, value) + function __TS__Promise.prototype.resolve(self, value) + if isPromiseLike(value) then + return value:addCallbacks( + function(____, v) return self:resolve(v) end, + function(____, err) return self:reject(err) end + ) + end + if self.state == 0 then + self.state = 1 + self.value = value + return self:invokeCallbacks(self.fulfilledCallbacks, value) end - return callbacks[callbacksLength](callbacks, value) end -end -function __TS__Promise.prototype.createPromiseResolvingCallback(self, f, resolve, reject) - return function(____, value) - local success, resultOrError = ____pcall(f, nil, value) - if not success then - return reject(nil, resultOrError) + function __TS__Promise.prototype.reject(self, reason) + if self.state == 0 then + self.state = 2 + self.rejectionReason = reason + return self:invokeCallbacks(self.rejectedCallbacks, reason) + end + end + function __TS__Promise.prototype.invokeCallbacks(self, callbacks, value) + local callbacksLength = #callbacks + if callbacksLength ~= 0 then + for i = 1, callbacksLength - 1 do + callbacks[i](callbacks, value) + end + return callbacks[callbacksLength](callbacks, value) + end + end + function __TS__Promise.prototype.createPromiseResolvingCallback(self, f, resolve, reject) + return function(____, value) + local success, resultOrError = ____pcall(f, nil, value) + if not success then + return reject(nil, resultOrError) + end + return self:handleCallbackValue(resultOrError, resolve, reject) end - return self:handleCallbackValue(resultOrError, resolve, reject) end -end -function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, reject) - if isPromiseLike(value) then - local nextpromise = value - if nextpromise.state == 1 then - return resolve(nil, nextpromise.value) - elseif nextpromise.state == 2 then - return reject(nil, nextpromise.rejectionReason) + function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, reject) + if isPromiseLike(value) then + local nextpromise = value + if nextpromise.state == 1 then + return resolve(nil, nextpromise.value) + elseif nextpromise.state == 2 then + return reject(nil, nextpromise.rejectionReason) + else + return nextpromise:addCallbacks(resolve, reject) + end else - return nextpromise:addCallbacks(resolve, reject) + return resolve(nil, value) end - else - return resolve(nil, value) end -end end \ No newline at end of file diff --git a/internal/lualib/features/Set.lua b/internal/lualib/features/Set.lua index 8f143f1..433d451 100644 --- a/internal/lualib/features/Set.lua +++ b/internal/lualib/features/Set.lua @@ -1,212 +1,212 @@ local Set do -Set = __TS__Class() -Set.name = "Set" -function Set.prototype.____constructor(self, values) - self[Symbol.toStringTag] = "Set" - self.size = 0 - self.nextKey = {} - self.previousKey = {} - if values == nil then - return - end - local iterable = values - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break + Set = __TS__Class() + Set.name = "Set" + function Set.prototype.____constructor(self, values) + self[Symbol.toStringTag] = "Set" + self.size = 0 + self.nextKey = {} + self.previousKey = {} + if values == nil then + return + end + local iterable = values + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + self:add(result.value) end - self:add(result.value) - end - else - local array = values - for ____, value in ipairs(array) do - self:add(value) - end - end -end -function Set.prototype.add(self, value) - local isNewValue = not self:has(value) - if isNewValue then - self.size = self.size + 1 - end - if self.firstKey == nil then - self.firstKey = value - self.lastKey = value - elseif isNewValue then - self.nextKey[self.lastKey] = value - self.previousKey[value] = self.lastKey - self.lastKey = value - end - return self -end -function Set.prototype.clear(self) - self.nextKey = {} - self.previousKey = {} - self.firstKey = nil - self.lastKey = nil - self.size = 0 -end -function Set.prototype.delete(self, value) - local contains = self:has(value) - if contains then - self.size = self.size - 1 - local next = self.nextKey[value] - local previous = self.previousKey[value] - if next ~= nil and previous ~= nil then - self.nextKey[previous] = next - self.previousKey[next] = previous - elseif next ~= nil then - self.firstKey = next - self.previousKey[next] = nil - elseif previous ~= nil then - self.lastKey = previous - self.nextKey[previous] = nil else - self.firstKey = nil - self.lastKey = nil - end - self.nextKey[value] = nil - self.previousKey[value] = nil - end - return contains -end -function Set.prototype.forEach(self, callback) - for ____, key in __TS__Iterator(self:keys()) do - callback(nil, key, key, self) - end -end -function Set.prototype.has(self, value) - return self.nextKey[value] ~= nil or self.lastKey == value -end -Set.prototype[Symbol.iterator] = function(self) - return self:values() -end -function Set.prototype.entries(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + local array = values + for ____, value in ipairs(array) do + self:add(value) end - return {done = not key, value = {key, key}} - end - } -end -function Set.prototype.keys(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) + end + end + function Set.prototype.add(self, value) + local isNewValue = not self:has(value) + if isNewValue then + self.size = self.size + 1 + end + if self.firstKey == nil then + self.firstKey = value + self.lastKey = value + elseif isNewValue then + self.nextKey[self.lastKey] = value + self.previousKey[value] = self.lastKey + self.lastKey = value + end + return self + end + function Set.prototype.clear(self) + self.nextKey = {} + self.previousKey = {} + self.firstKey = nil + self.lastKey = nil + self.size = 0 + end + function Set.prototype.delete(self, value) + local contains = self:has(value) + if contains then + self.size = self.size - 1 + local next = self.nextKey[value] + local previous = self.previousKey[value] + if next ~= nil and previous ~= nil then + self.nextKey[previous] = next + self.previousKey[next] = previous + elseif next ~= nil then + self.firstKey = next + self.previousKey[next] = nil + elseif previous ~= nil then + self.lastKey = previous + self.nextKey[previous] = nil else - key = nextKey[key] + self.firstKey = nil + self.lastKey = nil end - return {done = not key, value = key} - end - } -end -function Set.prototype.values(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + self.nextKey[value] = nil + self.previousKey[value] = nil + end + return contains + end + function Set.prototype.forEach(self, callback) + for ____, key in __TS__Iterator(self:keys()) do + callback(nil, key, key, self) + end + end + function Set.prototype.has(self, value) + return self.nextKey[value] ~= nil or self.lastKey == value + end + Set.prototype[Symbol.iterator] = function(self) + return self:values() + end + function Set.prototype.entries(self) + local function getFirstKey() + return self.firstKey + end + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = {key, key}} + end + } + end + function Set.prototype.keys(self) + local function getFirstKey() + return self.firstKey + end + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = key} + end + } + end + function Set.prototype.values(self) + local function getFirstKey() + return self.firstKey + end + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = key} end - return {done = not key, value = key} - end - } -end -function Set.prototype.union(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - result:add(item) - end - return result -end -function Set.prototype.intersection(self, other) - local result = __TS__New(Set) - for ____, item in __TS__Iterator(self) do - if other:has(item) then + } + end + function Set.prototype.union(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do result:add(item) end + return result end - return result -end -function Set.prototype.difference(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - result:delete(item) + function Set.prototype.intersection(self, other) + local result = __TS__New(Set) + for ____, item in __TS__Iterator(self) do + if other:has(item) then + result:add(item) + end + end + return result end - return result -end -function Set.prototype.symmetricDifference(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - if self:has(item) then + function Set.prototype.difference(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do result:delete(item) - else - result:add(item) end + return result + end + function Set.prototype.symmetricDifference(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do + if self:has(item) then + result:delete(item) + else + result:add(item) + end + end + return result end - return result -end -function Set.prototype.isSubsetOf(self, other) - for ____, item in __TS__Iterator(self) do - if not other:has(item) then - return false + function Set.prototype.isSubsetOf(self, other) + for ____, item in __TS__Iterator(self) do + if not other:has(item) then + return false + end end + return true end - return true -end -function Set.prototype.isSupersetOf(self, other) - for ____, item in __TS__Iterator(other) do - if not self:has(item) then - return false + function Set.prototype.isSupersetOf(self, other) + for ____, item in __TS__Iterator(other) do + if not self:has(item) then + return false + end end + return true end - return true -end -function Set.prototype.isDisjointFrom(self, other) - for ____, item in __TS__Iterator(self) do - if other:has(item) then - return false + function Set.prototype.isDisjointFrom(self, other) + for ____, item in __TS__Iterator(self) do + if other:has(item) then + return false + end end + return true end - return true -end -Set[Symbol.species] = Set + Set[Symbol.species] = Set end \ No newline at end of file diff --git a/internal/lualib/features/WeakMap.lua b/internal/lualib/features/WeakMap.lua index 467b6bf..7296b4d 100644 --- a/internal/lualib/features/WeakMap.lua +++ b/internal/lualib/features/WeakMap.lua @@ -1,45 +1,45 @@ local WeakMap do -WeakMap = __TS__Class() -WeakMap.name = "WeakMap" -function WeakMap.prototype.____constructor(self, entries) - self[Symbol.toStringTag] = "WeakMap" - self.items = {} - setmetatable(self.items, {__mode = "k"}) - if entries == nil then - return - end - local iterable = entries - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break - end - local value = result.value -- Ensures index is offset when tuple is accessed - self.items[value[1]] = value[2] + WeakMap = __TS__Class() + WeakMap.name = "WeakMap" + function WeakMap.prototype.____constructor(self, entries) + self[Symbol.toStringTag] = "WeakMap" + self.items = {} + setmetatable(self.items, {__mode = "k"}) + if entries == nil then + return end - else - for ____, kvp in ipairs(entries) do - self.items[kvp[1]] = kvp[2] + local iterable = entries + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + local value = result.value -- Ensures index is offset when tuple is accessed + self.items[value[1]] = value[2] + end + else + for ____, kvp in ipairs(entries) do + self.items[kvp[1]] = kvp[2] + end end end -end -function WeakMap.prototype.delete(self, key) - local contains = self:has(key) - self.items[key] = nil - return contains -end -function WeakMap.prototype.get(self, key) - return self.items[key] -end -function WeakMap.prototype.has(self, key) - return self.items[key] ~= nil -end -function WeakMap.prototype.set(self, key, value) - self.items[key] = value - return self -end -WeakMap[Symbol.species] = WeakMap + function WeakMap.prototype.delete(self, key) + local contains = self:has(key) + self.items[key] = nil + return contains + end + function WeakMap.prototype.get(self, key) + return self.items[key] + end + function WeakMap.prototype.has(self, key) + return self.items[key] ~= nil + end + function WeakMap.prototype.set(self, key, value) + self.items[key] = value + return self + end + WeakMap[Symbol.species] = WeakMap end \ No newline at end of file diff --git a/internal/lualib/features/WeakSet.lua b/internal/lualib/features/WeakSet.lua index d1dc4b0..9042cbb 100644 --- a/internal/lualib/features/WeakSet.lua +++ b/internal/lualib/features/WeakSet.lua @@ -1,41 +1,41 @@ local WeakSet do -WeakSet = __TS__Class() -WeakSet.name = "WeakSet" -function WeakSet.prototype.____constructor(self, values) - self[Symbol.toStringTag] = "WeakSet" - self.items = {} - setmetatable(self.items, {__mode = "k"}) - if values == nil then - return - end - local iterable = values - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break - end - self.items[result.value] = true + WeakSet = __TS__Class() + WeakSet.name = "WeakSet" + function WeakSet.prototype.____constructor(self, values) + self[Symbol.toStringTag] = "WeakSet" + self.items = {} + setmetatable(self.items, {__mode = "k"}) + if values == nil then + return end - else - for ____, value in ipairs(values) do - self.items[value] = true + local iterable = values + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + self.items[result.value] = true + end + else + for ____, value in ipairs(values) do + self.items[value] = true + end end end -end -function WeakSet.prototype.add(self, value) - self.items[value] = true - return self -end -function WeakSet.prototype.delete(self, value) - local contains = self:has(value) - self.items[value] = nil - return contains -end -function WeakSet.prototype.has(self, value) - return self.items[value] == true -end -WeakSet[Symbol.species] = WeakSet + function WeakSet.prototype.add(self, value) + self.items[value] = true + return self + end + function WeakSet.prototype.delete(self, value) + local contains = self:has(value) + self.items[value] = nil + return contains + end + function WeakSet.prototype.has(self, value) + return self.items[value] == true + end + WeakSet[Symbol.species] = WeakSet end \ No newline at end of file diff --git a/internal/lualib/features_50/Map.lua b/internal/lualib/features_50/Map.lua index ca19a11..6a1f8cc 100644 --- a/internal/lualib/features_50/Map.lua +++ b/internal/lualib/features_50/Map.lua @@ -1,164 +1,164 @@ local Map do -Map = __TS__Class() -Map.name = "Map" -function Map.prototype.____constructor(self, entries) - self[Symbol.toStringTag] = "Map" - self.items = {} - self.size = 0 - self.nextKey = {} - self.previousKey = {} - if entries == nil then - return - end - local iterable = entries - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break + Map = __TS__Class() + Map.name = "Map" + function Map.prototype.____constructor(self, entries) + self[Symbol.toStringTag] = "Map" + self.items = {} + self.size = 0 + self.nextKey = {} + self.previousKey = {} + if entries == nil then + return + end + local iterable = entries + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + local value = result.value -- Ensures index is offset when tuple is accessed + self:set(value[1], value[2]) + end + else + local array = entries + for ____, kvp in ipairs(array) do + self:set(kvp[1], kvp[2]) end - local value = result.value -- Ensures index is offset when tuple is accessed - self:set(value[1], value[2]) end - else - local array = entries - for ____, kvp in ipairs(array) do - self:set(kvp[1], kvp[2]) + end + function Map.prototype.clear(self) + self.items = {} + self.nextKey = {} + self.previousKey = {} + self.firstKey = nil + self.lastKey = nil + self.size = 0 + end + function Map.prototype.delete(self, key) + local contains = self:has(key) + if contains then + self.size = self.size - 1 + local next = self.nextKey[key] + local previous = self.previousKey[key] + if next ~= nil and previous ~= nil then + self.nextKey[previous] = next + self.previousKey[next] = previous + elseif next ~= nil then + self.firstKey = next + self.previousKey[next] = nil + elseif previous ~= nil then + self.lastKey = previous + self.nextKey[previous] = nil + else + self.firstKey = nil + self.lastKey = nil + end + self.nextKey[key] = nil + self.previousKey[key] = nil end + self.items[key] = nil + return contains end -end -function Map.prototype.clear(self) - self.items = {} - self.nextKey = {} - self.previousKey = {} - self.firstKey = nil - self.lastKey = nil - self.size = 0 -end -function Map.prototype.delete(self, key) - local contains = self:has(key) - if contains then - self.size = self.size - 1 - local next = self.nextKey[key] - local previous = self.previousKey[key] - if next ~= nil and previous ~= nil then - self.nextKey[previous] = next - self.previousKey[next] = previous - elseif next ~= nil then - self.firstKey = next - self.previousKey[next] = nil - elseif previous ~= nil then - self.lastKey = previous - self.nextKey[previous] = nil - else - self.firstKey = nil - self.lastKey = nil + function Map.prototype.forEach(self, callback) + for ____, key in __TS__Iterator(self:keys()) do + callback(nil, self.items[key], key, self) end - self.nextKey[key] = nil - self.previousKey[key] = nil end - self.items[key] = nil - return contains -end -function Map.prototype.forEach(self, callback) - for ____, key in __TS__Iterator(self:keys()) do - callback(nil, self.items[key], key, self) + function Map.prototype.get(self, key) + return self.items[key] end -end -function Map.prototype.get(self, key) - return self.items[key] -end -function Map.prototype.has(self, key) - return self.nextKey[key] ~= nil or self.lastKey == key -end -function Map.prototype.set(self, key, value) - local isNewValue = not self:has(key) - if isNewValue then - self.size = self.size + 1 + function Map.prototype.has(self, key) + return self.nextKey[key] ~= nil or self.lastKey == key end - self.items[key] = value - if self.firstKey == nil then - self.firstKey = key - self.lastKey = key - elseif isNewValue then - self.nextKey[self.lastKey] = key - self.previousKey[key] = self.lastKey - self.lastKey = key + function Map.prototype.set(self, key, value) + local isNewValue = not self:has(key) + if isNewValue then + self.size = self.size + 1 + end + self.items[key] = value + if self.firstKey == nil then + self.firstKey = key + self.lastKey = key + elseif isNewValue then + self.nextKey[self.lastKey] = key + self.previousKey[key] = self.lastKey + self.lastKey = key + end + return self end - return self -end -Map.prototype[Symbol.iterator] = function(self) - return self:entries() -end -function Map.prototype.entries(self) - local function getFirstKey() - return self.firstKey + Map.prototype[Symbol.iterator] = function(self) + return self:entries() end - local items = self.items - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = {key, items[key]}} + function Map.prototype.entries(self) + local function getFirstKey() + return self.firstKey end - } -end -function Map.prototype.keys(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + local items = self.items + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = {key, items[key]}} end - return {done = not key, value = key} - end - } -end -function Map.prototype.values(self) - local function getFirstKey() - return self.firstKey + } end - local items = self.items - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + function Map.prototype.keys(self) + local function getFirstKey() + return self.firstKey + end + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = key} end - return {done = not key, value = items[key]} + } + end + function Map.prototype.values(self) + local function getFirstKey() + return self.firstKey end - } -end -Map[Symbol.species] = Map + local items = self.items + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = items[key]} + end + } + end + Map[Symbol.species] = Map end \ No newline at end of file diff --git a/internal/lualib/features_50/Promise.lua b/internal/lualib/features_50/Promise.lua index 237e71d..ffed7fc 100644 --- a/internal/lualib/features_50/Promise.lua +++ b/internal/lualib/features_50/Promise.lua @@ -1,141 +1,141 @@ local __TS__Promise do -local function makeDeferredPromiseFactory() - local resolve - local reject - local function executor(____, res, rej) - resolve = res - reject = rej + local function makeDeferredPromiseFactory() + local resolve + local reject + local function executor(____, res, rej) + resolve = res + reject = rej + end + return function() + local promise = __TS__New(__TS__Promise, executor) + return promise, resolve, reject + end end - return function() - local promise = __TS__New(__TS__Promise, executor) - return promise, resolve, reject + local makeDeferredPromise = makeDeferredPromiseFactory() + local function isPromiseLike(value) + return __TS__InstanceOf(value, __TS__Promise) end -end -local makeDeferredPromise = makeDeferredPromiseFactory() -local function isPromiseLike(value) - return __TS__InstanceOf(value, __TS__Promise) -end -local function doNothing(self) -end -local ____pcall = _G.pcall -__TS__Promise = __TS__Class() -__TS__Promise.name = "__TS__Promise" -function __TS__Promise.prototype.____constructor(self, executor) - self.state = 0 - self.fulfilledCallbacks = {} - self.rejectedCallbacks = {} - local success, ____error = ____pcall( - executor, - nil, - function(____, v) return self:resolve(v) end, - function(____, err) return self:reject(err) end - ) - if not success then - self:reject(____error) + local function doNothing(self) end -end -function __TS__Promise.resolve(value) - if __TS__InstanceOf(value, __TS__Promise) then - return value + local ____pcall = _G.pcall + __TS__Promise = __TS__Class() + __TS__Promise.name = "__TS__Promise" + function __TS__Promise.prototype.____constructor(self, executor) + self.state = 0 + self.fulfilledCallbacks = {} + self.rejectedCallbacks = {} + local success, ____error = ____pcall( + executor, + nil, + function(____, v) return self:resolve(v) end, + function(____, err) return self:reject(err) end + ) + if not success then + self:reject(____error) + end end - local promise = __TS__New(__TS__Promise, doNothing) - promise.state = 1 - promise.value = value - return promise -end -function __TS__Promise.reject(reason) - local promise = __TS__New(__TS__Promise, doNothing) - promise.state = 2 - promise.rejectionReason = reason - return promise -end -__TS__Promise.prototype["then"] = function(self, onFulfilled, onRejected) - local promise, resolve, reject = makeDeferredPromise() - self:addCallbacks( - onFulfilled and self:createPromiseResolvingCallback(onFulfilled, resolve, reject) or resolve, - onRejected and self:createPromiseResolvingCallback(onRejected, resolve, reject) or reject - ) - return promise -end -function __TS__Promise.prototype.addCallbacks(self, fulfilledCallback, rejectedCallback) - if self.state == 1 then - return fulfilledCallback(nil, self.value) + function __TS__Promise.resolve(value) + if __TS__InstanceOf(value, __TS__Promise) then + return value + end + local promise = __TS__New(__TS__Promise, doNothing) + promise.state = 1 + promise.value = value + return promise end - if self.state == 2 then - return rejectedCallback(nil, self.rejectionReason) + function __TS__Promise.reject(reason) + local promise = __TS__New(__TS__Promise, doNothing) + promise.state = 2 + promise.rejectionReason = reason + return promise end - local ____self_fulfilledCallbacks_0 = self.fulfilledCallbacks - ____self_fulfilledCallbacks_0[table.getn(____self_fulfilledCallbacks_0) + 1] = fulfilledCallback - local ____self_rejectedCallbacks_1 = self.rejectedCallbacks - ____self_rejectedCallbacks_1[table.getn(____self_rejectedCallbacks_1) + 1] = rejectedCallback -end -function __TS__Promise.prototype.catch(self, onRejected) - return self["then"](self, nil, onRejected) -end -function __TS__Promise.prototype.finally(self, onFinally) - return self["then"]( - self, - onFinally and (function(____, value) - onFinally(nil) - return value - end) or nil, - onFinally and (function(____, reason) - onFinally(nil) - error(reason, 0) - end) or nil - ) -end -function __TS__Promise.prototype.resolve(self, value) - if isPromiseLike(value) then - return value:addCallbacks( - function(____, v) return self:resolve(v) end, - function(____, err) return self:reject(err) end + __TS__Promise.prototype["then"] = function(self, onFulfilled, onRejected) + local promise, resolve, reject = makeDeferredPromise() + self:addCallbacks( + onFulfilled and self:createPromiseResolvingCallback(onFulfilled, resolve, reject) or resolve, + onRejected and self:createPromiseResolvingCallback(onRejected, resolve, reject) or reject ) + return promise + end + function __TS__Promise.prototype.addCallbacks(self, fulfilledCallback, rejectedCallback) + if self.state == 1 then + return fulfilledCallback(nil, self.value) + end + if self.state == 2 then + return rejectedCallback(nil, self.rejectionReason) + end + local ____self_fulfilledCallbacks_0 = self.fulfilledCallbacks + ____self_fulfilledCallbacks_0[table.getn(____self_fulfilledCallbacks_0) + 1] = fulfilledCallback + local ____self_rejectedCallbacks_1 = self.rejectedCallbacks + ____self_rejectedCallbacks_1[table.getn(____self_rejectedCallbacks_1) + 1] = rejectedCallback end - if self.state == 0 then - self.state = 1 - self.value = value - return self:invokeCallbacks(self.fulfilledCallbacks, value) + function __TS__Promise.prototype.catch(self, onRejected) + return self["then"](self, nil, onRejected) end -end -function __TS__Promise.prototype.reject(self, reason) - if self.state == 0 then - self.state = 2 - self.rejectionReason = reason - return self:invokeCallbacks(self.rejectedCallbacks, reason) + function __TS__Promise.prototype.finally(self, onFinally) + return self["then"]( + self, + onFinally and (function(____, value) + onFinally(nil) + return value + end) or nil, + onFinally and (function(____, reason) + onFinally(nil) + error(reason, 0) + end) or nil + ) end -end -function __TS__Promise.prototype.invokeCallbacks(self, callbacks, value) - local callbacksLength = table.getn(callbacks) - if callbacksLength ~= 0 then - for i = 1, callbacksLength - 1 do - callbacks[i](callbacks, value) + function __TS__Promise.prototype.resolve(self, value) + if isPromiseLike(value) then + return value:addCallbacks( + function(____, v) return self:resolve(v) end, + function(____, err) return self:reject(err) end + ) + end + if self.state == 0 then + self.state = 1 + self.value = value + return self:invokeCallbacks(self.fulfilledCallbacks, value) end - return callbacks[callbacksLength](callbacks, value) end -end -function __TS__Promise.prototype.createPromiseResolvingCallback(self, f, resolve, reject) - return function(____, value) - local success, resultOrError = ____pcall(f, nil, value) - if not success then - return reject(nil, resultOrError) + function __TS__Promise.prototype.reject(self, reason) + if self.state == 0 then + self.state = 2 + self.rejectionReason = reason + return self:invokeCallbacks(self.rejectedCallbacks, reason) + end + end + function __TS__Promise.prototype.invokeCallbacks(self, callbacks, value) + local callbacksLength = table.getn(callbacks) + if callbacksLength ~= 0 then + for i = 1, callbacksLength - 1 do + callbacks[i](callbacks, value) + end + return callbacks[callbacksLength](callbacks, value) + end + end + function __TS__Promise.prototype.createPromiseResolvingCallback(self, f, resolve, reject) + return function(____, value) + local success, resultOrError = ____pcall(f, nil, value) + if not success then + return reject(nil, resultOrError) + end + return self:handleCallbackValue(resultOrError, resolve, reject) end - return self:handleCallbackValue(resultOrError, resolve, reject) end -end -function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, reject) - if isPromiseLike(value) then - local nextpromise = value - if nextpromise.state == 1 then - return resolve(nil, nextpromise.value) - elseif nextpromise.state == 2 then - return reject(nil, nextpromise.rejectionReason) + function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, reject) + if isPromiseLike(value) then + local nextpromise = value + if nextpromise.state == 1 then + return resolve(nil, nextpromise.value) + elseif nextpromise.state == 2 then + return reject(nil, nextpromise.rejectionReason) + else + return nextpromise:addCallbacks(resolve, reject) + end else - return nextpromise:addCallbacks(resolve, reject) + return resolve(nil, value) end - else - return resolve(nil, value) end -end end \ No newline at end of file diff --git a/internal/lualib/features_50/Set.lua b/internal/lualib/features_50/Set.lua index 8f143f1..433d451 100644 --- a/internal/lualib/features_50/Set.lua +++ b/internal/lualib/features_50/Set.lua @@ -1,212 +1,212 @@ local Set do -Set = __TS__Class() -Set.name = "Set" -function Set.prototype.____constructor(self, values) - self[Symbol.toStringTag] = "Set" - self.size = 0 - self.nextKey = {} - self.previousKey = {} - if values == nil then - return - end - local iterable = values - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break + Set = __TS__Class() + Set.name = "Set" + function Set.prototype.____constructor(self, values) + self[Symbol.toStringTag] = "Set" + self.size = 0 + self.nextKey = {} + self.previousKey = {} + if values == nil then + return + end + local iterable = values + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + self:add(result.value) end - self:add(result.value) - end - else - local array = values - for ____, value in ipairs(array) do - self:add(value) - end - end -end -function Set.prototype.add(self, value) - local isNewValue = not self:has(value) - if isNewValue then - self.size = self.size + 1 - end - if self.firstKey == nil then - self.firstKey = value - self.lastKey = value - elseif isNewValue then - self.nextKey[self.lastKey] = value - self.previousKey[value] = self.lastKey - self.lastKey = value - end - return self -end -function Set.prototype.clear(self) - self.nextKey = {} - self.previousKey = {} - self.firstKey = nil - self.lastKey = nil - self.size = 0 -end -function Set.prototype.delete(self, value) - local contains = self:has(value) - if contains then - self.size = self.size - 1 - local next = self.nextKey[value] - local previous = self.previousKey[value] - if next ~= nil and previous ~= nil then - self.nextKey[previous] = next - self.previousKey[next] = previous - elseif next ~= nil then - self.firstKey = next - self.previousKey[next] = nil - elseif previous ~= nil then - self.lastKey = previous - self.nextKey[previous] = nil else - self.firstKey = nil - self.lastKey = nil - end - self.nextKey[value] = nil - self.previousKey[value] = nil - end - return contains -end -function Set.prototype.forEach(self, callback) - for ____, key in __TS__Iterator(self:keys()) do - callback(nil, key, key, self) - end -end -function Set.prototype.has(self, value) - return self.nextKey[value] ~= nil or self.lastKey == value -end -Set.prototype[Symbol.iterator] = function(self) - return self:values() -end -function Set.prototype.entries(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + local array = values + for ____, value in ipairs(array) do + self:add(value) end - return {done = not key, value = {key, key}} - end - } -end -function Set.prototype.keys(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) + end + end + function Set.prototype.add(self, value) + local isNewValue = not self:has(value) + if isNewValue then + self.size = self.size + 1 + end + if self.firstKey == nil then + self.firstKey = value + self.lastKey = value + elseif isNewValue then + self.nextKey[self.lastKey] = value + self.previousKey[value] = self.lastKey + self.lastKey = value + end + return self + end + function Set.prototype.clear(self) + self.nextKey = {} + self.previousKey = {} + self.firstKey = nil + self.lastKey = nil + self.size = 0 + end + function Set.prototype.delete(self, value) + local contains = self:has(value) + if contains then + self.size = self.size - 1 + local next = self.nextKey[value] + local previous = self.previousKey[value] + if next ~= nil and previous ~= nil then + self.nextKey[previous] = next + self.previousKey[next] = previous + elseif next ~= nil then + self.firstKey = next + self.previousKey[next] = nil + elseif previous ~= nil then + self.lastKey = previous + self.nextKey[previous] = nil else - key = nextKey[key] + self.firstKey = nil + self.lastKey = nil end - return {done = not key, value = key} - end - } -end -function Set.prototype.values(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + self.nextKey[value] = nil + self.previousKey[value] = nil + end + return contains + end + function Set.prototype.forEach(self, callback) + for ____, key in __TS__Iterator(self:keys()) do + callback(nil, key, key, self) + end + end + function Set.prototype.has(self, value) + return self.nextKey[value] ~= nil or self.lastKey == value + end + Set.prototype[Symbol.iterator] = function(self) + return self:values() + end + function Set.prototype.entries(self) + local function getFirstKey() + return self.firstKey + end + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = {key, key}} + end + } + end + function Set.prototype.keys(self) + local function getFirstKey() + return self.firstKey + end + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = key} + end + } + end + function Set.prototype.values(self) + local function getFirstKey() + return self.firstKey + end + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = key} end - return {done = not key, value = key} - end - } -end -function Set.prototype.union(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - result:add(item) - end - return result -end -function Set.prototype.intersection(self, other) - local result = __TS__New(Set) - for ____, item in __TS__Iterator(self) do - if other:has(item) then + } + end + function Set.prototype.union(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do result:add(item) end + return result end - return result -end -function Set.prototype.difference(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - result:delete(item) + function Set.prototype.intersection(self, other) + local result = __TS__New(Set) + for ____, item in __TS__Iterator(self) do + if other:has(item) then + result:add(item) + end + end + return result end - return result -end -function Set.prototype.symmetricDifference(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - if self:has(item) then + function Set.prototype.difference(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do result:delete(item) - else - result:add(item) end + return result + end + function Set.prototype.symmetricDifference(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do + if self:has(item) then + result:delete(item) + else + result:add(item) + end + end + return result end - return result -end -function Set.prototype.isSubsetOf(self, other) - for ____, item in __TS__Iterator(self) do - if not other:has(item) then - return false + function Set.prototype.isSubsetOf(self, other) + for ____, item in __TS__Iterator(self) do + if not other:has(item) then + return false + end end + return true end - return true -end -function Set.prototype.isSupersetOf(self, other) - for ____, item in __TS__Iterator(other) do - if not self:has(item) then - return false + function Set.prototype.isSupersetOf(self, other) + for ____, item in __TS__Iterator(other) do + if not self:has(item) then + return false + end end + return true end - return true -end -function Set.prototype.isDisjointFrom(self, other) - for ____, item in __TS__Iterator(self) do - if other:has(item) then - return false + function Set.prototype.isDisjointFrom(self, other) + for ____, item in __TS__Iterator(self) do + if other:has(item) then + return false + end end + return true end - return true -end -Set[Symbol.species] = Set + Set[Symbol.species] = Set end \ No newline at end of file diff --git a/internal/lualib/features_50/WeakMap.lua b/internal/lualib/features_50/WeakMap.lua index 467b6bf..7296b4d 100644 --- a/internal/lualib/features_50/WeakMap.lua +++ b/internal/lualib/features_50/WeakMap.lua @@ -1,45 +1,45 @@ local WeakMap do -WeakMap = __TS__Class() -WeakMap.name = "WeakMap" -function WeakMap.prototype.____constructor(self, entries) - self[Symbol.toStringTag] = "WeakMap" - self.items = {} - setmetatable(self.items, {__mode = "k"}) - if entries == nil then - return - end - local iterable = entries - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break - end - local value = result.value -- Ensures index is offset when tuple is accessed - self.items[value[1]] = value[2] + WeakMap = __TS__Class() + WeakMap.name = "WeakMap" + function WeakMap.prototype.____constructor(self, entries) + self[Symbol.toStringTag] = "WeakMap" + self.items = {} + setmetatable(self.items, {__mode = "k"}) + if entries == nil then + return end - else - for ____, kvp in ipairs(entries) do - self.items[kvp[1]] = kvp[2] + local iterable = entries + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + local value = result.value -- Ensures index is offset when tuple is accessed + self.items[value[1]] = value[2] + end + else + for ____, kvp in ipairs(entries) do + self.items[kvp[1]] = kvp[2] + end end end -end -function WeakMap.prototype.delete(self, key) - local contains = self:has(key) - self.items[key] = nil - return contains -end -function WeakMap.prototype.get(self, key) - return self.items[key] -end -function WeakMap.prototype.has(self, key) - return self.items[key] ~= nil -end -function WeakMap.prototype.set(self, key, value) - self.items[key] = value - return self -end -WeakMap[Symbol.species] = WeakMap + function WeakMap.prototype.delete(self, key) + local contains = self:has(key) + self.items[key] = nil + return contains + end + function WeakMap.prototype.get(self, key) + return self.items[key] + end + function WeakMap.prototype.has(self, key) + return self.items[key] ~= nil + end + function WeakMap.prototype.set(self, key, value) + self.items[key] = value + return self + end + WeakMap[Symbol.species] = WeakMap end \ No newline at end of file diff --git a/internal/lualib/features_50/WeakSet.lua b/internal/lualib/features_50/WeakSet.lua index d1dc4b0..9042cbb 100644 --- a/internal/lualib/features_50/WeakSet.lua +++ b/internal/lualib/features_50/WeakSet.lua @@ -1,41 +1,41 @@ local WeakSet do -WeakSet = __TS__Class() -WeakSet.name = "WeakSet" -function WeakSet.prototype.____constructor(self, values) - self[Symbol.toStringTag] = "WeakSet" - self.items = {} - setmetatable(self.items, {__mode = "k"}) - if values == nil then - return - end - local iterable = values - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break - end - self.items[result.value] = true + WeakSet = __TS__Class() + WeakSet.name = "WeakSet" + function WeakSet.prototype.____constructor(self, values) + self[Symbol.toStringTag] = "WeakSet" + self.items = {} + setmetatable(self.items, {__mode = "k"}) + if values == nil then + return end - else - for ____, value in ipairs(values) do - self.items[value] = true + local iterable = values + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + self.items[result.value] = true + end + else + for ____, value in ipairs(values) do + self.items[value] = true + end end end -end -function WeakSet.prototype.add(self, value) - self.items[value] = true - return self -end -function WeakSet.prototype.delete(self, value) - local contains = self:has(value) - self.items[value] = nil - return contains -end -function WeakSet.prototype.has(self, value) - return self.items[value] == true -end -WeakSet[Symbol.species] = WeakSet + function WeakSet.prototype.add(self, value) + self.items[value] = true + return self + end + function WeakSet.prototype.delete(self, value) + local contains = self:has(value) + self.items[value] = nil + return contains + end + function WeakSet.prototype.has(self, value) + return self.items[value] == true + end + WeakSet[Symbol.species] = WeakSet end \ No newline at end of file diff --git a/internal/lualib/lualib_bundle.lua b/internal/lualib/lualib_bundle.lua index f673d85..9b1b541 100644 --- a/internal/lualib/lualib_bundle.lua +++ b/internal/lualib/lualib_bundle.lua @@ -580,145 +580,145 @@ local function __TS__Class(self) end local __TS__Promise do -local function makeDeferredPromiseFactory() - local resolve - local reject - local function executor(____, res, rej) - resolve = res - reject = rej - end - return function() - local promise = __TS__New(__TS__Promise, executor) - return promise, resolve, reject - end -end -local makeDeferredPromise = makeDeferredPromiseFactory() -local function isPromiseLike(value) - return __TS__InstanceOf(value, __TS__Promise) -end -local function doNothing(self) -end -local ____pcall = _G.pcall -__TS__Promise = __TS__Class() -__TS__Promise.name = "__TS__Promise" -function __TS__Promise.prototype.____constructor(self, executor) - self.state = 0 - self.fulfilledCallbacks = {} - self.rejectedCallbacks = {} - local success, ____error = ____pcall( - executor, - nil, - function(____, v) return self:resolve(v) end, - function(____, err) return self:reject(err) end - ) - if not success then - self:reject(____error) + local function makeDeferredPromiseFactory() + local resolve + local reject + local function executor(____, res, rej) + resolve = res + reject = rej + end + return function() + local promise = __TS__New(__TS__Promise, executor) + return promise, resolve, reject + end + end + local makeDeferredPromise = makeDeferredPromiseFactory() + local function isPromiseLike(value) + return __TS__InstanceOf(value, __TS__Promise) + end + local function doNothing(self) + end + local ____pcall = _G.pcall + __TS__Promise = __TS__Class() + __TS__Promise.name = "__TS__Promise" + function __TS__Promise.prototype.____constructor(self, executor) + self.state = 0 + self.fulfilledCallbacks = {} + self.rejectedCallbacks = {} + local success, ____error = ____pcall( + executor, + nil, + function(____, v) return self:resolve(v) end, + function(____, err) return self:reject(err) end + ) + if not success then + self:reject(____error) + end end -end -function __TS__Promise.resolve(value) - if __TS__InstanceOf(value, __TS__Promise) then - return value + function __TS__Promise.resolve(value) + if __TS__InstanceOf(value, __TS__Promise) then + return value + end + local promise = __TS__New(__TS__Promise, doNothing) + promise.state = 1 + promise.value = value + return promise + end + function __TS__Promise.reject(reason) + local promise = __TS__New(__TS__Promise, doNothing) + promise.state = 2 + promise.rejectionReason = reason + return promise + end + __TS__Promise.prototype["then"] = function(self, onFulfilled, onRejected) + local promise, resolve, reject = makeDeferredPromise() + self:addCallbacks( + onFulfilled and self:createPromiseResolvingCallback(onFulfilled, resolve, reject) or resolve, + onRejected and self:createPromiseResolvingCallback(onRejected, resolve, reject) or reject + ) + return promise end - local promise = __TS__New(__TS__Promise, doNothing) - promise.state = 1 - promise.value = value - return promise -end -function __TS__Promise.reject(reason) - local promise = __TS__New(__TS__Promise, doNothing) - promise.state = 2 - promise.rejectionReason = reason - return promise -end -__TS__Promise.prototype["then"] = function(self, onFulfilled, onRejected) - local promise, resolve, reject = makeDeferredPromise() - self:addCallbacks( - onFulfilled and self:createPromiseResolvingCallback(onFulfilled, resolve, reject) or resolve, - onRejected and self:createPromiseResolvingCallback(onRejected, resolve, reject) or reject - ) - return promise -end -function __TS__Promise.prototype.addCallbacks(self, fulfilledCallback, rejectedCallback) - if self.state == 1 then - return fulfilledCallback(nil, self.value) + function __TS__Promise.prototype.addCallbacks(self, fulfilledCallback, rejectedCallback) + if self.state == 1 then + return fulfilledCallback(nil, self.value) + end + if self.state == 2 then + return rejectedCallback(nil, self.rejectionReason) + end + local ____self_fulfilledCallbacks_0 = self.fulfilledCallbacks + ____self_fulfilledCallbacks_0[#____self_fulfilledCallbacks_0 + 1] = fulfilledCallback + local ____self_rejectedCallbacks_1 = self.rejectedCallbacks + ____self_rejectedCallbacks_1[#____self_rejectedCallbacks_1 + 1] = rejectedCallback end - if self.state == 2 then - return rejectedCallback(nil, self.rejectionReason) + function __TS__Promise.prototype.catch(self, onRejected) + return self["then"](self, nil, onRejected) end - local ____self_fulfilledCallbacks_0 = self.fulfilledCallbacks - ____self_fulfilledCallbacks_0[#____self_fulfilledCallbacks_0 + 1] = fulfilledCallback - local ____self_rejectedCallbacks_1 = self.rejectedCallbacks - ____self_rejectedCallbacks_1[#____self_rejectedCallbacks_1 + 1] = rejectedCallback -end -function __TS__Promise.prototype.catch(self, onRejected) - return self["then"](self, nil, onRejected) -end -function __TS__Promise.prototype.finally(self, onFinally) - return self["then"]( - self, - onFinally and (function(____, value) - onFinally(nil) - return value - end) or nil, - onFinally and (function(____, reason) - onFinally(nil) - error(reason, 0) - end) or nil - ) -end -function __TS__Promise.prototype.resolve(self, value) - if isPromiseLike(value) then - return value:addCallbacks( - function(____, v) return self:resolve(v) end, - function(____, err) return self:reject(err) end + function __TS__Promise.prototype.finally(self, onFinally) + return self["then"]( + self, + onFinally and (function(____, value) + onFinally(nil) + return value + end) or nil, + onFinally and (function(____, reason) + onFinally(nil) + error(reason, 0) + end) or nil ) end - if self.state == 0 then - self.state = 1 - self.value = value - return self:invokeCallbacks(self.fulfilledCallbacks, value) + function __TS__Promise.prototype.resolve(self, value) + if isPromiseLike(value) then + return value:addCallbacks( + function(____, v) return self:resolve(v) end, + function(____, err) return self:reject(err) end + ) + end + if self.state == 0 then + self.state = 1 + self.value = value + return self:invokeCallbacks(self.fulfilledCallbacks, value) + end end -end -function __TS__Promise.prototype.reject(self, reason) - if self.state == 0 then - self.state = 2 - self.rejectionReason = reason - return self:invokeCallbacks(self.rejectedCallbacks, reason) + function __TS__Promise.prototype.reject(self, reason) + if self.state == 0 then + self.state = 2 + self.rejectionReason = reason + return self:invokeCallbacks(self.rejectedCallbacks, reason) + end end -end -function __TS__Promise.prototype.invokeCallbacks(self, callbacks, value) - local callbacksLength = #callbacks - if callbacksLength ~= 0 then - for i = 1, callbacksLength - 1 do - callbacks[i](callbacks, value) + function __TS__Promise.prototype.invokeCallbacks(self, callbacks, value) + local callbacksLength = #callbacks + if callbacksLength ~= 0 then + for i = 1, callbacksLength - 1 do + callbacks[i](callbacks, value) + end + return callbacks[callbacksLength](callbacks, value) end - return callbacks[callbacksLength](callbacks, value) end -end -function __TS__Promise.prototype.createPromiseResolvingCallback(self, f, resolve, reject) - return function(____, value) - local success, resultOrError = ____pcall(f, nil, value) - if not success then - return reject(nil, resultOrError) + function __TS__Promise.prototype.createPromiseResolvingCallback(self, f, resolve, reject) + return function(____, value) + local success, resultOrError = ____pcall(f, nil, value) + if not success then + return reject(nil, resultOrError) + end + return self:handleCallbackValue(resultOrError, resolve, reject) end - return self:handleCallbackValue(resultOrError, resolve, reject) end -end -function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, reject) - if isPromiseLike(value) then - local nextpromise = value - if nextpromise.state == 1 then - return resolve(nil, nextpromise.value) - elseif nextpromise.state == 2 then - return reject(nil, nextpromise.rejectionReason) + function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, reject) + if isPromiseLike(value) then + local nextpromise = value + if nextpromise.state == 1 then + return resolve(nil, nextpromise.value) + elseif nextpromise.state == 2 then + return reject(nil, nextpromise.rejectionReason) + else + return nextpromise:addCallbacks(resolve, reject) + end else - return nextpromise:addCallbacks(resolve, reject) + return resolve(nil, value) end - else - return resolve(nil, value) end end -end local ____coroutine = _G.coroutine or ({}) local cocreate = ____coroutine.create local coresume = ____coroutine.resume @@ -1200,167 +1200,167 @@ local function __TS__LuaIteratorSpread(self, state, firstKey) end local Map do -Map = __TS__Class() -Map.name = "Map" -function Map.prototype.____constructor(self, entries) - self[Symbol.toStringTag] = "Map" - self.items = {} - self.size = 0 - self.nextKey = {} - self.previousKey = {} - if entries == nil then - return - end - local iterable = entries - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break + Map = __TS__Class() + Map.name = "Map" + function Map.prototype.____constructor(self, entries) + self[Symbol.toStringTag] = "Map" + self.items = {} + self.size = 0 + self.nextKey = {} + self.previousKey = {} + if entries == nil then + return + end + local iterable = entries + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + local value = result.value -- Ensures index is offset when tuple is accessed + self:set(value[1], value[2]) end - local value = result.value -- Ensures index is offset when tuple is accessed - self:set(value[1], value[2]) - end - else - local array = entries - for ____, kvp in ipairs(array) do - self:set(kvp[1], kvp[2]) - end - end -end -function Map.prototype.clear(self) - self.items = {} - self.nextKey = {} - self.previousKey = {} - self.firstKey = nil - self.lastKey = nil - self.size = 0 -end -function Map.prototype.delete(self, key) - local contains = self:has(key) - if contains then - self.size = self.size - 1 - local next = self.nextKey[key] - local previous = self.previousKey[key] - if next ~= nil and previous ~= nil then - self.nextKey[previous] = next - self.previousKey[next] = previous - elseif next ~= nil then - self.firstKey = next - self.previousKey[next] = nil - elseif previous ~= nil then - self.lastKey = previous - self.nextKey[previous] = nil else - self.firstKey = nil - self.lastKey = nil + local array = entries + for ____, kvp in ipairs(array) do + self:set(kvp[1], kvp[2]) + end end - self.nextKey[key] = nil - self.previousKey[key] = nil end - self.items[key] = nil - return contains -end -function Map.prototype.forEach(self, callback) - for ____, key in __TS__Iterator(self:keys()) do - callback(nil, self.items[key], key, self) + function Map.prototype.clear(self) + self.items = {} + self.nextKey = {} + self.previousKey = {} + self.firstKey = nil + self.lastKey = nil + self.size = 0 + end + function Map.prototype.delete(self, key) + local contains = self:has(key) + if contains then + self.size = self.size - 1 + local next = self.nextKey[key] + local previous = self.previousKey[key] + if next ~= nil and previous ~= nil then + self.nextKey[previous] = next + self.previousKey[next] = previous + elseif next ~= nil then + self.firstKey = next + self.previousKey[next] = nil + elseif previous ~= nil then + self.lastKey = previous + self.nextKey[previous] = nil + else + self.firstKey = nil + self.lastKey = nil + end + self.nextKey[key] = nil + self.previousKey[key] = nil + end + self.items[key] = nil + return contains end -end -function Map.prototype.get(self, key) - return self.items[key] -end -function Map.prototype.has(self, key) - return self.nextKey[key] ~= nil or self.lastKey == key -end -function Map.prototype.set(self, key, value) - local isNewValue = not self:has(key) - if isNewValue then - self.size = self.size + 1 + function Map.prototype.forEach(self, callback) + for ____, key in __TS__Iterator(self:keys()) do + callback(nil, self.items[key], key, self) + end end - self.items[key] = value - if self.firstKey == nil then - self.firstKey = key - self.lastKey = key - elseif isNewValue then - self.nextKey[self.lastKey] = key - self.previousKey[key] = self.lastKey - self.lastKey = key + function Map.prototype.get(self, key) + return self.items[key] end - return self -end -Map.prototype[Symbol.iterator] = function(self) - return self:entries() -end -function Map.prototype.entries(self) - local function getFirstKey() - return self.firstKey + function Map.prototype.has(self, key) + return self.nextKey[key] ~= nil or self.lastKey == key end - local items = self.items - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = {key, items[key]}} + function Map.prototype.set(self, key, value) + local isNewValue = not self:has(key) + if isNewValue then + self.size = self.size + 1 end - } -end -function Map.prototype.keys(self) - local function getFirstKey() - return self.firstKey + self.items[key] = value + if self.firstKey == nil then + self.firstKey = key + self.lastKey = key + elseif isNewValue then + self.nextKey[self.lastKey] = key + self.previousKey[key] = self.lastKey + self.lastKey = key + end + return self end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = key} + Map.prototype[Symbol.iterator] = function(self) + return self:entries() + end + function Map.prototype.entries(self) + local function getFirstKey() + return self.firstKey end - } -end -function Map.prototype.values(self) - local function getFirstKey() - return self.firstKey + local items = self.items + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = {key, items[key]}} + end + } end - local items = self.items - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + function Map.prototype.keys(self) + local function getFirstKey() + return self.firstKey + end + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = key} end - return {done = not key, value = items[key]} + } + end + function Map.prototype.values(self) + local function getFirstKey() + return self.firstKey end - } -end -Map[Symbol.species] = Map + local items = self.items + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = items[key]} + end + } + end + Map[Symbol.species] = Map end local function __TS__MapGroupBy(items, keySelector) local result = __TS__New(Map) @@ -1815,215 +1815,215 @@ local function __TS__PromiseRace(iterable) end local Set do -Set = __TS__Class() -Set.name = "Set" -function Set.prototype.____constructor(self, values) - self[Symbol.toStringTag] = "Set" - self.size = 0 - self.nextKey = {} - self.previousKey = {} - if values == nil then - return - end - local iterable = values - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break + Set = __TS__Class() + Set.name = "Set" + function Set.prototype.____constructor(self, values) + self[Symbol.toStringTag] = "Set" + self.size = 0 + self.nextKey = {} + self.previousKey = {} + if values == nil then + return + end + local iterable = values + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + self:add(result.value) + end + else + local array = values + for ____, value in ipairs(array) do + self:add(value) end - self:add(result.value) - end - else - local array = values - for ____, value in ipairs(array) do - self:add(value) end end -end -function Set.prototype.add(self, value) - local isNewValue = not self:has(value) - if isNewValue then - self.size = self.size + 1 + function Set.prototype.add(self, value) + local isNewValue = not self:has(value) + if isNewValue then + self.size = self.size + 1 + end + if self.firstKey == nil then + self.firstKey = value + self.lastKey = value + elseif isNewValue then + self.nextKey[self.lastKey] = value + self.previousKey[value] = self.lastKey + self.lastKey = value + end + return self end - if self.firstKey == nil then - self.firstKey = value - self.lastKey = value - elseif isNewValue then - self.nextKey[self.lastKey] = value - self.previousKey[value] = self.lastKey - self.lastKey = value + function Set.prototype.clear(self) + self.nextKey = {} + self.previousKey = {} + self.firstKey = nil + self.lastKey = nil + self.size = 0 + end + function Set.prototype.delete(self, value) + local contains = self:has(value) + if contains then + self.size = self.size - 1 + local next = self.nextKey[value] + local previous = self.previousKey[value] + if next ~= nil and previous ~= nil then + self.nextKey[previous] = next + self.previousKey[next] = previous + elseif next ~= nil then + self.firstKey = next + self.previousKey[next] = nil + elseif previous ~= nil then + self.lastKey = previous + self.nextKey[previous] = nil + else + self.firstKey = nil + self.lastKey = nil + end + self.nextKey[value] = nil + self.previousKey[value] = nil + end + return contains end - return self -end -function Set.prototype.clear(self) - self.nextKey = {} - self.previousKey = {} - self.firstKey = nil - self.lastKey = nil - self.size = 0 -end -function Set.prototype.delete(self, value) - local contains = self:has(value) - if contains then - self.size = self.size - 1 - local next = self.nextKey[value] - local previous = self.previousKey[value] - if next ~= nil and previous ~= nil then - self.nextKey[previous] = next - self.previousKey[next] = previous - elseif next ~= nil then - self.firstKey = next - self.previousKey[next] = nil - elseif previous ~= nil then - self.lastKey = previous - self.nextKey[previous] = nil - else - self.firstKey = nil - self.lastKey = nil + function Set.prototype.forEach(self, callback) + for ____, key in __TS__Iterator(self:keys()) do + callback(nil, key, key, self) end - self.nextKey[value] = nil - self.previousKey[value] = nil end - return contains -end -function Set.prototype.forEach(self, callback) - for ____, key in __TS__Iterator(self:keys()) do - callback(nil, key, key, self) + function Set.prototype.has(self, value) + return self.nextKey[value] ~= nil or self.lastKey == value end -end -function Set.prototype.has(self, value) - return self.nextKey[value] ~= nil or self.lastKey == value -end -Set.prototype[Symbol.iterator] = function(self) - return self:values() -end -function Set.prototype.entries(self) - local function getFirstKey() - return self.firstKey + Set.prototype[Symbol.iterator] = function(self) + return self:values() end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = {key, key}} + function Set.prototype.entries(self) + local function getFirstKey() + return self.firstKey end - } -end -function Set.prototype.keys(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = {key, key}} end - return {done = not key, value = key} - end - } -end -function Set.prototype.values(self) - local function getFirstKey() - return self.firstKey + } end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + function Set.prototype.keys(self) + local function getFirstKey() + return self.firstKey + end + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = key} end - return {done = not key, value = key} + } + end + function Set.prototype.values(self) + local function getFirstKey() + return self.firstKey end - } -end -function Set.prototype.union(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - result:add(item) + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = key} + end + } end - return result -end -function Set.prototype.intersection(self, other) - local result = __TS__New(Set) - for ____, item in __TS__Iterator(self) do - if other:has(item) then + function Set.prototype.union(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do result:add(item) end + return result end - return result -end -function Set.prototype.difference(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - result:delete(item) + function Set.prototype.intersection(self, other) + local result = __TS__New(Set) + for ____, item in __TS__Iterator(self) do + if other:has(item) then + result:add(item) + end + end + return result end - return result -end -function Set.prototype.symmetricDifference(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - if self:has(item) then + function Set.prototype.difference(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do result:delete(item) - else - result:add(item) end + return result end - return result -end -function Set.prototype.isSubsetOf(self, other) - for ____, item in __TS__Iterator(self) do - if not other:has(item) then - return false + function Set.prototype.symmetricDifference(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do + if self:has(item) then + result:delete(item) + else + result:add(item) + end end + return result end - return true -end -function Set.prototype.isSupersetOf(self, other) - for ____, item in __TS__Iterator(other) do - if not self:has(item) then - return false + function Set.prototype.isSubsetOf(self, other) + for ____, item in __TS__Iterator(self) do + if not other:has(item) then + return false + end end + return true end - return true -end -function Set.prototype.isDisjointFrom(self, other) - for ____, item in __TS__Iterator(self) do - if other:has(item) then - return false + function Set.prototype.isSupersetOf(self, other) + for ____, item in __TS__Iterator(other) do + if not self:has(item) then + return false + end end + return true end - return true -end -Set[Symbol.species] = Set + function Set.prototype.isDisjointFrom(self, other) + for ____, item in __TS__Iterator(self) do + if other:has(item) then + return false + end + end + return true + end + Set[Symbol.species] = Set end local function __TS__SourceMapTraceBack(fileName, sourceMap) _G.__TS__sourcemap = _G.__TS__sourcemap or ({}) @@ -2413,89 +2413,89 @@ local function __TS__UsingAsync(self, cb, ...) end local WeakMap do -WeakMap = __TS__Class() -WeakMap.name = "WeakMap" -function WeakMap.prototype.____constructor(self, entries) - self[Symbol.toStringTag] = "WeakMap" - self.items = {} - setmetatable(self.items, {__mode = "k"}) - if entries == nil then - return - end - local iterable = entries - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break + WeakMap = __TS__Class() + WeakMap.name = "WeakMap" + function WeakMap.prototype.____constructor(self, entries) + self[Symbol.toStringTag] = "WeakMap" + self.items = {} + setmetatable(self.items, {__mode = "k"}) + if entries == nil then + return + end + local iterable = entries + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + local value = result.value -- Ensures index is offset when tuple is accessed + self.items[value[1]] = value[2] + end + else + for ____, kvp in ipairs(entries) do + self.items[kvp[1]] = kvp[2] end - local value = result.value -- Ensures index is offset when tuple is accessed - self.items[value[1]] = value[2] - end - else - for ____, kvp in ipairs(entries) do - self.items[kvp[1]] = kvp[2] end end -end -function WeakMap.prototype.delete(self, key) - local contains = self:has(key) - self.items[key] = nil - return contains -end -function WeakMap.prototype.get(self, key) - return self.items[key] -end -function WeakMap.prototype.has(self, key) - return self.items[key] ~= nil -end -function WeakMap.prototype.set(self, key, value) - self.items[key] = value - return self -end -WeakMap[Symbol.species] = WeakMap + function WeakMap.prototype.delete(self, key) + local contains = self:has(key) + self.items[key] = nil + return contains + end + function WeakMap.prototype.get(self, key) + return self.items[key] + end + function WeakMap.prototype.has(self, key) + return self.items[key] ~= nil + end + function WeakMap.prototype.set(self, key, value) + self.items[key] = value + return self + end + WeakMap[Symbol.species] = WeakMap end local WeakSet do -WeakSet = __TS__Class() -WeakSet.name = "WeakSet" -function WeakSet.prototype.____constructor(self, values) - self[Symbol.toStringTag] = "WeakSet" - self.items = {} - setmetatable(self.items, {__mode = "k"}) - if values == nil then - return - end - local iterable = values - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break + WeakSet = __TS__Class() + WeakSet.name = "WeakSet" + function WeakSet.prototype.____constructor(self, values) + self[Symbol.toStringTag] = "WeakSet" + self.items = {} + setmetatable(self.items, {__mode = "k"}) + if values == nil then + return + end + local iterable = values + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + self.items[result.value] = true + end + else + for ____, value in ipairs(values) do + self.items[value] = true end - self.items[result.value] = true - end - else - for ____, value in ipairs(values) do - self.items[value] = true end end -end -function WeakSet.prototype.add(self, value) - self.items[value] = true - return self -end -function WeakSet.prototype.delete(self, value) - local contains = self:has(value) - self.items[value] = nil - return contains -end -function WeakSet.prototype.has(self, value) - return self.items[value] == true -end -WeakSet[Symbol.species] = WeakSet + function WeakSet.prototype.add(self, value) + self.items[value] = true + return self + end + function WeakSet.prototype.delete(self, value) + local contains = self:has(value) + self.items[value] = nil + return contains + end + function WeakSet.prototype.has(self, value) + return self.items[value] == true + end + WeakSet[Symbol.species] = WeakSet end local function __TS__MapForOfStep(map, prev) local key diff --git a/internal/lualib/lualib_bundle_50.lua b/internal/lualib/lualib_bundle_50.lua index 429c047..8956734 100644 --- a/internal/lualib/lualib_bundle_50.lua +++ b/internal/lualib/lualib_bundle_50.lua @@ -585,145 +585,145 @@ local function __TS__Class(self) end local __TS__Promise do -local function makeDeferredPromiseFactory() - local resolve - local reject - local function executor(____, res, rej) - resolve = res - reject = rej - end - return function() - local promise = __TS__New(__TS__Promise, executor) - return promise, resolve, reject - end -end -local makeDeferredPromise = makeDeferredPromiseFactory() -local function isPromiseLike(value) - return __TS__InstanceOf(value, __TS__Promise) -end -local function doNothing(self) -end -local ____pcall = _G.pcall -__TS__Promise = __TS__Class() -__TS__Promise.name = "__TS__Promise" -function __TS__Promise.prototype.____constructor(self, executor) - self.state = 0 - self.fulfilledCallbacks = {} - self.rejectedCallbacks = {} - local success, ____error = ____pcall( - executor, - nil, - function(____, v) return self:resolve(v) end, - function(____, err) return self:reject(err) end - ) - if not success then - self:reject(____error) + local function makeDeferredPromiseFactory() + local resolve + local reject + local function executor(____, res, rej) + resolve = res + reject = rej + end + return function() + local promise = __TS__New(__TS__Promise, executor) + return promise, resolve, reject + end + end + local makeDeferredPromise = makeDeferredPromiseFactory() + local function isPromiseLike(value) + return __TS__InstanceOf(value, __TS__Promise) + end + local function doNothing(self) + end + local ____pcall = _G.pcall + __TS__Promise = __TS__Class() + __TS__Promise.name = "__TS__Promise" + function __TS__Promise.prototype.____constructor(self, executor) + self.state = 0 + self.fulfilledCallbacks = {} + self.rejectedCallbacks = {} + local success, ____error = ____pcall( + executor, + nil, + function(____, v) return self:resolve(v) end, + function(____, err) return self:reject(err) end + ) + if not success then + self:reject(____error) + end end -end -function __TS__Promise.resolve(value) - if __TS__InstanceOf(value, __TS__Promise) then - return value + function __TS__Promise.resolve(value) + if __TS__InstanceOf(value, __TS__Promise) then + return value + end + local promise = __TS__New(__TS__Promise, doNothing) + promise.state = 1 + promise.value = value + return promise + end + function __TS__Promise.reject(reason) + local promise = __TS__New(__TS__Promise, doNothing) + promise.state = 2 + promise.rejectionReason = reason + return promise + end + __TS__Promise.prototype["then"] = function(self, onFulfilled, onRejected) + local promise, resolve, reject = makeDeferredPromise() + self:addCallbacks( + onFulfilled and self:createPromiseResolvingCallback(onFulfilled, resolve, reject) or resolve, + onRejected and self:createPromiseResolvingCallback(onRejected, resolve, reject) or reject + ) + return promise end - local promise = __TS__New(__TS__Promise, doNothing) - promise.state = 1 - promise.value = value - return promise -end -function __TS__Promise.reject(reason) - local promise = __TS__New(__TS__Promise, doNothing) - promise.state = 2 - promise.rejectionReason = reason - return promise -end -__TS__Promise.prototype["then"] = function(self, onFulfilled, onRejected) - local promise, resolve, reject = makeDeferredPromise() - self:addCallbacks( - onFulfilled and self:createPromiseResolvingCallback(onFulfilled, resolve, reject) or resolve, - onRejected and self:createPromiseResolvingCallback(onRejected, resolve, reject) or reject - ) - return promise -end -function __TS__Promise.prototype.addCallbacks(self, fulfilledCallback, rejectedCallback) - if self.state == 1 then - return fulfilledCallback(nil, self.value) + function __TS__Promise.prototype.addCallbacks(self, fulfilledCallback, rejectedCallback) + if self.state == 1 then + return fulfilledCallback(nil, self.value) + end + if self.state == 2 then + return rejectedCallback(nil, self.rejectionReason) + end + local ____self_fulfilledCallbacks_0 = self.fulfilledCallbacks + ____self_fulfilledCallbacks_0[table.getn(____self_fulfilledCallbacks_0) + 1] = fulfilledCallback + local ____self_rejectedCallbacks_1 = self.rejectedCallbacks + ____self_rejectedCallbacks_1[table.getn(____self_rejectedCallbacks_1) + 1] = rejectedCallback end - if self.state == 2 then - return rejectedCallback(nil, self.rejectionReason) + function __TS__Promise.prototype.catch(self, onRejected) + return self["then"](self, nil, onRejected) end - local ____self_fulfilledCallbacks_0 = self.fulfilledCallbacks - ____self_fulfilledCallbacks_0[table.getn(____self_fulfilledCallbacks_0) + 1] = fulfilledCallback - local ____self_rejectedCallbacks_1 = self.rejectedCallbacks - ____self_rejectedCallbacks_1[table.getn(____self_rejectedCallbacks_1) + 1] = rejectedCallback -end -function __TS__Promise.prototype.catch(self, onRejected) - return self["then"](self, nil, onRejected) -end -function __TS__Promise.prototype.finally(self, onFinally) - return self["then"]( - self, - onFinally and (function(____, value) - onFinally(nil) - return value - end) or nil, - onFinally and (function(____, reason) - onFinally(nil) - error(reason, 0) - end) or nil - ) -end -function __TS__Promise.prototype.resolve(self, value) - if isPromiseLike(value) then - return value:addCallbacks( - function(____, v) return self:resolve(v) end, - function(____, err) return self:reject(err) end + function __TS__Promise.prototype.finally(self, onFinally) + return self["then"]( + self, + onFinally and (function(____, value) + onFinally(nil) + return value + end) or nil, + onFinally and (function(____, reason) + onFinally(nil) + error(reason, 0) + end) or nil ) end - if self.state == 0 then - self.state = 1 - self.value = value - return self:invokeCallbacks(self.fulfilledCallbacks, value) + function __TS__Promise.prototype.resolve(self, value) + if isPromiseLike(value) then + return value:addCallbacks( + function(____, v) return self:resolve(v) end, + function(____, err) return self:reject(err) end + ) + end + if self.state == 0 then + self.state = 1 + self.value = value + return self:invokeCallbacks(self.fulfilledCallbacks, value) + end end -end -function __TS__Promise.prototype.reject(self, reason) - if self.state == 0 then - self.state = 2 - self.rejectionReason = reason - return self:invokeCallbacks(self.rejectedCallbacks, reason) + function __TS__Promise.prototype.reject(self, reason) + if self.state == 0 then + self.state = 2 + self.rejectionReason = reason + return self:invokeCallbacks(self.rejectedCallbacks, reason) + end end -end -function __TS__Promise.prototype.invokeCallbacks(self, callbacks, value) - local callbacksLength = table.getn(callbacks) - if callbacksLength ~= 0 then - for i = 1, callbacksLength - 1 do - callbacks[i](callbacks, value) + function __TS__Promise.prototype.invokeCallbacks(self, callbacks, value) + local callbacksLength = table.getn(callbacks) + if callbacksLength ~= 0 then + for i = 1, callbacksLength - 1 do + callbacks[i](callbacks, value) + end + return callbacks[callbacksLength](callbacks, value) end - return callbacks[callbacksLength](callbacks, value) end -end -function __TS__Promise.prototype.createPromiseResolvingCallback(self, f, resolve, reject) - return function(____, value) - local success, resultOrError = ____pcall(f, nil, value) - if not success then - return reject(nil, resultOrError) + function __TS__Promise.prototype.createPromiseResolvingCallback(self, f, resolve, reject) + return function(____, value) + local success, resultOrError = ____pcall(f, nil, value) + if not success then + return reject(nil, resultOrError) + end + return self:handleCallbackValue(resultOrError, resolve, reject) end - return self:handleCallbackValue(resultOrError, resolve, reject) end -end -function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, reject) - if isPromiseLike(value) then - local nextpromise = value - if nextpromise.state == 1 then - return resolve(nil, nextpromise.value) - elseif nextpromise.state == 2 then - return reject(nil, nextpromise.rejectionReason) + function __TS__Promise.prototype.handleCallbackValue(self, value, resolve, reject) + if isPromiseLike(value) then + local nextpromise = value + if nextpromise.state == 1 then + return resolve(nil, nextpromise.value) + elseif nextpromise.state == 2 then + return reject(nil, nextpromise.rejectionReason) + else + return nextpromise:addCallbacks(resolve, reject) + end else - return nextpromise:addCallbacks(resolve, reject) + return resolve(nil, value) end - else - return resolve(nil, value) end end -end local ____coroutine = _G.coroutine or ({}) local cocreate = ____coroutine.create local coresume = ____coroutine.resume @@ -1229,167 +1229,167 @@ local function __TS__LuaIteratorSpread(self, state, firstKey) end local Map do -Map = __TS__Class() -Map.name = "Map" -function Map.prototype.____constructor(self, entries) - self[Symbol.toStringTag] = "Map" - self.items = {} - self.size = 0 - self.nextKey = {} - self.previousKey = {} - if entries == nil then - return - end - local iterable = entries - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break + Map = __TS__Class() + Map.name = "Map" + function Map.prototype.____constructor(self, entries) + self[Symbol.toStringTag] = "Map" + self.items = {} + self.size = 0 + self.nextKey = {} + self.previousKey = {} + if entries == nil then + return + end + local iterable = entries + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + local value = result.value -- Ensures index is offset when tuple is accessed + self:set(value[1], value[2]) end - local value = result.value -- Ensures index is offset when tuple is accessed - self:set(value[1], value[2]) - end - else - local array = entries - for ____, kvp in ipairs(array) do - self:set(kvp[1], kvp[2]) - end - end -end -function Map.prototype.clear(self) - self.items = {} - self.nextKey = {} - self.previousKey = {} - self.firstKey = nil - self.lastKey = nil - self.size = 0 -end -function Map.prototype.delete(self, key) - local contains = self:has(key) - if contains then - self.size = self.size - 1 - local next = self.nextKey[key] - local previous = self.previousKey[key] - if next ~= nil and previous ~= nil then - self.nextKey[previous] = next - self.previousKey[next] = previous - elseif next ~= nil then - self.firstKey = next - self.previousKey[next] = nil - elseif previous ~= nil then - self.lastKey = previous - self.nextKey[previous] = nil else - self.firstKey = nil - self.lastKey = nil + local array = entries + for ____, kvp in ipairs(array) do + self:set(kvp[1], kvp[2]) + end end - self.nextKey[key] = nil - self.previousKey[key] = nil end - self.items[key] = nil - return contains -end -function Map.prototype.forEach(self, callback) - for ____, key in __TS__Iterator(self:keys()) do - callback(nil, self.items[key], key, self) + function Map.prototype.clear(self) + self.items = {} + self.nextKey = {} + self.previousKey = {} + self.firstKey = nil + self.lastKey = nil + self.size = 0 + end + function Map.prototype.delete(self, key) + local contains = self:has(key) + if contains then + self.size = self.size - 1 + local next = self.nextKey[key] + local previous = self.previousKey[key] + if next ~= nil and previous ~= nil then + self.nextKey[previous] = next + self.previousKey[next] = previous + elseif next ~= nil then + self.firstKey = next + self.previousKey[next] = nil + elseif previous ~= nil then + self.lastKey = previous + self.nextKey[previous] = nil + else + self.firstKey = nil + self.lastKey = nil + end + self.nextKey[key] = nil + self.previousKey[key] = nil + end + self.items[key] = nil + return contains end -end -function Map.prototype.get(self, key) - return self.items[key] -end -function Map.prototype.has(self, key) - return self.nextKey[key] ~= nil or self.lastKey == key -end -function Map.prototype.set(self, key, value) - local isNewValue = not self:has(key) - if isNewValue then - self.size = self.size + 1 + function Map.prototype.forEach(self, callback) + for ____, key in __TS__Iterator(self:keys()) do + callback(nil, self.items[key], key, self) + end end - self.items[key] = value - if self.firstKey == nil then - self.firstKey = key - self.lastKey = key - elseif isNewValue then - self.nextKey[self.lastKey] = key - self.previousKey[key] = self.lastKey - self.lastKey = key + function Map.prototype.get(self, key) + return self.items[key] end - return self -end -Map.prototype[Symbol.iterator] = function(self) - return self:entries() -end -function Map.prototype.entries(self) - local function getFirstKey() - return self.firstKey + function Map.prototype.has(self, key) + return self.nextKey[key] ~= nil or self.lastKey == key end - local items = self.items - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = {key, items[key]}} + function Map.prototype.set(self, key, value) + local isNewValue = not self:has(key) + if isNewValue then + self.size = self.size + 1 end - } -end -function Map.prototype.keys(self) - local function getFirstKey() - return self.firstKey + self.items[key] = value + if self.firstKey == nil then + self.firstKey = key + self.lastKey = key + elseif isNewValue then + self.nextKey[self.lastKey] = key + self.previousKey[key] = self.lastKey + self.lastKey = key + end + return self end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = key} + Map.prototype[Symbol.iterator] = function(self) + return self:entries() + end + function Map.prototype.entries(self) + local function getFirstKey() + return self.firstKey end - } -end -function Map.prototype.values(self) - local function getFirstKey() - return self.firstKey + local items = self.items + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = {key, items[key]}} + end + } end - local items = self.items - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + function Map.prototype.keys(self) + local function getFirstKey() + return self.firstKey + end + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = key} end - return {done = not key, value = items[key]} + } + end + function Map.prototype.values(self) + local function getFirstKey() + return self.firstKey end - } -end -Map[Symbol.species] = Map + local items = self.items + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = items[key]} + end + } + end + Map[Symbol.species] = Map end local function __TS__MapGroupBy(items, keySelector) local result = __TS__New(Map) @@ -1883,215 +1883,215 @@ local function __TS__PromiseRace(iterable) end local Set do -Set = __TS__Class() -Set.name = "Set" -function Set.prototype.____constructor(self, values) - self[Symbol.toStringTag] = "Set" - self.size = 0 - self.nextKey = {} - self.previousKey = {} - if values == nil then - return - end - local iterable = values - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break + Set = __TS__Class() + Set.name = "Set" + function Set.prototype.____constructor(self, values) + self[Symbol.toStringTag] = "Set" + self.size = 0 + self.nextKey = {} + self.previousKey = {} + if values == nil then + return + end + local iterable = values + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + self:add(result.value) + end + else + local array = values + for ____, value in ipairs(array) do + self:add(value) end - self:add(result.value) - end - else - local array = values - for ____, value in ipairs(array) do - self:add(value) end end -end -function Set.prototype.add(self, value) - local isNewValue = not self:has(value) - if isNewValue then - self.size = self.size + 1 + function Set.prototype.add(self, value) + local isNewValue = not self:has(value) + if isNewValue then + self.size = self.size + 1 + end + if self.firstKey == nil then + self.firstKey = value + self.lastKey = value + elseif isNewValue then + self.nextKey[self.lastKey] = value + self.previousKey[value] = self.lastKey + self.lastKey = value + end + return self end - if self.firstKey == nil then - self.firstKey = value - self.lastKey = value - elseif isNewValue then - self.nextKey[self.lastKey] = value - self.previousKey[value] = self.lastKey - self.lastKey = value + function Set.prototype.clear(self) + self.nextKey = {} + self.previousKey = {} + self.firstKey = nil + self.lastKey = nil + self.size = 0 + end + function Set.prototype.delete(self, value) + local contains = self:has(value) + if contains then + self.size = self.size - 1 + local next = self.nextKey[value] + local previous = self.previousKey[value] + if next ~= nil and previous ~= nil then + self.nextKey[previous] = next + self.previousKey[next] = previous + elseif next ~= nil then + self.firstKey = next + self.previousKey[next] = nil + elseif previous ~= nil then + self.lastKey = previous + self.nextKey[previous] = nil + else + self.firstKey = nil + self.lastKey = nil + end + self.nextKey[value] = nil + self.previousKey[value] = nil + end + return contains end - return self -end -function Set.prototype.clear(self) - self.nextKey = {} - self.previousKey = {} - self.firstKey = nil - self.lastKey = nil - self.size = 0 -end -function Set.prototype.delete(self, value) - local contains = self:has(value) - if contains then - self.size = self.size - 1 - local next = self.nextKey[value] - local previous = self.previousKey[value] - if next ~= nil and previous ~= nil then - self.nextKey[previous] = next - self.previousKey[next] = previous - elseif next ~= nil then - self.firstKey = next - self.previousKey[next] = nil - elseif previous ~= nil then - self.lastKey = previous - self.nextKey[previous] = nil - else - self.firstKey = nil - self.lastKey = nil + function Set.prototype.forEach(self, callback) + for ____, key in __TS__Iterator(self:keys()) do + callback(nil, key, key, self) end - self.nextKey[value] = nil - self.previousKey[value] = nil end - return contains -end -function Set.prototype.forEach(self, callback) - for ____, key in __TS__Iterator(self:keys()) do - callback(nil, key, key, self) + function Set.prototype.has(self, value) + return self.nextKey[value] ~= nil or self.lastKey == value end -end -function Set.prototype.has(self, value) - return self.nextKey[value] ~= nil or self.lastKey == value -end -Set.prototype[Symbol.iterator] = function(self) - return self:values() -end -function Set.prototype.entries(self) - local function getFirstKey() - return self.firstKey + Set.prototype[Symbol.iterator] = function(self) + return self:values() end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] - end - return {done = not key, value = {key, key}} + function Set.prototype.entries(self) + local function getFirstKey() + return self.firstKey end - } -end -function Set.prototype.keys(self) - local function getFirstKey() - return self.firstKey - end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = {key, key}} end - return {done = not key, value = key} - end - } -end -function Set.prototype.values(self) - local function getFirstKey() - return self.firstKey + } end - local nextKey = self.nextKey - local key - local started = false - return { - [Symbol.iterator] = function(self) - return self - end, - next = function(self) - if not started then - started = true - key = getFirstKey(nil) - else - key = nextKey[key] + function Set.prototype.keys(self) + local function getFirstKey() + return self.firstKey + end + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = key} end - return {done = not key, value = key} + } + end + function Set.prototype.values(self) + local function getFirstKey() + return self.firstKey end - } -end -function Set.prototype.union(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - result:add(item) + local nextKey = self.nextKey + local key + local started = false + return { + [Symbol.iterator] = function(self) + return self + end, + next = function(self) + if not started then + started = true + key = getFirstKey(nil) + else + key = nextKey[key] + end + return {done = not key, value = key} + end + } end - return result -end -function Set.prototype.intersection(self, other) - local result = __TS__New(Set) - for ____, item in __TS__Iterator(self) do - if other:has(item) then + function Set.prototype.union(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do result:add(item) end + return result end - return result -end -function Set.prototype.difference(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - result:delete(item) + function Set.prototype.intersection(self, other) + local result = __TS__New(Set) + for ____, item in __TS__Iterator(self) do + if other:has(item) then + result:add(item) + end + end + return result end - return result -end -function Set.prototype.symmetricDifference(self, other) - local result = __TS__New(Set, self) - for ____, item in __TS__Iterator(other) do - if self:has(item) then + function Set.prototype.difference(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do result:delete(item) - else - result:add(item) end + return result end - return result -end -function Set.prototype.isSubsetOf(self, other) - for ____, item in __TS__Iterator(self) do - if not other:has(item) then - return false + function Set.prototype.symmetricDifference(self, other) + local result = __TS__New(Set, self) + for ____, item in __TS__Iterator(other) do + if self:has(item) then + result:delete(item) + else + result:add(item) + end end + return result end - return true -end -function Set.prototype.isSupersetOf(self, other) - for ____, item in __TS__Iterator(other) do - if not self:has(item) then - return false + function Set.prototype.isSubsetOf(self, other) + for ____, item in __TS__Iterator(self) do + if not other:has(item) then + return false + end end + return true end - return true -end -function Set.prototype.isDisjointFrom(self, other) - for ____, item in __TS__Iterator(self) do - if other:has(item) then - return false + function Set.prototype.isSupersetOf(self, other) + for ____, item in __TS__Iterator(other) do + if not self:has(item) then + return false + end end + return true end - return true -end -Set[Symbol.species] = Set + function Set.prototype.isDisjointFrom(self, other) + for ____, item in __TS__Iterator(self) do + if other:has(item) then + return false + end + end + return true + end + Set[Symbol.species] = Set end local function __TS__SourceMapTraceBack(fileName, sourceMap) _G.__TS__sourcemap = _G.__TS__sourcemap or ({}) @@ -2473,89 +2473,89 @@ local function __TS__UsingAsync(self, cb, ...) end local WeakMap do -WeakMap = __TS__Class() -WeakMap.name = "WeakMap" -function WeakMap.prototype.____constructor(self, entries) - self[Symbol.toStringTag] = "WeakMap" - self.items = {} - setmetatable(self.items, {__mode = "k"}) - if entries == nil then - return - end - local iterable = entries - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break + WeakMap = __TS__Class() + WeakMap.name = "WeakMap" + function WeakMap.prototype.____constructor(self, entries) + self[Symbol.toStringTag] = "WeakMap" + self.items = {} + setmetatable(self.items, {__mode = "k"}) + if entries == nil then + return + end + local iterable = entries + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + local value = result.value -- Ensures index is offset when tuple is accessed + self.items[value[1]] = value[2] + end + else + for ____, kvp in ipairs(entries) do + self.items[kvp[1]] = kvp[2] end - local value = result.value -- Ensures index is offset when tuple is accessed - self.items[value[1]] = value[2] - end - else - for ____, kvp in ipairs(entries) do - self.items[kvp[1]] = kvp[2] end end -end -function WeakMap.prototype.delete(self, key) - local contains = self:has(key) - self.items[key] = nil - return contains -end -function WeakMap.prototype.get(self, key) - return self.items[key] -end -function WeakMap.prototype.has(self, key) - return self.items[key] ~= nil -end -function WeakMap.prototype.set(self, key, value) - self.items[key] = value - return self -end -WeakMap[Symbol.species] = WeakMap + function WeakMap.prototype.delete(self, key) + local contains = self:has(key) + self.items[key] = nil + return contains + end + function WeakMap.prototype.get(self, key) + return self.items[key] + end + function WeakMap.prototype.has(self, key) + return self.items[key] ~= nil + end + function WeakMap.prototype.set(self, key, value) + self.items[key] = value + return self + end + WeakMap[Symbol.species] = WeakMap end local WeakSet do -WeakSet = __TS__Class() -WeakSet.name = "WeakSet" -function WeakSet.prototype.____constructor(self, values) - self[Symbol.toStringTag] = "WeakSet" - self.items = {} - setmetatable(self.items, {__mode = "k"}) - if values == nil then - return - end - local iterable = values - if iterable[Symbol.iterator] then - local iterator = iterable[Symbol.iterator](iterable) - while true do - local result = iterator:next() - if result.done then - break + WeakSet = __TS__Class() + WeakSet.name = "WeakSet" + function WeakSet.prototype.____constructor(self, values) + self[Symbol.toStringTag] = "WeakSet" + self.items = {} + setmetatable(self.items, {__mode = "k"}) + if values == nil then + return + end + local iterable = values + if iterable[Symbol.iterator] then + local iterator = iterable[Symbol.iterator](iterable) + while true do + local result = iterator:next() + if result.done then + break + end + self.items[result.value] = true + end + else + for ____, value in ipairs(values) do + self.items[value] = true end - self.items[result.value] = true - end - else - for ____, value in ipairs(values) do - self.items[value] = true end end -end -function WeakSet.prototype.add(self, value) - self.items[value] = true - return self -end -function WeakSet.prototype.delete(self, value) - local contains = self:has(value) - self.items[value] = nil - return contains -end -function WeakSet.prototype.has(self, value) - return self.items[value] == true -end -WeakSet[Symbol.species] = WeakSet + function WeakSet.prototype.add(self, value) + self.items[value] = true + return self + end + function WeakSet.prototype.delete(self, value) + local contains = self:has(value) + self.items[value] = nil + return contains + end + function WeakSet.prototype.has(self, value) + return self.items[value] == true + end + WeakSet[Symbol.species] = WeakSet end local function __TS__MapForOfStep(map, prev) local key