v2 / vlib / builtin / js / jsfns.js.v
192 lines · 160 sloc · 4.17 KB · ee77475dc16ad986494b9d17a7f1adb381a767c8
Raw
1// Copyright (c) 2019-2024 Alexander Medvednikov. All rights reserved.
2// Use of this source code is governed by an MIT license
3// that can be found in the LICENSE file.
4
5// This file contains JS functions present in both node and the browser.
6// They have been ported from their TypeScript definitions.
7
8module builtin
9
10pub interface JS.Object {}
11
12@[single_impl]
13pub interface JS.BigInt {
14 JS.Any
15}
16
17@[single_impl]
18pub interface JS.Number {
19 JS.Any
20}
21
22pub interface JS.RegExp {
23 JS.Any
24}
25
26pub type SplitSeparator = JS.RegExp | JS.String
27
28@[single_impl]
29pub interface JS.String {
30 JS.Any
31 length JS.Number
32 charAt(index JS.Number) JS.String
33 charCodeAt(index JS.Number) JS.Number
34 toUpperCase() JS.String
35 toLowerCase() JS.String
36 concat(a JS.String) JS.String
37 includes(substr JS.String) JS.Boolean
38 endsWith(substr JS.String) JS.Boolean
39 startsWith(substr JS.String) JS.Boolean
40 slice(a JS.Number, b JS.Number) JS.String
41 split(delim SplitSeparator) JS.Array
42 indexOf(needle JS.String) JS.Number
43 lastIndexOf(needle JS.String) JS.Number
44}
45
46@[single_impl]
47pub interface JS.Boolean {
48 JS.Any
49 length JS.Number
50}
51
52pub interface JS.Map {
53 JS.Any
54 size JS.Number
55 clear()
56 delete(key JS.Any) JS.Boolean
57 get(key JS.Any) JS.Any
58 has(key JS.Any) JS.Any
59 set(key JS.Any, val JS.Any)
60}
61
62#function Any(val) { return val; }
63
64pub interface JS.Any {}
65
66pub fn js_is_null(x JS.Any) bool {
67 res := false
68 #res.val = x === null
69
70 return res
71}
72
73pub fn js_is_undefined(x JS.Any) bool {
74 res := false
75 #res.val = x === undefined
76
77 return res
78}
79
80pub fn js_null() JS.Any {
81 mut obj := JS.Any{}
82 #obj = null;
83
84 return obj
85}
86
87pub fn js_undefined() JS.Any {
88 mut obj := JS.Any{}
89 #obj = undefined;
90
91 return obj
92}
93
94pub interface JS.Array {
95 JS.Any // map(fn (JS.Any) JS.Any) JS.Array
96 map(JS.Any) JS.Array
97 push(JS.Any) JS.Any
98 pop() JS.Any
99 at(JS.Number) JS.Any
100mut:
101 length JS.Number
102}
103
104pub fn JS.Array.prototype.constructor(...any) JS.Array
105
106// browser: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Error
107// node: https://nodejs.org/api/errors.html#errors_class_error
108pub struct JS.Error {
109pub:
110 name string
111 message string
112 stack string
113}
114
115// Type prototype functions
116fn (v JS.String) toString() JS.String
117fn (v JS.Number) toString() JS.String
118fn (v JS.Boolean) toString() JS.String
119fn (v JS.Array) toString() JS.String
120fn (v JS.Map) toString() JS.String
121
122// Hack for "`[]JS.String` is not a struct" when returning arr.length or arr.len
123// TODO: Fix []JS.String not a struct error
124fn native_str_arr_len(arr []JS.String) int {
125 mut len := 0
126 #len = arr.length
127
128 return len
129}
130
131// Top level functions
132fn JS.eval(JS.String) JS.Any
133fn JS.parseInt(JS.String, f64) JS.Number
134fn JS.parseFloat(JS.String) JS.Number
135fn JS.isNaN(f64) bool
136fn JS.isFinite(f64) bool
137fn JS.decodeURI(JS.String) JS.String
138fn JS.decodeURIComponent(JS.String) JS.String
139fn JS.encodeURI(JS.String) JS.String
140
141type EncodeURIComponentArg = JS.String | bool | f64
142
143fn JS.encodeURIComponent(EncodeURIComponentArg) JS.String
144fn JS.escape(JS.String) JS.String
145fn JS.unescape(JS.String) JS.String
146
147// console
148fn JS.console.assert(bool, ...any)
149fn JS.console.clear()
150fn JS.console.count(JS.String)
151fn JS.console.countReset(JS.String)
152fn JS.console.debug(...any)
153fn JS.console.dir(any, any)
154fn JS.console.dirxml(...any)
155fn JS.console.error(...any)
156fn JS.console.exception(string, ...any)
157fn JS.console.group(...any)
158fn JS.console.groupCollapsed(...any)
159fn JS.console.groupEnd()
160fn JS.console.info(...any)
161fn JS.console.log(...any)
162fn JS.console.table(any, []string)
163fn JS.console.time(JS.String)
164fn JS.console.timeEnd(JS.String)
165fn JS.console.timeLog(string, ...any)
166fn JS.console.timeStamp(string)
167fn JS.console.trace(...any)
168fn JS.console.warn(...any)
169
170// Math
171fn JS.Math.abs(f64) f64
172fn JS.Math.acos(f64) f64
173fn JS.Math.asin(f64) f64
174fn JS.Math.atan(f64) f64
175fn JS.Math.atan2(f64, f64) f64
176fn JS.Math.ceil(f64) f64
177fn JS.Math.cos(f64) f64
178fn JS.Math.exp(f64) f64
179fn JS.Math.floor(f64) f64
180fn JS.Math.log(f64) f64
181fn JS.Math.max(...f64) f64
182fn JS.Math.min(...f64) f64
183fn JS.Math.pow(f64, f64) f64
184fn JS.Math.random() f64
185fn JS.Math.round(f64) f64
186fn JS.Math.sin(f64) f64
187fn JS.Math.sqrt(f64) f64
188fn JS.Math.tan(f64) f64
189
190// JSON
191fn JS.JSON.stringify(any) JS.String
192fn JS.JSON.parse(string) any
193