luau2ts 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/dist/cli/args.d.ts +23 -0
  2. package/dist/cli/args.d.ts.map +1 -0
  3. package/dist/cli/args.js +177 -0
  4. package/dist/cli/args.js.map +1 -0
  5. package/dist/cli/bin.d.ts +3 -0
  6. package/dist/cli/bin.d.ts.map +1 -0
  7. package/dist/cli/bin.js +71 -0
  8. package/dist/cli/bin.js.map +1 -0
  9. package/dist/cli/modes.d.ts +20 -0
  10. package/dist/cli/modes.d.ts.map +1 -0
  11. package/dist/cli/modes.js +145 -0
  12. package/dist/cli/modes.js.map +1 -0
  13. package/dist/compile/class-shape.d.ts +31 -0
  14. package/dist/compile/class-shape.d.ts.map +1 -0
  15. package/dist/compile/class-shape.js +291 -0
  16. package/dist/compile/class-shape.js.map +1 -0
  17. package/dist/compile/context.d.ts +86 -0
  18. package/dist/compile/context.d.ts.map +1 -0
  19. package/dist/compile/context.js +144 -0
  20. package/dist/compile/context.js.map +1 -0
  21. package/dist/compile/index.d.ts +58 -0
  22. package/dist/compile/index.d.ts.map +1 -0
  23. package/dist/compile/index.js +2155 -0
  24. package/dist/compile/index.js.map +1 -0
  25. package/dist/compile/macros/datatypes.d.ts +2 -0
  26. package/dist/compile/macros/datatypes.d.ts.map +1 -0
  27. package/dist/compile/macros/datatypes.js +76 -0
  28. package/dist/compile/macros/datatypes.js.map +1 -0
  29. package/dist/compile/macros/index.d.ts +33 -0
  30. package/dist/compile/macros/index.d.ts.map +1 -0
  31. package/dist/compile/macros/index.js +71 -0
  32. package/dist/compile/macros/index.js.map +1 -0
  33. package/dist/compile/macros/instance.d.ts +2 -0
  34. package/dist/compile/macros/instance.d.ts.map +1 -0
  35. package/dist/compile/macros/instance.js +58 -0
  36. package/dist/compile/macros/instance.js.map +1 -0
  37. package/dist/compile/macros/stdlib.d.ts +2 -0
  38. package/dist/compile/macros/stdlib.d.ts.map +1 -0
  39. package/dist/compile/macros/stdlib.js +140 -0
  40. package/dist/compile/macros/stdlib.js.map +1 -0
  41. package/dist/compile/rbxts-runtime.d.ts +2 -0
  42. package/dist/compile/rbxts-runtime.d.ts.map +1 -0
  43. package/dist/compile/rbxts-runtime.js +163 -0
  44. package/dist/compile/rbxts-runtime.js.map +1 -0
  45. package/dist/compile/sourcemap.d.ts +25 -0
  46. package/dist/compile/sourcemap.d.ts.map +1 -0
  47. package/dist/compile/sourcemap.js +71 -0
  48. package/dist/compile/sourcemap.js.map +1 -0
  49. package/dist/compile/type.d.ts +6 -0
  50. package/dist/compile/type.d.ts.map +1 -0
  51. package/dist/compile/type.js +122 -0
  52. package/dist/compile/type.js.map +1 -0
  53. package/dist/compile/util.d.ts +38 -0
  54. package/dist/compile/util.d.ts.map +1 -0
  55. package/dist/compile/util.js +153 -0
  56. package/dist/compile/util.js.map +1 -0
  57. package/dist/index.d.ts +3 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +7 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/parser/index.d.ts +4 -0
  62. package/dist/parser/index.d.ts.map +1 -0
  63. package/dist/parser/index.js +227 -0
  64. package/dist/parser/index.js.map +1 -0
  65. package/dist/parser/types.d.ts +430 -0
  66. package/dist/parser/types.d.ts.map +1 -0
  67. package/dist/parser/types.js +14 -0
  68. package/dist/parser/types.js.map +1 -0
  69. package/dist/parser/wasm/luau-parser.d.mts +21 -0
  70. package/dist/parser/wasm/luau-parser.mjs +2 -0
  71. package/dist/parser/wasm/luau-parser.wasm +0 -0
  72. package/dist/rojo/index.d.ts +4 -0
  73. package/dist/rojo/index.d.ts.map +1 -0
  74. package/dist/rojo/index.js +3 -0
  75. package/dist/rojo/index.js.map +1 -0
  76. package/dist/rojo/load-project.d.ts +12 -0
  77. package/dist/rojo/load-project.d.ts.map +1 -0
  78. package/dist/rojo/load-project.js +35 -0
  79. package/dist/rojo/load-project.js.map +1 -0
  80. package/dist/rojo/types.d.ts +39 -0
  81. package/dist/rojo/types.d.ts.map +1 -0
  82. package/dist/rojo/types.js +2 -0
  83. package/dist/rojo/types.js.map +1 -0
  84. package/dist/rojo/walk-tree.d.ts +40 -0
  85. package/dist/rojo/walk-tree.d.ts.map +1 -0
  86. package/dist/rojo/walk-tree.js +164 -0
  87. package/dist/rojo/walk-tree.js.map +1 -0
  88. package/dist/runtime/arith.d.ts +13 -0
  89. package/dist/runtime/arith.d.ts.map +1 -0
  90. package/dist/runtime/arith.js +151 -0
  91. package/dist/runtime/arith.js.map +1 -0
  92. package/dist/runtime/index-helper.d.ts +3 -0
  93. package/dist/runtime/index-helper.d.ts.map +1 -0
  94. package/dist/runtime/index-helper.js +40 -0
  95. package/dist/runtime/index-helper.js.map +1 -0
  96. package/dist/runtime/index.d.ts +13 -0
  97. package/dist/runtime/index.d.ts.map +1 -0
  98. package/dist/runtime/index.js +13 -0
  99. package/dist/runtime/index.js.map +1 -0
  100. package/dist/runtime/iterator.d.ts +58 -0
  101. package/dist/runtime/iterator.d.ts.map +1 -0
  102. package/dist/runtime/iterator.js +181 -0
  103. package/dist/runtime/iterator.js.map +1 -0
  104. package/dist/runtime/length.d.ts +2 -0
  105. package/dist/runtime/length.d.ts.map +1 -0
  106. package/dist/runtime/length.js +15 -0
  107. package/dist/runtime/length.js.map +1 -0
  108. package/dist/runtime/lua-stdlib.d.ts +186 -0
  109. package/dist/runtime/lua-stdlib.d.ts.map +1 -0
  110. package/dist/runtime/lua-stdlib.js +502 -0
  111. package/dist/runtime/lua-stdlib.js.map +1 -0
  112. package/dist/runtime/metatable.d.ts +16 -0
  113. package/dist/runtime/metatable.d.ts.map +1 -0
  114. package/dist/runtime/metatable.js +129 -0
  115. package/dist/runtime/metatable.js.map +1 -0
  116. package/dist/runtime/pattern.d.ts +21 -0
  117. package/dist/runtime/pattern.d.ts.map +1 -0
  118. package/dist/runtime/pattern.js +375 -0
  119. package/dist/runtime/pattern.js.map +1 -0
  120. package/dist/runtime/pcall.d.ts +12 -0
  121. package/dist/runtime/pcall.d.ts.map +1 -0
  122. package/dist/runtime/pcall.js +54 -0
  123. package/dist/runtime/pcall.js.map +1 -0
  124. package/dist/runtime/string-lib.d.ts +31 -0
  125. package/dist/runtime/string-lib.d.ts.map +1 -0
  126. package/dist/runtime/string-lib.js +296 -0
  127. package/dist/runtime/string-lib.js.map +1 -0
  128. package/dist/runtime/table-lib.d.ts +18 -0
  129. package/dist/runtime/table-lib.d.ts.map +1 -0
  130. package/dist/runtime/table-lib.js +133 -0
  131. package/dist/runtime/table-lib.js.map +1 -0
  132. package/dist/runtime/tostring.d.ts +3 -0
  133. package/dist/runtime/tostring.d.ts.map +1 -0
  134. package/dist/runtime/tostring.js +82 -0
  135. package/dist/runtime/tostring.js.map +1 -0
  136. package/dist/runtime/truthy.d.ts +13 -0
  137. package/dist/runtime/truthy.d.ts.map +1 -0
  138. package/dist/runtime/truthy.js +26 -0
  139. package/dist/runtime/truthy.js.map +1 -0
  140. package/package.json +1 -1
