luaut-parser 1.0.0 → 1.2.0

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.
package/dist/luau.d.luaut CHANGED
@@ -1,244 +1,245 @@
1
- -- Core Luau ambient definitions, written in luaut.
2
- --
3
- -- This file is the *only* place the analyzer learns what `type` and `typeof`
4
- -- mean. There is no built-in table of result strings and no special case for
5
- -- these names anywhere in `analyzeTypes` — narrowing is derived from the
6
- -- overloads below, and any function you declare the same way narrows the same
7
- -- way. Load it with `analyzeTypes(program, scopes, { libs: [luauLib] })`, or
8
- -- `defaultLibs` for these plus the Roblox definitions.
9
- --
10
- -- Roblox-only globals (`game`, `task`, `Vector3`, ...) live in
11
- -- `roblox.d.luaut`, which also adds the `typeof` overloads for the Roblox data
12
- -- types. Overloads of one name accumulate across definitions files.
13
-
14
- -- ============================================================
15
- -- Truthiness
16
- -- ------------------------------------------------------------
17
- -- In Luau **only `nil` and `false` are falsy** — `0`, `0/0` and `""` are all
18
- -- truthy, unlike JavaScript. `if x then` therefore tells you nothing about a
19
- -- `number` or a `string`, and everything about a `T | nil`.
20
- --
21
- -- These two names are what the analyzer's truthiness narrowing computes, made
22
- -- available to write down:
23
- --
24
- -- const function f(v: string | nil)
25
- -- if v then ... end -- v: string (Truthy<string | nil>)
26
- -- if not v then ... end -- v: nil (Extract<string | nil, Falsy>)
27
- -- end
28
- -- ============================================================
29
-
30
- type Falsy = nil | false
31
- type Truthy<T> = T - Falsy
32
-
33
- -- ============================================================
34
- -- Utility types
35
- -- ------------------------------------------------------------
36
- -- Written in luaut on top of `keyof`, `T[K]`, conditional types with `infer`,
37
- -- and mapped types. None of these names is known to the analyzer.
38
- -- ============================================================
39
-
40
- -- `-` is set difference. Over a union it drops members; over a concrete type
41
- -- it simplifies away; over an opaque type (`unknown`, an unresolved parameter)
42
- -- it is *kept*, so `Exclude<unknown, 1>` stays `unknown - 1` rather than
43
- -- forgetting what was ruled out.
44
- type Exclude<T, U> = T - U
45
- type Extract<T, U> = T extends U ? T : never
46
- type NonNullable<T> = T - nil
47
-
48
- type ReturnType<T> = T extends (...unknown) -> infer R ? R : never
49
- type Parameters<T> = T extends (...infer P) -> unknown ? P : never
50
-
51
- type Partial<T> = { [K in keyof T]?: T[K] }
52
- type Required<T> = { [K in keyof T]-?: T[K] }
53
- type Readonly<T> = { readonly [K in keyof T]: T[K] }
54
- type Mutable<T> = { -readonly [K in keyof T]: T[K] }
55
-
56
- type Pick<T, K> = { [P in K]: T[P] }
57
- type Omit<T, K> = Pick<T, Exclude<keyof T, K>>
58
- type Record<K, V> = { [P in K]: V }
59
-
60
- -- ============================================================
61
- -- The narrowing built-ins
62
- -- ------------------------------------------------------------
63
- -- Each result string gets its own overload returning that string as a
64
- -- *literal* type. For `typeof(x) == "number"` the analyzer keeps the parameter
65
- -- types of the overloads that can return `"number"` and narrows `x` to their
66
- -- union; the `else` branch excludes them. The trailing generic signature is the
67
- -- catch-all, tried only after every concrete one, so it never steals a match.
68
- -- ============================================================
69
-
70
- -- `type()`: the Lua base types.
71
- declare function type(value: nil): "nil"
72
- declare function type(value: boolean): "boolean"
73
- declare function type(value: number): "number"
74
- declare function type(value: string): "string"
75
- declare function type(value: thread): "thread"
76
- declare function type(value: buffer): "buffer"
77
- declare function type(value: (...unknown) -> ...unknown): "function"
78
- declare function type(value: { [unknown]: unknown }): "table"
79
- declare function type<T>(value: T): string
80
-
81
- -- `typeof()`: the same, plus (in `roblox.d.luaut`) the Roblox data types,
82
- -- which it reports by name rather than as `userdata`.
83
- declare function typeof(value: nil): "nil"
84
- declare function typeof(value: boolean): "boolean"
85
- declare function typeof(value: number): "number"
86
- declare function typeof(value: string): "string"
87
- declare function typeof(value: thread): "thread"
88
- declare function typeof(value: buffer): "buffer"
89
- declare function typeof(value: (...unknown) -> ...unknown): "function"
90
- declare function typeof(value: { [unknown]: unknown }): "table"
91
- declare function typeof<T>(value: T): string
92
-
93
- -- ============================================================
94
- -- Base library
95
- -- ============================================================
96
-
97
- declare _G: { [string]: unknown }
98
-
99
- declare function require(module: unknown): unknown
100
- declare function tostring(value: unknown): string
101
- declare function tonumber(value: unknown, base?: number): number | nil
102
- declare function print(...: unknown): ()
103
- declare function warn(...: unknown): ()
104
- -- `error` never returns, which is what lets
105
- -- `if v == nil then error("...") end` narrow the rest of the block.
106
- declare function error(message: unknown, level?: number): never
107
-
108
- -- `asserts value` — narrows the *rest of the enclosing block*, the way
109
- -- TypeScript's assertion signatures do:
110
- --
111
- -- const part = workspace:FindFirstChild("Part") -- Instance | nil
112
- -- assert(part)
113
- -- part.Name -- Instance, no `?`
114
- declare function assert<T>(value: T, message?: string): asserts value
115
-
116
- declare function pcall<T>(fn: (...unknown) -> T, ...: unknown): (boolean, T)
117
- declare function xpcall<T>(fn: (...unknown) -> T, handler: (err: unknown) -> unknown, ...: unknown): (boolean, T)
118
- declare function select(n: unknown, ...: unknown): unknown
119
- declare function unpack<V>(list: V[], i?: number, j?: number): ...V
120
- declare function rawget(t: unknown, key: unknown): unknown
121
- declare function rawset<T>(t: T, key: unknown, value: unknown): T
122
- declare function rawequal(a: unknown, b: unknown): boolean
123
- declare function rawlen(t: unknown): number
124
- declare function setmetatable<T>(t: T, mt: unknown): T
125
- declare function getmetatable(t: unknown): unknown
126
- declare function newproxy(addMeta?: boolean): unknown
127
- declare function next<K, V>(t: { [K]: V }, key?: K): (K, V)
128
-
129
- declare string: {
130
- format: (fmt: string, ...unknown) -> string,
131
- sub: (s: string, i: number, j?: number) -> string,
132
- len: (s: string) -> number,
133
- upper: (s: string) -> string,
134
- lower: (s: string) -> string,
135
- rep: (s: string, n: number, sep?: string) -> string,
136
- reverse: (s: string) -> string,
137
- split: (s: string, separator?: string) -> string[],
138
- find: (s: string, pattern: string, init?: number, plain?: boolean) -> (number | nil, number | nil),
139
- match: (s: string, pattern: string, init?: number) -> ...unknown,
140
- gmatch: (s: string, pattern: string) -> () -> ...string,
141
- gsub: (s: string, pattern: string, repl: unknown, n?: number) -> (string, number),
142
- byte: (s: string, i?: number, j?: number) -> ...number,
143
- char: (...number) -> string,
144
- }
145
-
146
- declare math: {
147
- floor: (x: number) -> number,
148
- ceil: (x: number) -> number,
149
- abs: (x: number) -> number,
150
- sqrt: (x: number) -> number,
151
- min: (...number) -> number,
152
- max: (...number) -> number,
153
- clamp: (x: number, min: number, max: number) -> number,
154
- round: (x: number) -> number,
155
- sign: (x: number) -> number,
156
- random: (m?: number, n?: number) -> number,
157
- pow: (x: number, y: number) -> number,
158
- log: (x: number, base?: number) -> number,
159
- sin: (x: number) -> number,
160
- cos: (x: number) -> number,
161
- tan: (x: number) -> number,
162
- atan2: (y: number, x: number) -> number,
163
- rad: (deg: number) -> number,
164
- deg: (rad: number) -> number,
165
- huge: number,
166
- pi: number,
167
- }
168
-
169
- declare table: {
170
- insert: (t: unknown[], a: unknown, b?: unknown) -> (),
171
- remove: (t: unknown[], pos?: number) -> unknown,
172
- concat: (t: unknown[], sep?: string, i?: number, j?: number) -> string,
173
- find: (t: unknown[], value: unknown, init?: number) -> number | nil,
174
- sort: (t: unknown[], comp?: unknown) -> (),
175
- clear: (t: unknown) -> (),
176
- clone: (t: unknown) -> unknown,
177
- freeze: (t: unknown) -> unknown,
178
- isfrozen: (t: unknown) -> boolean,
179
- create: (count: number, value?: unknown) -> unknown[],
180
- pack: (...unknown) -> { n: number, [number]: unknown },
181
- unpack: (list: unknown[], i?: number, j?: number) -> ...unknown,
182
- move: (src: unknown[], a: number, b: number, t: number, dst?: unknown[]) -> unknown[],
183
- keys: (t: unknown) -> unknown[],
184
- }
185
-
186
- declare os: {
187
- time: (t?: unknown) -> number,
188
- clock: () -> number,
189
- date: (format?: string, time?: number) -> unknown,
190
- difftime: (a: number, b: number) -> number,
191
- }
192
-
193
- declare coroutine: {
194
- create: (fn: (...unknown) -> ...unknown) -> thread,
195
- resume: (co: thread, ...unknown) -> ...unknown,
196
- yield: (...unknown) -> ...unknown,
197
- wrap: (fn: (...unknown) -> ...unknown) -> (...unknown) -> ...unknown,
198
- status: (co: thread) -> string,
199
- running: () -> thread,
200
- isyieldable: () -> boolean,
201
- }
202
-
203
- declare utf8: {
204
- char: (...number) -> string,
205
- codepoint: (s: string, i?: number, j?: number) -> ...number,
206
- len: (s: string, i?: number, j?: number) -> number | nil,
207
- offset: (s: string, n: number, i?: number) -> number | nil,
208
- nfdnormalize: (s: string) -> string,
209
- nfcnormalize: (s: string) -> string,
210
- charpattern: string,
211
- }
212
-
213
- declare bit32: {
214
- band: (...number) -> number,
215
- bor: (...number) -> number,
216
- bxor: (...number) -> number,
217
- bnot: (x: number) -> number,
218
- lshift: (x: number, disp: number) -> number,
219
- rshift: (x: number, disp: number) -> number,
220
- arshift: (x: number, disp: number) -> number,
221
- extract: (n: number, field: number, width?: number) -> number,
222
- replace: (n: number, v: number, field: number, width?: number) -> number,
223
- countlz: (n: number) -> number,
224
- countrz: (n: number) -> number,
225
- }
226
-
227
- declare buffer: {
228
- create: (size: number) -> buffer,
229
- fromstring: (s: string) -> buffer,
230
- tostring: (b: buffer) -> string,
231
- len: (b: buffer) -> number,
232
- readi8: (b: buffer, offset: number) -> number,
233
- readu8: (b: buffer, offset: number) -> number,
234
- readi32: (b: buffer, offset: number) -> number,
235
- readu32: (b: buffer, offset: number) -> number,
236
- readf64: (b: buffer, offset: number) -> number,
237
- writei8: (b: buffer, offset: number, value: number) -> (),
238
- writeu8: (b: buffer, offset: number, value: number) -> (),
239
- writei32: (b: buffer, offset: number, value: number) -> (),
240
- writeu32: (b: buffer, offset: number, value: number) -> (),
241
- writef64: (b: buffer, offset: number, value: number) -> (),
242
- copy: (dst: buffer, dstOffset: number, src: buffer, srcOffset?: number, count?: number) -> (),
243
- fill: (b: buffer, offset: number, value: number, count?: number) -> (),
244
- }
1
+ -- Core Luau ambient definitions, written in luaut.
2
+ --
3
+ -- This file is the *only* place the analyzer learns what `type` and `typeof`
4
+ -- mean. There is no built-in table of result strings and no special case for
5
+ -- these names anywhere in `analyzeTypes` — narrowing is derived from the
6
+ -- overloads below, and any function you declare the same way narrows the same
7
+ -- way. Load it with `analyzeTypes(program, scopes, { libs: [luauLib] })`, or
8
+ -- `defaultLibs` for these plus the Roblox definitions.
9
+ --
10
+ -- Roblox-only globals (`game`, `task`, `Vector3`, ...) live in
11
+ -- `roblox.d.luaut`, which also adds the `typeof` overloads for the Roblox data
12
+ -- types. Overloads of one name accumulate across definitions files.
13
+
14
+ -- ============================================================
15
+ -- Truthiness
16
+ -- ------------------------------------------------------------
17
+ -- In Luau **only `nil` and `false` are falsy** — `0`, `0/0` and `""` are all
18
+ -- truthy, unlike JavaScript. `if x then` therefore tells you nothing about a
19
+ -- `number` or a `string`, and everything about a `T | nil`.
20
+ --
21
+ -- These two names are what the analyzer's truthiness narrowing computes, made
22
+ -- available to write down:
23
+ --
24
+ -- const function f(v: string | nil)
25
+ -- if v then ... end -- v: string (Truthy<string | nil>)
26
+ -- if not v then ... end -- v: nil (Extract<string | nil, Falsy>)
27
+ -- end
28
+ -- ============================================================
29
+
30
+ type Falsy = nil | false
31
+ type Truthy<T> = T - Falsy
32
+
33
+ -- ============================================================
34
+ -- Utility types
35
+ -- ------------------------------------------------------------
36
+ -- Written in luaut on top of `keyof`, `T[K]`, conditional types with `infer`,
37
+ -- and mapped types. None of these names is known to the analyzer.
38
+ -- ============================================================
39
+
40
+ -- `-` is set difference. Over a union it drops members; over a concrete type
41
+ -- it simplifies away; over an opaque type (`unknown`, an unresolved parameter)
42
+ -- it is *kept*, so `Exclude<unknown, 1>` stays `unknown - 1` rather than
43
+ -- forgetting what was ruled out.
44
+ type Exclude<T, U> = T - U
45
+ type Extract<T, U> = T extends U ? T : never
46
+ type NonNullable<T> = T - nil
47
+
48
+ type ReturnType<T> = T extends (...unknown) -> infer R ? R : never
49
+ type Parameters<T> = T extends (...infer P) -> unknown ? P : never
50
+
51
+ type Partial<T> = { [K in keyof T]?: T[K] }
52
+ type Required<T> = { [K in keyof T]-?: T[K] }
53
+ type Readonly<T> = { readonly [K in keyof T]: T[K] }
54
+ type Mutable<T> = { -readonly [K in keyof T]: T[K] }
55
+
56
+ type Pick<T, K> = { [P in K]: T[P] }
57
+ type Omit<T, K> = Pick<T, Exclude<keyof T, K>>
58
+ type Record<K, V> = { [P in K]: V }
59
+
60
+ -- ============================================================
61
+ -- The narrowing built-ins
62
+ -- ------------------------------------------------------------
63
+ -- Each result string gets its own overload returning that string as a
64
+ -- *literal* type. For `typeof(x) == "number"` the analyzer keeps the parameter
65
+ -- types of the overloads that can return `"number"` and narrows `x` to their
66
+ -- union; the `else` branch excludes them. The trailing generic signature is the
67
+ -- catch-all, tried only after every concrete one, so it never steals a match.
68
+ -- ============================================================
69
+
70
+ -- `type()`: the Lua base types.
71
+ declare function type(value: nil): "nil"
72
+ declare function type(value: boolean): "boolean"
73
+ declare function type(value: number): "number"
74
+ declare function type(value: string): "string"
75
+ declare function type(value: thread): "thread"
76
+ declare function type(value: buffer): "buffer"
77
+ declare function type(value: (...unknown) -> ...unknown): "function"
78
+ declare function type(value: { [unknown]: unknown }): "table"
79
+ declare function type<T>(value: T): string
80
+
81
+ -- `typeof()`: the same, plus (in `roblox.d.luaut`) the Roblox data types,
82
+ -- which it reports by name rather than as `userdata`.
83
+ declare function typeof(value: nil): "nil"
84
+ declare function typeof(value: boolean): "boolean"
85
+ declare function typeof(value: number): "number"
86
+ declare function typeof(value: string): "string"
87
+ declare function typeof(value: thread): "thread"
88
+ declare function typeof(value: buffer): "buffer"
89
+ declare function typeof(value: (...unknown) -> ...unknown): "function"
90
+ declare function typeof(value: { [unknown]: unknown }): "table"
91
+ declare function typeof<T>(value: T): string
92
+
93
+ -- ============================================================
94
+ -- Base library
95
+ -- ============================================================
96
+
97
+ declare _G: { [string]: unknown }
98
+
99
+ declare function require(module: unknown): unknown
100
+ declare function tostring(value: unknown): string
101
+ declare function tonumber(value: unknown, base?: number): number | nil
102
+ declare function print(...: unknown): ()
103
+ declare function warn(...: unknown): ()
104
+ -- `error` never returns, which is what lets
105
+ -- `if v == nil then error("...") end` narrow the rest of the block.
106
+ declare function error(message: unknown, level?: number): never
107
+
108
+ -- `asserts value` — narrows the *rest of the enclosing block*, the way
109
+ -- TypeScript's assertion signatures do:
110
+ --
111
+ -- const part = workspace:FindFirstChild("Part") -- Instance | nil
112
+ -- assert(part)
113
+ -- part.Name -- Instance, no `?`
114
+
115
+ declare function assert<T>(value: T, message?: string): asserts value
116
+
117
+ declare function pcall<T>(fn: (...unknown) -> T, ...: unknown): (boolean, T)
118
+ declare function xpcall<T>(fn: (...unknown) -> T, handler: (err: unknown) -> unknown, ...: unknown): (boolean, T)
119
+ declare function select(n: unknown, ...: unknown): unknown
120
+ declare function unpack<V>(list: V[], i?: number, j?: number): ...V
121
+ declare function rawget(t: unknown, key: unknown): unknown
122
+ declare function rawset<T>(t: T, key: unknown, value: unknown): T
123
+ declare function rawequal(a: unknown, b: unknown): boolean
124
+ declare function rawlen(t: unknown): number
125
+ declare function setmetatable<T>(t: T, mt: unknown): T
126
+ declare function getmetatable(t: unknown): unknown
127
+ declare function newproxy(addMeta?: boolean): unknown
128
+ declare function next<K, V>(t: { [K]: V }, key?: K): (K, V)
129
+
130
+ declare string: {
131
+ format: (fmt: string, ...unknown) -> string,
132
+ sub: (s: string, i: number, j?: number) -> string,
133
+ len: (s: string) -> number,
134
+ upper: (s: string) -> string,
135
+ lower: (s: string) -> string,
136
+ rep: (s: string, n: number, sep?: string) -> string,
137
+ reverse: (s: string) -> string,
138
+ split: (s: string, separator?: string) -> string[],
139
+ find: (s: string, pattern: string, init?: number, plain?: boolean) -> (number | nil, number | nil),
140
+ match: (s: string, pattern: string, init?: number) -> ...unknown,
141
+ gmatch: (s: string, pattern: string) -> () -> ...string,
142
+ gsub: (s: string, pattern: string, repl: unknown, n?: number) -> (string, number),
143
+ byte: (s: string, i?: number, j?: number) -> ...number,
144
+ char: (...number) -> string,
145
+ }
146
+
147
+ declare math: {
148
+ floor: (x: number) -> number,
149
+ ceil: (x: number) -> number,
150
+ abs: (x: number) -> number,
151
+ sqrt: (x: number) -> number,
152
+ min: (...number) -> number,
153
+ max: (...number) -> number,
154
+ clamp: (x: number, min: number, max: number) -> number,
155
+ round: (x: number) -> number,
156
+ sign: (x: number) -> number,
157
+ random: (m?: number, n?: number) -> number,
158
+ pow: (x: number, y: number) -> number,
159
+ log: (x: number, base?: number) -> number,
160
+ sin: (x: number) -> number,
161
+ cos: (x: number) -> number,
162
+ tan: (x: number) -> number,
163
+ atan2: (y: number, x: number) -> number,
164
+ rad: (deg: number) -> number,
165
+ deg: (rad: number) -> number,
166
+ huge: number,
167
+ pi: number,
168
+ }
169
+
170
+ declare table: {
171
+ insert: (t: unknown[], a: unknown, b?: unknown) -> (),
172
+ remove: (t: unknown[], pos?: number) -> unknown,
173
+ concat: (t: unknown[], sep?: string, i?: number, j?: number) -> string,
174
+ find: (t: unknown[], value: unknown, init?: number) -> number | nil,
175
+ sort: (t: unknown[], comp?: unknown) -> (),
176
+ clear: (t: unknown) -> (),
177
+ clone: (t: unknown) -> unknown,
178
+ freeze: (t: unknown) -> unknown,
179
+ isfrozen: (t: unknown) -> boolean,
180
+ create: (count: number, value?: unknown) -> unknown[],
181
+ pack: (...unknown) -> { n: number, [number]: unknown },
182
+ unpack: (list: unknown[], i?: number, j?: number) -> ...unknown,
183
+ move: (src: unknown[], a: number, b: number, t: number, dst?: unknown[]) -> unknown[],
184
+ keys: (t: unknown) -> unknown[],
185
+ }
186
+
187
+ declare os: {
188
+ time: (t?: unknown) -> number,
189
+ clock: () -> number,
190
+ date: (format?: string, time?: number) -> unknown,
191
+ difftime: (a: number, b: number) -> number,
192
+ }
193
+
194
+ declare coroutine: {
195
+ create: (fn: (...unknown) -> ...unknown) -> thread,
196
+ resume: (co: thread, ...unknown) -> ...unknown,
197
+ yield: (...unknown) -> ...unknown,
198
+ wrap: (fn: (...unknown) -> ...unknown) -> (...unknown) -> ...unknown,
199
+ status: (co: thread) -> string,
200
+ running: () -> thread,
201
+ isyieldable: () -> boolean,
202
+ }
203
+
204
+ declare utf8: {
205
+ char: (...number) -> string,
206
+ codepoint: (s: string, i?: number, j?: number) -> ...number,
207
+ len: (s: string, i?: number, j?: number) -> number | nil,
208
+ offset: (s: string, n: number, i?: number) -> number | nil,
209
+ nfdnormalize: (s: string) -> string,
210
+ nfcnormalize: (s: string) -> string,
211
+ charpattern: string,
212
+ }
213
+
214
+ declare bit32: {
215
+ band: (...number) -> number,
216
+ bor: (...number) -> number,
217
+ bxor: (...number) -> number,
218
+ bnot: (x: number) -> number,
219
+ lshift: (x: number, disp: number) -> number,
220
+ rshift: (x: number, disp: number) -> number,
221
+ arshift: (x: number, disp: number) -> number,
222
+ extract: (n: number, field: number, width?: number) -> number,
223
+ replace: (n: number, v: number, field: number, width?: number) -> number,
224
+ countlz: (n: number) -> number,
225
+ countrz: (n: number) -> number,
226
+ }
227
+
228
+ declare buffer: {
229
+ create: (size: number) -> buffer,
230
+ fromstring: (s: string) -> buffer,
231
+ tostring: (b: buffer) -> string,
232
+ len: (b: buffer) -> number,
233
+ readi8: (b: buffer, offset: number) -> number,
234
+ readu8: (b: buffer, offset: number) -> number,
235
+ readi32: (b: buffer, offset: number) -> number,
236
+ readu32: (b: buffer, offset: number) -> number,
237
+ readf64: (b: buffer, offset: number) -> number,
238
+ writei8: (b: buffer, offset: number, value: number) -> (),
239
+ writeu8: (b: buffer, offset: number, value: number) -> (),
240
+ writei32: (b: buffer, offset: number, value: number) -> (),
241
+ writeu32: (b: buffer, offset: number, value: number) -> (),
242
+ writef64: (b: buffer, offset: number, value: number) -> (),
243
+ copy: (dst: buffer, dstOffset: number, src: buffer, srcOffset?: number, count?: number) -> (),
244
+ fill: (b: buffer, offset: number, value: number, count?: number) -> (),
245
+ }