@@ -0,0 +1,40 @@
1
+ import type { LuauScriptEntry, RojoProjectNode, ScriptKind } from './types.js';
2
+ /** Classify a single filename by its Rojo-style suffix.
3
+ *
4
+ * Returns:
5
+ * - `{ kind, baseName, isInit }` for recognised script files
6
+ * - `null` for anything we don't translate (json, csv, txt, unknown).
7
+ *
8
+ * Suffix grammar (Rojo 7+ convention):
9
+ * - `init.luau` / `init.lua` → ModuleScript (folder collapses)
10
+ * - `init.server.luau` / `init.server.lua` → Script
11
+ * - `init.client.luau` / `init.client.lua` → LocalScript
12
+ * - `<name>.luau` / `<name>.lua` → ModuleScript named <name>
13
+ * - `<name>.server.luau` / `<name>.server.lua` → Script named <name>
14
+ * - `<name>.client.luau` / `<name>.client.lua` → LocalScript named <name>
15
+ *
16
+ * Order matters: `foo.server.luau` must match `.server.luau` before
17
+ * `.luau` so we check the longer suffix first.
18
+ */
19
+ export declare function classifyFile(filename: string): {
20
+ kind: ScriptKind;
21
+ baseName: string;
22
+ isInit: boolean;
23
+ } | null;
24
+ /** Walk a single Rojo tree node, accumulating script entries.
25
+ *
26
+ * - If the node has a `$path` pointing to a `.luau`/`.lua` file, record a
27
+ * single script entry at the current instance path.
28
+ * - If `$path` points to a directory, walk it: subdirectories nest as
29
+ * Folder instances; files become scripts; `init.*` files collapse the
30
+ * containing folder into a script of the matching kind.
31
+ * - If the node has children (keys that don't start with `$`), recurse
32
+ * into each child with its key as the next path component.
33
+ */
34
+ export declare function walkNode(node: RojoProjectNode, instancePath: string[], projectDir: string, out: LuauScriptEntry[]): Promise<void>;
35
+ /** Resolve the project file path: accept either a direct path to a
36
+ * `*.project.json` file or a directory containing `default.project.json`. */
37
+ export declare function resolveProjectFile(arg: string): Promise<string>;
38
+ export declare function projectDirOf(projectFile: string): string;
39
+ export declare function defaultProjectName(projectFile: string): string;
40
+ //# sourceMappingURL=walk-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk-tree.d.ts","sourceRoot":"","sources":["../../src/rojo/walk-tree.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;IAC9C,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,IAAI,CAkBP;AAUD;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,eAAe,EACrB,YAAY,EAAE,MAAM,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,eAAe,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAwED;8EAC8E;AAC9E,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMrE;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAY9D"}
@@ -0,0 +1,164 @@
1
+ import { readdir, readFile, stat } from 'node:fs/promises';
2
+ import { basename, dirname, extname, join, resolve } from 'node:path';
3
+ /** Classify a single filename by its Rojo-style suffix.
4
+ *
5
+ * Returns:
6
+ * - `{ kind, baseName, isInit }` for recognised script files
7
+ * - `null` for anything we don't translate (json, csv, txt, unknown).
8
+ *
9
+ * Suffix grammar (Rojo 7+ convention):
10
+ * - `init.luau` / `init.lua` → ModuleScript (folder collapses)
11
+ * - `init.server.luau` / `init.server.lua` → Script
12
+ * - `init.client.luau` / `init.client.lua` → LocalScript
13
+ * - `<name>.luau` / `<name>.lua` → ModuleScript named <name>
14
+ * - `<name>.server.luau` / `<name>.server.lua` → Script named <name>
15
+ * - `<name>.client.luau` / `<name>.client.lua` → LocalScript named <name>
16
+ *
17
+ * Order matters: `foo.server.luau` must match `.server.luau` before
18
+ * `.luau` so we check the longer suffix first.
19
+ */
20
+ export function classifyFile(filename) {
21
+ const lower = filename.toLowerCase();
22
+ const suffixes = [
23
+ { tail: '.server.luau', kind: 'Script' },
24
+ { tail: '.server.lua', kind: 'Script' },
25
+ { tail: '.client.luau', kind: 'LocalScript' },
26
+ { tail: '.client.lua', kind: 'LocalScript' },
27
+ { tail: '.luau', kind: 'ModuleScript' },
28
+ { tail: '.lua', kind: 'ModuleScript' },
29
+ ];
30
+ for (const { tail, kind } of suffixes) {
31
+ if (lower.endsWith(tail)) {
32
+ const baseName = filename.slice(0, filename.length - tail.length);
33
+ const isInit = baseName === 'init';
34
+ return { kind, baseName, isInit };
35
+ }
36
+ }
37
+ return null;
38
+ }
39
+ /** `$className` strings Rojo uses for explicit script-class assignment.
40
+ * A node's `$className` overrides the kind inferred from its `$path`. */
41
+ const SCRIPT_CLASS_NAMES = {
42
+ ModuleScript: 'ModuleScript',
43
+ Script: 'Script',
44
+ LocalScript: 'LocalScript',
45
+ };
46
+ /** Walk a single Rojo tree node, accumulating script entries.
47
+ *
48
+ * - If the node has a `$path` pointing to a `.luau`/`.lua` file, record a
49
+ * single script entry at the current instance path.
50
+ * - If `$path` points to a directory, walk it: subdirectories nest as
51
+ * Folder instances; files become scripts; `init.*` files collapse the
52
+ * containing folder into a script of the matching kind.
53
+ * - If the node has children (keys that don't start with `$`), recurse
54
+ * into each child with its key as the next path component.
55
+ */
56
+ export async function walkNode(node, instancePath, projectDir, out) {
57
+ if (node.$path !== undefined) {
58
+ const abs = resolve(projectDir, node.$path);
59
+ await walkPath(abs, instancePath, node.$className, out);
60
+ }
61
+ // Recurse into named children (anything not starting with `$`).
62
+ // Sort keys for deterministic output across filesystems / platforms.
63
+ const childKeys = Object.keys(node)
64
+ .filter((k) => !k.startsWith('$'))
65
+ .sort();
66
+ for (const childName of childKeys) {
67
+ const childNode = node[childName];
68
+ if (typeof childNode !== 'object' || childNode === null)
69
+ continue;
70
+ await walkNode(childNode, [...instancePath, childName], projectDir, out);
71
+ }
72
+ }
73
+ /** Walk a filesystem entry pointed at by a `$path`. */
74
+ async function walkPath(absPath, instancePath, explicitClassName, out) {
75
+ let st;
76
+ try {
77
+ st = await stat(absPath);
78
+ }
79
+ catch {
80
+ // Missing $path is a Rojo project error, but we tolerate it here so a
81
+ // partial project still yields the scripts it does have. The CLI can
82
+ // surface a warning to the user.
83
+ return;
84
+ }
85
+ if (st.isFile()) {
86
+ const cls = classifyFile(basename(absPath));
87
+ if (!cls)
88
+ return;
89
+ const kind = (explicitClassName && SCRIPT_CLASS_NAMES[explicitClassName])
90
+ || cls.kind;
91
+ const source = await readFile(absPath, 'utf8');
92
+ out.push({ instancePath, scriptKind: kind, filePath: absPath, source });
93
+ return;
94
+ }
95
+ if (!st.isDirectory())
96
+ return;
97
+ // Directory: scan for init.* first to decide whether the directory
98
+ // itself collapses into a script, then recurse into children.
99
+ const entries = (await readdir(absPath)).sort();
100
+ let initKind = null;
101
+ let initFile = null;
102
+ for (const entry of entries) {
103
+ const cls = classifyFile(entry);
104
+ if (cls && cls.isInit) {
105
+ initKind = cls.kind;
106
+ initFile = join(absPath, entry);
107
+ break;
108
+ }
109
+ }
110
+ if (initFile) {
111
+ const kind = (explicitClassName && SCRIPT_CLASS_NAMES[explicitClassName])
112
+ || initKind;
113
+ const source = await readFile(initFile, 'utf8');
114
+ out.push({ instancePath, scriptKind: kind, filePath: initFile, source });
115
+ }
116
+ for (const entry of entries) {
117
+ const entryPath = join(absPath, entry);
118
+ const entryStat = await stat(entryPath);
119
+ if (entryStat.isDirectory()) {
120
+ await walkPath(entryPath, [...instancePath, entry], undefined, out);
121
+ continue;
122
+ }
123
+ if (!entryStat.isFile())
124
+ continue;
125
+ const cls = classifyFile(entry);
126
+ if (!cls || cls.isInit)
127
+ continue;
128
+ const source = await readFile(entryPath, 'utf8');
129
+ out.push({
130
+ instancePath: [...instancePath, cls.baseName],
131
+ scriptKind: cls.kind,
132
+ filePath: entryPath,
133
+ source,
134
+ });
135
+ }
136
+ }
137
+ /** Resolve the project file path: accept either a direct path to a
138
+ * `*.project.json` file or a directory containing `default.project.json`. */
139
+ export async function resolveProjectFile(arg) {
140
+ const abs = resolve(arg);
141
+ const st = await stat(abs);
142
+ if (st.isFile())
143
+ return abs;
144
+ if (st.isDirectory())
145
+ return join(abs, 'default.project.json');
146
+ throw new Error(`Project path is neither file nor directory: ${arg}`);
147
+ }
148
+ export function projectDirOf(projectFile) {
149
+ return dirname(projectFile);
150
+ }
151
+ export function defaultProjectName(projectFile) {
152
+ const base = basename(projectFile);
153
+ // Strip `.project.json` to derive a stable project name.
154
+ const ext = extname(base);
155
+ if (ext === '.json') {
156
+ const withoutJson = base.slice(0, -ext.length);
157
+ if (withoutJson.endsWith('.project')) {
158
+ return withoutJson.slice(0, -'.project'.length) || 'project';
159
+ }
160
+ return withoutJson;
161
+ }
162
+ return base;
163
+ }
164
+ //# sourceMappingURL=walk-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk-tree.js","sourceRoot":"","sources":["../../src/rojo/walk-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare function luaAdd(a: unknown, b: unknown): number | unknown;
2
+ export declare function luaSub(a: unknown, b: unknown): number | unknown;
3
+ export declare function luaMul(a: unknown, b: unknown): number | unknown;
4
+ export declare function luaDiv(a: unknown, b: unknown): number | unknown;
5
+ export declare function luaIdiv(a: unknown, b: unknown): number | unknown;
6
+ export declare function luaMod(a: unknown, b: unknown): number | unknown;
7
+ export declare function luaPow(a: unknown, b: unknown): number | unknown;
8
+ export declare function luaUnm(a: unknown): number | unknown;
9
+ export declare function luaConcat(a: unknown, b: unknown): string | unknown;
10
+ export declare function luaEq(a: unknown, b: unknown): boolean;
11
+ export declare function luaLt(a: unknown, b: unknown): boolean;
12
+ export declare function luaLe(a: unknown, b: unknown): boolean;
13
+ //# sourceMappingURL=arith.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arith.d.ts","sourceRoot":"","sources":["../../src/runtime/arith.ts"],"names":[],"mappings":"AAyFA,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAE/D;AACD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAE/D;AACD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAE/D;AACD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAE/D;AACD,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAEhE;AACD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAG/D;AACD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAE/D;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAOnD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAIlE;AAID,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAerD;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAMrD;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAWrD"}
@@ -0,0 +1,151 @@
1
+ import { error, LuaError } from './pcall.js';
2
+ import { getMetamethod } from './metatable.js';
3
+ function toNumber(v) {
4
+ if (typeof v === 'number')
5
+ return v;
6
+ if (typeof v === 'string') {
7
+ const n = Number(v);
8
+ return Number.isNaN(n) ? undefined : n;
9
+ }
10
+ return undefined;
11
+ }
12
+ // Operations that are commutative — for these we try the second operand
13
+ // as the receiver if the first doesn't provide the fluent method. Lets
14
+ // `2 * vec3` route to `vec3.mul(2)`.
15
+ const COMMUTATIVE = {
16
+ __add: true,
17
+ __mul: true,
18
+ __eq: true,
19
+ };
20
+ function callBinMetamethod(meta, opLabel, a, b) {
21
+ // First try a direct fluent method (.add/.sub/.mul/.div etc.) on either
22
+ // operand — this is what Roblox's Vector3 / CFrame / Color3 expose.
23
+ // For commutative ops we also try b's method if a doesn't have one.
24
+ const fluent = FLUENT_METHOD[meta];
25
+ if (fluent) {
26
+ const fluentA = a?.[fluent];
27
+ if (typeof fluentA === 'function') {
28
+ return fluentA.call(a, b);
29
+ }
30
+ if (COMMUTATIVE[meta]) {
31
+ const fluentB = b?.[fluent];
32
+ if (typeof fluentB === 'function') {
33
+ return fluentB.call(b, a);
34
+ }
35
+ }
36
+ }
37
+ const mm = getMetamethod(a, meta) ?? getMetamethod(b, meta);
38
+ if (typeof mm === 'function') {
39
+ return mm(a, b);
40
+ }
41
+ // One operand is null/undefined — common in real places where a
42
+ // FindFirstChild lookup didn't resolve. Logging once and returning the
43
+ // other operand keeps the script alive instead of taking down the page
44
+ // on what was probably a missing-instance issue elsewhere.
45
+ if (a == null || b == null) {
46
+ return a ?? b ?? 0;
47
+ }
48
+ return error(`attempt to perform arithmetic (${opLabel}) on incompatible values`);
49
+ }
50
+ const FLUENT_METHOD = {
51
+ __add: 'add',
52
+ __sub: 'sub',
53
+ __mul: 'mul',
54
+ __div: 'div',
55
+ __concat: 'concat',
56
+ __eq: 'eq',
57
+ __lt: 'lt',
58
+ __le: 'le',
59
+ };
60
+ function binNumeric(meta, opLabel, a, b, fn) {
61
+ const an = toNumber(a);
62
+ const bn = toNumber(b);
63
+ if (an !== undefined && bn !== undefined)
64
+ return fn(an, bn);
65
+ return callBinMetamethod(meta, opLabel, a, b);
66
+ }
67
+ export function luaAdd(a, b) {
68
+ return binNumeric('__add', 'add', a, b, (x, y) => x + y);
69
+ }
70
+ export function luaSub(a, b) {
71
+ return binNumeric('__sub', 'sub', a, b, (x, y) => x - y);
72
+ }
73
+ export function luaMul(a, b) {
74
+ return binNumeric('__mul', 'mul', a, b, (x, y) => x * y);
75
+ }
76
+ export function luaDiv(a, b) {
77
+ return binNumeric('__div', 'div', a, b, (x, y) => x / y);
78
+ }
79
+ export function luaIdiv(a, b) {
80
+ return binNumeric('__idiv', 'idiv', a, b, (x, y) => Math.floor(x / y));
81
+ }
82
+ export function luaMod(a, b) {
83
+ // Lua's % is floor modulo: ((a % b) + b) % b. JS's % is truncated.
84
+ return binNumeric('__mod', 'mod', a, b, (x, y) => x - Math.floor(x / y) * y);
85
+ }
86
+ export function luaPow(a, b) {
87
+ return binNumeric('__pow', 'pow', a, b, (x, y) => x ** y);
88
+ }
89
+ export function luaUnm(a) {
90
+ if (typeof a === 'number')
91
+ return -a;
92
+ const an = toNumber(a);
93
+ if (an !== undefined)
94
+ return -an;
95
+ const mm = getMetamethod(a, '__unm');
96
+ if (typeof mm === 'function')
97
+ return mm(a);
98
+ return error('attempt to perform arithmetic (unm) on incompatible value');
99
+ }
100
+ export function luaConcat(a, b) {
101
+ const ok = (v) => typeof v === 'string' || typeof v === 'number';
102
+ if (ok(a) && ok(b))
103
+ return `${a}${b}`;
104
+ return callBinMetamethod('__concat', 'concat', a, b);
105
+ }
106
+ // ─── Comparison helpers ─────────────────────────────────────────────────────
107
+ export function luaEq(a, b) {
108
+ if (a === b)
109
+ return true;
110
+ // Lua maps JS null and undefined to nil; nil == nil is true, but JS
111
+ // `null === undefined` is false. Without this, a `FindFirstChild` result
112
+ // (null on miss) compared to `nil` via `x == nil` reads false, leaving
113
+ // scripts to dereference the miss.
114
+ if (a == null && b == null)
115
+ return true;
116
+ if (Number.isNaN(a) || Number.isNaN(b))
117
+ return false;
118
+ // Lua only consults __eq when types match and both are tables/userdata.
119
+ const sameType = typeof a === typeof b && a !== null && b !== null && typeof a === 'object';
120
+ if (sameType) {
121
+ const mm = getMetamethod(a, '__eq') ?? getMetamethod(b, '__eq');
122
+ if (typeof mm === 'function')
123
+ return Boolean(mm(a, b));
124
+ }
125
+ return false;
126
+ }
127
+ export function luaLt(a, b) {
128
+ if (typeof a === 'number' && typeof b === 'number')
129
+ return a < b;
130
+ if (typeof a === 'string' && typeof b === 'string')
131
+ return a < b;
132
+ const mm = getMetamethod(a, '__lt') ?? getMetamethod(b, '__lt');
133
+ if (typeof mm === 'function')
134
+ return Boolean(mm(a, b));
135
+ throw new LuaError('attempt to compare incompatible values');
136
+ }
137
+ export function luaLe(a, b) {
138
+ if (typeof a === 'number' && typeof b === 'number')
139
+ return a <= b;
140
+ if (typeof a === 'string' && typeof b === 'string')
141
+ return a <= b;
142
+ const mmLe = getMetamethod(a, '__le') ?? getMetamethod(b, '__le');
143
+ if (typeof mmLe === 'function')
144
+ return Boolean(mmLe(a, b));
145
+ // Fall back to !(b < a) with __lt
146
+ const mmLt = getMetamethod(a, '__lt') ?? getMetamethod(b, '__lt');
147
+ if (typeof mmLt === 'function')
148
+ return !Boolean(mmLt(b, a));
149
+ throw new LuaError('attempt to compare incompatible values');
150
+ }
151
+ //# sourceMappingURL=arith.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arith.js","sourceRoot":"","sources":["../../src/runtime/arith.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function luaIndex<T = unknown>(t: unknown, k: unknown): T;
2
+ export declare function luaIndexSet(t: unknown, k: unknown, v: unknown): unknown;
3
+ //# sourceMappingURL=index-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-helper.d.ts","sourceRoot":"","sources":["../../src/runtime/index-helper.ts"],"names":[],"mappings":"AAkBA,wBAAgB,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,CAAC,CAM/D;AAKD,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAQvE"}
@@ -0,0 +1,40 @@
1
+ // luaIndex(t, k) — table[k] lookup with Lua-correct array indexing.
2
+ //
3
+ // Lua tables are 1-indexed; JS arrays are 0-indexed. The luau-to-ts
4
+ // compiler used to emit an inline conditional that subtracted 1 from
5
+ // every runtime numeric key:
6
+ //
7
+ // t[(typeof k === "number" ? k - 1 : k)]
8
+ //
9
+ // That's correct for Lua sequence-style tables compiled to JS arrays
10
+ // (where Lua `arr[1]` should hit JS `arr[0]`), but it's catastrophically
11
+ // wrong for dictionary-style tables keyed by large numeric values —
12
+ // Roblox developer-product IDs (3582943767), asset IDs, gamepass IDs, etc.
13
+ // `productCash[3582943767]` ends up as `productCash[3582943766]` → undefined.
14
+ //
15
+ // This helper picks the right behavior dynamically:
16
+ // • Plain JS array, numeric key in range → subtract 1 (sequence access)
17
+ // • Anything else → pass through (dictionary access, string keys, etc.)
18
+ export function luaIndex(t, k) {
19
+ if (t === null || t === undefined)
20
+ return undefined;
21
+ if (typeof k === 'number' && Array.isArray(t)) {
22
+ return t[k - 1];
23
+ }
24
+ return t[k];
25
+ }
26
+ // Companion to luaIndex for the `t[k] = v` write position. Same arrays-vs-
27
+ // dictionaries discrimination — only Lua sequences compiled to JS arrays
28
+ // get the 1-index subtraction.
29
+ export function luaIndexSet(t, k, v) {
30
+ if (t === null || t === undefined)
31
+ return v;
32
+ if (typeof k === 'number' && Array.isArray(t)) {
33
+ t[k - 1] = v;
34
+ }
35
+ else {
36
+ t[k] = v;
37
+ }
38
+ return v;
39
+ }
40
+ //# sourceMappingURL=index-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-helper.js","sourceRoot":"","sources":["../../src/runtime/index-helper.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,EAAE;AACF,oEAAoE;AACpE,qEAAqE;AACrE,6BAA6B;AAC7B,EAAE;AACF,2CAA2C;AAC3C,EAAE;AACF,qEAAqE;AACrE,yEAAyE;AACzE,oEAAoE;AACpE,2EAA2E;AAC3E,8EAA8E;AAC9E,EAAE;AACF,oDAAoD;AACpD,0EAA0E;AAC1E,0EAA0E;AAE1E,MAAM,UAAU,QAAQ,CAAc,CAAU,EAAE,CAAU;IAC1D,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAc,CAAC;IACzD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,OAAQ,CAAe,CAAC,CAAC,GAAG,CAAC,CAAM,CAAC;IACtC,CAAC;IACD,OAAQ,CAAsC,CAAC,CAAoB,CAAM,CAAC;AAC5E,CAAC;AAED,2EAA2E;AAC3E,yEAAyE;AACzE,+BAA+B;AAC/B,MAAM,UAAU,WAAW,CAAC,CAAU,EAAE,CAAU,EAAE,CAAU;IAC5D,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,CAAe,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACL,CAAsC,CAAC,CAAoB,CAAC,GAAG,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,13 @@
1
+ export * from './truthy.js';
2
+ export * from './length.js';
3
+ export * from './pcall.js';
4
+ export * from './iterator.js';
5
+ export * from './tostring.js';
6
+ export * from './metatable.js';
7
+ export * from './arith.js';
8
+ export * from './table-lib.js';
9
+ export * from './pattern.js';
10
+ export * from './string-lib.js';
11
+ export * from './lua-stdlib.js';
12
+ export * from './index-helper.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export * from './truthy.js';
2
+ export * from './length.js';
3
+ export * from './pcall.js';
4
+ export * from './iterator.js';
5
+ export * from './tostring.js';
6
+ export * from './metatable.js';
7
+ export * from './arith.js';
8
+ export * from './table-lib.js';
9
+ export * from './pattern.js';
10
+ export * from './string-lib.js';
11
+ export * from './lua-stdlib.js';
12
+ export * from './index-helper.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,58 @@
1
+ type KeyReifier = (rawKey: unknown) => unknown;
2
+ export declare function registerKeyReifier(fn: KeyReifier): void;
3
+ export type IpairsState<T> = readonly [
4
+ iterFn: (state: readonly T[], i: number) => [number, T] | undefined,
5
+ state: readonly T[],
6
+ initial: number
7
+ ];
8
+ export type PairsState<T> = readonly [
9
+ iterFn: (state: T, prev: keyof T | null) => [keyof T, T[keyof T]] | undefined,
10
+ state: T,
11
+ initial: null
12
+ ];
13
+ export declare function ipairs<T>(t: readonly T[] | null | undefined): IpairsState<T>;
14
+ export declare function pairs<T extends object>(t: T | null | undefined): PairsState<T>;
15
+ export declare function next<T extends object>(t: T | null | undefined, k?: keyof T | null): [keyof T, T[keyof T]] | undefined;
16
+ /** Generic-for protocol adapter. Luau lets you write
17
+ * `for k, v in expr do … end` where `expr` can be any of:
18
+ * - an iterator triple `(iterFn, state, initialCtrl)` returned by
19
+ * `pairs(t)` / `ipairs(t)` / custom iterator constructors,
20
+ * - a callable that mimics the iterator function directly,
21
+ * - a table with an `__iter` metamethod,
22
+ * - a plain array (Luau extension — common in Roblox code like
23
+ * `for _, x in CollectionService:GetTagged("Tag") do`),
24
+ * - a plain dictionary (Luau extension; same as `pairs(t)`).
25
+ *
26
+ * The compiler used to emit a raw `[__iter, __state, __ctrl] = expr`
27
+ * destructure that only worked for the triple form. Arrays and bare
28
+ * tables silently iterated zero times because the first element
29
+ * wasn't a function. This adapter normalizes every shape to a real
30
+ * triple. */
31
+ export declare function genericIter(value: unknown): readonly [
32
+ (state: unknown, ctrl: unknown) => unknown,
33
+ unknown,
34
+ unknown
35
+ ];
36
+ /** Multi-return adapter for `local a, b = f()` where `f` returns a single
37
+ * value (not a tuple). Luau pads missing returns with nil; JS destructuring
38
+ * on a non-iterable throws. Wrap the call result so destructuring works:
39
+ * `[a, b] = multiret(f())` → `a = result`, `b = undefined` when `f` returns
40
+ * a non-array, and stays a no-op when `f` already returns an array tuple. */
41
+ export declare function multiret(v: unknown): unknown[];
42
+ /** Drop-in replacement for `Object.keys(t)` for the compiler's inlined
43
+ * `for k in pairs(t)` form. Returns the original Instance object as the
44
+ * key when the table was indexed with one, via the global key reifier
45
+ * a host Roblox runtime installs. Without this, Instance-keyed
46
+ * Lua tables collapse on shared Name (two parts named "Handle" share
47
+ * the same string key) AND iteration yields the string key, so
48
+ * `part.CFrame = ...` fails with "Cannot create property on string".
49
+ *
50
+ * Falls back to the raw string for primitive keys and for the slow
51
+ * path before the runtime has loaded. */
52
+ export declare function pairKeys(t: unknown): unknown[];
53
+ /** Companion lookup: `t[k]` where k may be a reified Instance. We use
54
+ * String(k) to recover the original property key. For numeric keys the
55
+ * compiler emits `t[k-1]` directly, so we only handle the reified case. */
56
+ export declare function pairValue(t: unknown, k: unknown): unknown;
57
+ export {};
58
+ //# sourceMappingURL=iterator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iterator.d.ts","sourceRoot":"","sources":["../../src/runtime/iterator.ts"],"names":[],"mappings":"AAAA,KAAK,UAAU,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;AAG/C,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAEvD;AAkBD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,SAAS;IACpC,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS;IACnE,KAAK,EAAE,SAAS,CAAC,EAAE;IACnB,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,SAAS;IACnC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS;IAC7E,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,IAAI;CACd,CAAC;AAEF,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAE5E;AAWD,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAE9E;AAMD,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EACnC,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACvB,CAAC,GAAE,MAAM,CAAC,GAAG,IAAW,GACvB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAEnC;AA4CD;;;;;;;;;;;;;;cAcc;AACd,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS;IACpD,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO;IAC1C,OAAO;IACP,OAAO;CACR,CAmCA;AAMD;;;;8EAI8E;AAC9E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,CAE9C;AAED;;;;;;;;;0CAS0C;AAC1C,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,CAe9C;AAED;;4EAE4E;AAC5E,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAOzD"}