mirror of
https://github.com/DoneJS-Runtime/quickjs-done-nextgen.git
synced 2025-01-09 17:43:15 +00:00
New documentation website
This commit is contained in:
parent
946d653c58
commit
7cfedb0952
25 changed files with 15984 additions and 1033 deletions
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
@ -7,7 +7,7 @@ on:
|
||||||
- '!.gitignore'
|
- '!.gitignore'
|
||||||
- '!LICENSE'
|
- '!LICENSE'
|
||||||
- '!TODO'
|
- '!TODO'
|
||||||
- '!doc/**'
|
- '!docs/**'
|
||||||
- '!examples/**'
|
- '!examples/**'
|
||||||
- '.github/workflows/ci.yml'
|
- '.github/workflows/ci.yml'
|
||||||
push:
|
push:
|
||||||
|
|
49
.github/workflows/docs.yml
vendored
Normal file
49
.github/workflows/docs.yml
vendored
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
name: Docs
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths:
|
||||||
|
- 'docs/**'
|
||||||
|
- '.github/workflows/*docs.yml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build Docusaurus
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version-file: 'docs/.nvmrc'
|
||||||
|
- name: Install dependencies
|
||||||
|
working-directory: ./docs
|
||||||
|
run: npm install
|
||||||
|
- name: Build
|
||||||
|
working-directory: ./docs
|
||||||
|
run: npm run build
|
||||||
|
- name: Upload Build Artifact
|
||||||
|
uses: actions/upload-pages-artifact@v3
|
||||||
|
with:
|
||||||
|
path: docs/build
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
name: Deploy to GitHub Pages
|
||||||
|
needs: build
|
||||||
|
|
||||||
|
# Grant GITHUB_TOKEN the permissions required to make a Pages deployment
|
||||||
|
permissions:
|
||||||
|
pages: write # to deploy to Pages
|
||||||
|
id-token: write # to verify the deployment originates from an appropriate source
|
||||||
|
|
||||||
|
# Deploy to the github-pages environment
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Deploy to GitHub Pages
|
||||||
|
id: deployment
|
||||||
|
uses: actions/deploy-pages@v4
|
23
.github/workflows/test-docs.yml
vendored
Normal file
23
.github/workflows/test-docs.yml
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
name: Test Docs
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'docs/**'
|
||||||
|
- '.github/workflows/*docs.yml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-docs:
|
||||||
|
name: Test Docusaurus build
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version-file: 'docs/.nvmrc'
|
||||||
|
- name: Install dependencies
|
||||||
|
working-directory: ./docs
|
||||||
|
run: npm install
|
||||||
|
- name: Build
|
||||||
|
working-directory: ./docs
|
||||||
|
run: npm run build
|
1032
doc/quickjs.texi
1032
doc/quickjs.texi
File diff suppressed because it is too large
Load diff
20
docs/.gitignore
vendored
Normal file
20
docs/.gitignore
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# Dependencies
|
||||||
|
/node_modules
|
||||||
|
|
||||||
|
# Production
|
||||||
|
/build
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
.docusaurus
|
||||||
|
.cache-loader
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
.DS_Store
|
||||||
|
.env.local
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
1
docs/.nvmrc
Normal file
1
docs/.nvmrc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
18
|
3
docs/babel.config.js
Normal file
3
docs/babel.config.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
module.exports = {
|
||||||
|
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
|
||||||
|
};
|
46
docs/docs/building.md
Normal file
46
docs/docs/building.md
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
---
|
||||||
|
sidebar_position: 2
|
||||||
|
---
|
||||||
|
|
||||||
|
# Building
|
||||||
|
|
||||||
|
QuickJS uses [CMake] as its main build system, with an additional helper [Makefile].
|
||||||
|
|
||||||
|
:::note
|
||||||
|
Windows users will need to run the CMake commands manually.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Compiling everything
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make
|
||||||
|
```
|
||||||
|
|
||||||
|
This will build the `qjs` and `qjsc` executables and other test tools. Head over [here](./cli) for
|
||||||
|
instructions on how to use them.
|
||||||
|
|
||||||
|
## Debug builds
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make debug
|
||||||
|
```
|
||||||
|
|
||||||
|
This will produce a debug build without optimizations, suitable for developers.
|
||||||
|
|
||||||
|
## Running test262
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make test262
|
||||||
|
```
|
||||||
|
|
||||||
|
This will run the test262 suite.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make test262-update
|
||||||
|
```
|
||||||
|
|
||||||
|
This will run the test262 suite and update the error / pass report, useful after
|
||||||
|
implementing a new feature that would alter the result of the test suite.
|
||||||
|
|
||||||
|
[CMake]: https://cmake.org
|
||||||
|
[Makefile]: https://www.gnu.org/software/make/
|
77
docs/docs/cli.md
Normal file
77
docs/docs/cli.md
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
---
|
||||||
|
sidebar_position: 4
|
||||||
|
---
|
||||||
|
|
||||||
|
# The qjs and qjsc CLI tools
|
||||||
|
|
||||||
|
## `qjs` - The QuickJS JavaScript interpreter
|
||||||
|
|
||||||
|
The `qjs` executable runs the JavaScript interpreter. It includes a simple standard
|
||||||
|
library and REPL.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qjs
|
||||||
|
usage: qjs [options] [file [args]]
|
||||||
|
-h --help list options
|
||||||
|
-e --eval EXPR evaluate EXPR
|
||||||
|
-i --interactive go to interactive mode
|
||||||
|
-m --module load as ES6 module (default=autodetect)
|
||||||
|
--script load as ES6 script (default=autodetect)
|
||||||
|
-I --include file include an additional file
|
||||||
|
--std make 'std' and 'os' available to the loaded script
|
||||||
|
-T --trace trace memory allocation
|
||||||
|
-d --dump dump the memory usage stats
|
||||||
|
-D --dump-flags flags for dumping debug data (see DUMP_* defines)
|
||||||
|
--memory-limit n limit the memory usage to 'n' Kbytes
|
||||||
|
--stack-size n limit the stack size to 'n' Kbytes
|
||||||
|
--unhandled-rejection dump unhandled promise rejections
|
||||||
|
-q --quit just instantiate the interpreter and quit
|
||||||
|
```
|
||||||
|
|
||||||
|
The following dump flags are supported:
|
||||||
|
|
||||||
|
```
|
||||||
|
DUMP_BYTECODE_FINAL 0x01 /* dump pass 3 final byte code */
|
||||||
|
DUMP_BYTECODE_PASS2 0x02 /* dump pass 2 code */
|
||||||
|
DUMP_BYTECODE_PASS1 0x04 /* dump pass 1 code */
|
||||||
|
DUMP_BYTECODE_HEX 0x10 /* dump bytecode in hex */
|
||||||
|
DUMP_BYTECODE_PC2LINE 0x20 /* dump line number table */
|
||||||
|
DUMP_BYTECODE_STACK 0x40 /* dump compute_stack_size */
|
||||||
|
DUMP_BYTECODE_STEP 0x80 /* dump executed bytecode */
|
||||||
|
DUMP_READ_OBJECT 0x100 /* dump the marshalled objects at load time */
|
||||||
|
DUMP_FREE 0x200 /* dump every object free */
|
||||||
|
DUMP_GC 0x400 /* dump the occurrence of the automatic GC */
|
||||||
|
DUMP_GC_FREE 0x800 /* dump objects freed by the GC */
|
||||||
|
DUMP_MODULE_RESOLVE 0x1000 /* dump module resolution steps */
|
||||||
|
DUMP_PROMISE 0x2000 /* dump promise steps */
|
||||||
|
DUMP_LEAKS 0x4000 /* dump leaked objects and strings in JS_FreeRuntime */
|
||||||
|
DUMP_ATOM_LEAKS 0x8000 /* dump leaked atoms in JS_FreeRuntime */
|
||||||
|
DUMP_MEM 0x10000 /* dump memory usage in JS_FreeRuntime */
|
||||||
|
DUMP_OBJECTS 0x20000 /* dump objects in JS_FreeRuntime */
|
||||||
|
DUMP_ATOMS 0x40000 /* dump atoms in JS_FreeRuntime */
|
||||||
|
DUMP_SHAPES 0x80000 /* dump shapes in JS_FreeRuntime */
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qjsc` - The QuickJS JavaScript compiler
|
||||||
|
|
||||||
|
The `qjsc` executable runs the JavaScript compiler, it can generate bytecode from
|
||||||
|
source files which can then be embedded in an executable, or it can generate the necessary
|
||||||
|
scaffolding to build a C application which embeds QuickJS.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qjsc
|
||||||
|
usage: qjsc [options] [files]
|
||||||
|
|
||||||
|
options are:
|
||||||
|
-b output raw bytecode instead of C code
|
||||||
|
-e output main() and bytecode in a C file
|
||||||
|
-o output set the output filename
|
||||||
|
-n script_name set the script name (as used in stack traces)
|
||||||
|
-N cname set the C name of the generated data
|
||||||
|
-m compile as JavaScript module (default=autodetect)
|
||||||
|
-D module_name compile a dynamically loaded module or worker
|
||||||
|
-M module_name[,cname] add initialization code for an external C module
|
||||||
|
-p prefix set the prefix of the generated C names
|
||||||
|
-s strip the source code, specify twice to also strip debug info
|
||||||
|
-S n set the maximum stack size to 'n' bytes (default=262144)
|
||||||
|
```
|
7
docs/docs/developer-guide/_category_.json
Normal file
7
docs/docs/developer-guide/_category_.json
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"label": "Developer Guide",
|
||||||
|
"position": 6,
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index"
|
||||||
|
}
|
||||||
|
}
|
3
docs/docs/developer-guide/api.md
Normal file
3
docs/docs/developer-guide/api.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# API Reference
|
||||||
|
|
||||||
|
WIP.
|
117
docs/docs/developer-guide/internals.md
Normal file
117
docs/docs/developer-guide/internals.md
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
# Internals
|
||||||
|
|
||||||
|
## Bytecode
|
||||||
|
|
||||||
|
The compiler generates bytecode directly with no intermediate
|
||||||
|
representation such as a parse tree, hence it is very fast. Several
|
||||||
|
optimizations passes are done over the generated bytecode.
|
||||||
|
|
||||||
|
A stack-based bytecode was chosen because it is simple and generates
|
||||||
|
compact code.
|
||||||
|
|
||||||
|
For each function, the maximum stack size is computed at compile time so that
|
||||||
|
no runtime stack overflow tests are needed.
|
||||||
|
|
||||||
|
A separate compressed line number table is maintained for the debug
|
||||||
|
information.
|
||||||
|
|
||||||
|
Access to closure variables is optimized and is almost as fast as local
|
||||||
|
variables.
|
||||||
|
|
||||||
|
Direct `eval` in strict mode is optimized.
|
||||||
|
|
||||||
|
## Runtime
|
||||||
|
|
||||||
|
### Strings
|
||||||
|
|
||||||
|
Strings are stored either as an 8 bit or a 16 bit array of
|
||||||
|
characters. Hence random access to characters is always fast.
|
||||||
|
|
||||||
|
The C API provides functions to convert JavaScript Strings to C UTF-8 encoded
|
||||||
|
strings. The most common case where the JavaScript string contains
|
||||||
|
only ASCII characters involves no copying.
|
||||||
|
|
||||||
|
### Objects
|
||||||
|
|
||||||
|
The object shapes (object prototype, property names and flags) are shared
|
||||||
|
between objects to save memory.
|
||||||
|
|
||||||
|
Arrays with no holes (except at the end of the array) are optimized.
|
||||||
|
|
||||||
|
TypedArray accesses are optimized.
|
||||||
|
|
||||||
|
### Atoms
|
||||||
|
|
||||||
|
Object property names and some strings are stored as Atoms (unique
|
||||||
|
strings) to save memory and allow fast comparison. Atoms are
|
||||||
|
represented as a 32 bit integer. Half of the atom range is reserved for
|
||||||
|
immediate integer literals from 0 to 2^31-1.
|
||||||
|
|
||||||
|
### Numbers
|
||||||
|
|
||||||
|
Numbers are represented either as 32-bit signed integers or 64-bit IEEE-754
|
||||||
|
floating point values. Most operations have fast paths for the 32-bit
|
||||||
|
integer case.
|
||||||
|
|
||||||
|
### Garbage collection
|
||||||
|
|
||||||
|
Reference counting is used to free objects automatically and
|
||||||
|
deterministically. A separate cycle removal pass is done when the allocated
|
||||||
|
memory becomes too large. The cycle removal algorithm only uses the
|
||||||
|
reference counts and the object content, so no explicit garbage
|
||||||
|
collection roots need to be manipulated in the C code.
|
||||||
|
|
||||||
|
### JSValue
|
||||||
|
|
||||||
|
It is a JavaScript value which can be a primitive type (such as
|
||||||
|
Number, String, ...) or an Object. NaN boxing is used in the 32-bit version
|
||||||
|
to store 64-bit floating point numbers. The representation is
|
||||||
|
optimized so that 32-bit integers and reference counted values can be
|
||||||
|
efficiently tested.
|
||||||
|
|
||||||
|
In 64-bit code, JSValue are 128-bit large and no NaN boxing is used. The
|
||||||
|
rationale is that in 64-bit code memory usage is less critical.
|
||||||
|
|
||||||
|
In both cases (32 or 64 bits), JSValue exactly fits two CPU registers,
|
||||||
|
so it can be efficiently returned by C functions.
|
||||||
|
|
||||||
|
### Function call
|
||||||
|
|
||||||
|
The engine is optimized so that function calls are fast. The system
|
||||||
|
stack holds the JavaScript parameters and local variables.
|
||||||
|
|
||||||
|
### RegExp
|
||||||
|
|
||||||
|
A specific regular expression engine was developed. It is both small
|
||||||
|
and efficient and supports all the ES2020+ features including the
|
||||||
|
Unicode properties. As the JavaScript compiler, it directly generates
|
||||||
|
bytecode without a parse tree.
|
||||||
|
|
||||||
|
Backtracking with an explicit stack is used so that there is no
|
||||||
|
recursion on the system stack. Simple quantifiers are specifically
|
||||||
|
optimized to avoid recursions.
|
||||||
|
|
||||||
|
Infinite recursions coming from quantifiers with empty terms are
|
||||||
|
avoided.
|
||||||
|
|
||||||
|
The full regexp library weighs about 15 KiB (x86 code), excluding the
|
||||||
|
Unicode library.
|
||||||
|
|
||||||
|
### Unicode
|
||||||
|
|
||||||
|
A specific Unicode library was developed so that there is no
|
||||||
|
dependency on an external large Unicode library such as ICU. All the
|
||||||
|
Unicode tables are compressed while keeping a reasonable access
|
||||||
|
speed.
|
||||||
|
|
||||||
|
The library supports case conversion, Unicode normalization, Unicode
|
||||||
|
script queries, Unicode general category queries and all Unicode
|
||||||
|
binary properties.
|
||||||
|
|
||||||
|
The full Unicode library weighs about 45 KiB (x86 code).
|
||||||
|
|
||||||
|
### BigInt
|
||||||
|
|
||||||
|
BigInt is implemented with the [libbf](https://bellard.org/libbf) library.
|
||||||
|
It weights about 90 KiB (x86 code) and provides arbitrary precision IEEE 754 floating
|
||||||
|
point operations and transcendental functions with exact rounding.
|
113
docs/docs/developer-guide/intro.md
Normal file
113
docs/docs/developer-guide/intro.md
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
---
|
||||||
|
sidebar_position: 1
|
||||||
|
---
|
||||||
|
|
||||||
|
# The QuickJS C API
|
||||||
|
|
||||||
|
The C API was designed to be simple and efficient. The C API is
|
||||||
|
defined in the header `quickjs.h`.
|
||||||
|
|
||||||
|
## Runtime and contexts
|
||||||
|
|
||||||
|
`JSRuntime` represents a JavaScript runtime corresponding to an
|
||||||
|
object heap. Several runtimes can exist at the same time but they
|
||||||
|
cannot exchange objects. Inside a given runtime, no multi-threading is
|
||||||
|
supported.
|
||||||
|
|
||||||
|
`JSContext` represents a JavaScript context (or Realm). Each
|
||||||
|
JSContext has its own global objects and system objects. There can be
|
||||||
|
several JSContexts per JSRuntime and they can share objects, similar
|
||||||
|
to frames of the same origin sharing JavaScript objects in a
|
||||||
|
web browser.
|
||||||
|
|
||||||
|
## JSValue
|
||||||
|
|
||||||
|
`JSValue` represents a JavaScript value which can be a primitive
|
||||||
|
type or an object. Reference counting is used, so it is important to
|
||||||
|
explicitly duplicate (`JS_DupValue()`, increment the reference
|
||||||
|
count) or free (`JS_FreeValue()`, decrement the reference count)
|
||||||
|
JSValues.
|
||||||
|
|
||||||
|
## C functions
|
||||||
|
|
||||||
|
C functions can be created with
|
||||||
|
`JS_NewCFunction()`. `JS_SetPropertyFunctionList()` is a
|
||||||
|
shortcut to easily add functions, setters and getters properties to a
|
||||||
|
given object.
|
||||||
|
|
||||||
|
Unlike other embedded JavaScript engines, there is no implicit stack,
|
||||||
|
so C functions get their parameters as normal C parameters. As a
|
||||||
|
general rule, C functions take constant `JSValue`s as parameters
|
||||||
|
(so they don't need to free them) and return a newly allocated (=live)
|
||||||
|
`JSValue`.
|
||||||
|
|
||||||
|
## Exceptions
|
||||||
|
|
||||||
|
Most C functions can return a JavaScript exception. It
|
||||||
|
must be explicitly tested and handled by the C code. The specific
|
||||||
|
`JSValue` `JS_EXCEPTION` indicates that an exception
|
||||||
|
occurred. The actual exception object is stored in the
|
||||||
|
`JSContext` and can be retrieved with `JS_GetException()`.
|
||||||
|
|
||||||
|
## Script evaluation
|
||||||
|
|
||||||
|
Use `JS_Eval()` to evaluate a script or module source.
|
||||||
|
|
||||||
|
If the script or module was compiled to bytecode with `qjsc`, it
|
||||||
|
can be evaluated by calling `js_std_eval_binary()`. The advantage
|
||||||
|
is that no compilation is needed so it is faster and smaller because
|
||||||
|
the compiler can be removed from the executable if no `eval` is
|
||||||
|
required.
|
||||||
|
|
||||||
|
Note: the bytecode format is linked to a given QuickJS
|
||||||
|
version. Moreover, no security check is done before its
|
||||||
|
execution. Hence the bytecode should not be loaded from untrusted
|
||||||
|
sources.
|
||||||
|
|
||||||
|
## JS Classes
|
||||||
|
|
||||||
|
C opaque data can be attached to a JavaScript object. The type of the
|
||||||
|
C opaque data is determined with the class ID (`JSClassID`) of
|
||||||
|
the object. Hence the first step is to register a new class ID and JS
|
||||||
|
class (`JS_NewClassID()`, `JS_NewClass()`). Then you can
|
||||||
|
create objects of this class with `JS_NewObjectClass()` and get or
|
||||||
|
set the C opaque point with `JS_GetOpaque()` / `JS_SetOpaque()`.
|
||||||
|
|
||||||
|
When defining a new JS class, it is possible to declare a finalizer
|
||||||
|
which is called when the object is destroyed. The finalizer should be
|
||||||
|
used to release C resources. It is invalid to execute JS code from
|
||||||
|
it. A `gc_mark` method can be provided so that the cycle removal
|
||||||
|
algorithm can find the other objects referenced by this object. Other
|
||||||
|
methods are available to define exotic object behaviors.
|
||||||
|
|
||||||
|
The Class ID are allocated per-runtime. The
|
||||||
|
`JSClass` are allocated per `JSRuntime`. `JS_SetClassProto()`
|
||||||
|
is used to define a prototype for a given class in a given
|
||||||
|
`JSContext`. `JS_NewObjectClass()` sets this prototype in the
|
||||||
|
created object.
|
||||||
|
|
||||||
|
Examples are available in `quickjs-libc.c`.
|
||||||
|
|
||||||
|
## C Modules
|
||||||
|
|
||||||
|
Native ES6 modules are supported and can be dynamically or statically
|
||||||
|
linked. The standard library `quickjs-libc.c` is a good example
|
||||||
|
of a native module.
|
||||||
|
|
||||||
|
## Memory handling
|
||||||
|
|
||||||
|
Use `JS_SetMemoryLimit()` to set a global memory allocation limit
|
||||||
|
to a given `JSRuntime`.
|
||||||
|
|
||||||
|
Custom memory allocation functions can be provided with `JS_NewRuntime2()`.
|
||||||
|
|
||||||
|
The maximum system stack size can be set with `JS_SetMaxStackSize()`.
|
||||||
|
|
||||||
|
## Execution timeout and interrupts
|
||||||
|
|
||||||
|
Use `JS_SetInterruptHandler()` to set a callback which is
|
||||||
|
regularly called by the engine when it is executing code. This
|
||||||
|
callback can be used to implement an execution timeout.
|
||||||
|
|
||||||
|
It is used by the command line interpreter to implement a
|
||||||
|
`Ctrl-C` handler.
|
11
docs/docs/es_features.md
Normal file
11
docs/docs/es_features.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
sidebar_position: 7
|
||||||
|
---
|
||||||
|
|
||||||
|
# ECMAScript Features
|
||||||
|
|
||||||
|
QuickJS aims to support the latest available ECMAScript features once they hit the spec.
|
||||||
|
|
||||||
|
Progress on _test262_ compliance can be checked [here](https://test262.fyi/#|qjs_ng).
|
||||||
|
|
||||||
|
Due to size constraints it is unlikely QuickJS will ever support the [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl) APIs.
|
34
docs/docs/installation.md
Normal file
34
docs/docs/installation.md
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
---
|
||||||
|
sidebar_position: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
|
||||||
|
Installing QuickJS is simple, and we provide several ways to do so.
|
||||||
|
|
||||||
|
|
||||||
|
## Build from source
|
||||||
|
|
||||||
|
If you built it from source as outlined in [building](./building) you can just run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make install
|
||||||
|
```
|
||||||
|
|
||||||
|
and it will be installed in your system. The default installation path is `/usr/local`.
|
||||||
|
|
||||||
|
|
||||||
|
## Using a prebuilt binary
|
||||||
|
|
||||||
|
Each [release on GitHub] includes binaries for several systems and architectures.
|
||||||
|
|
||||||
|
|
||||||
|
## Using jsvu
|
||||||
|
|
||||||
|
As of version 2.2.0 of `jsvu`, QuickJS-ng will be installed when the `quickjs` engine is requested.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install jsvu -g
|
||||||
|
```
|
||||||
|
|
||||||
|
[release on GitHub]: https://github.com/quickjs-ng/quickjs/releases
|
48
docs/docs/intro.md
Normal file
48
docs/docs/intro.md
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
---
|
||||||
|
slug: /
|
||||||
|
sidebar_position: 1
|
||||||
|
sidebar_label: Welcome
|
||||||
|
---
|
||||||
|
|
||||||
|
# Welcome to QuickJS-NG
|
||||||
|
|
||||||
|
QuickJS is a small and embeddable JavaScript engine. It aims to support the latest
|
||||||
|
[ECMAScript] specification.
|
||||||
|
|
||||||
|
This project is a _fork_ of the [original QuickJS project] by Fabrice Bellard, after it went
|
||||||
|
dormant for several years, with the intent of reigniting its development.
|
||||||
|
|
||||||
|
In October 2023 [@bnoordhuis] and [@saghul] decided to fork the original project with
|
||||||
|
the aim of reigniting it. They reached out to the original authors ([@bellard] and [@chqrlie])
|
||||||
|
about their intentions.
|
||||||
|
|
||||||
|
As of December 2023 the initial goal was somewhat accomplished. [@bellard] resumed working on
|
||||||
|
the project and both parties have been pulling patches from each other since.
|
||||||
|
|
||||||
|
As of early 2024 both projects agree the proper path forward involves merging both projects
|
||||||
|
and combining the efforts. While that may take a while, since both projects diverged in certain
|
||||||
|
areas, there is willingness to go in this direction from both sides.
|
||||||
|
|
||||||
|
This fork is focused on (but not limited to):
|
||||||
|
|
||||||
|
- Community development
|
||||||
|
- Testing
|
||||||
|
- Cross-platform support
|
||||||
|
- ES features
|
||||||
|
|
||||||
|
:::note
|
||||||
|
|
||||||
|
This site is under construction, the entire API is not yet documented.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
Head over to [building](./building) if you want to build QuickJS from source or [installation](./installation)
|
||||||
|
for installing it from prebuilt binaries.
|
||||||
|
|
||||||
|
[ECMAScript]: https://tc39.es/ecma262/
|
||||||
|
[original QuickJS project]: https://bellard.org/quickjs
|
||||||
|
[@bellard]: https://github.com/bellard
|
||||||
|
[@bnoordhuis]: https://github.com/bnoordhuis
|
||||||
|
[@chqrlie]: https://github.com/chqrlie
|
||||||
|
[@saghul]: https://github.com/saghul
|
551
docs/docs/stdlib.md
Normal file
551
docs/docs/stdlib.md
Normal file
|
@ -0,0 +1,551 @@
|
||||||
|
---
|
||||||
|
sidebar_position: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
# Standard library
|
||||||
|
|
||||||
|
The standard libary is provided as part of the `qjs` executable and the `quickjs-libc.c` source file
|
||||||
|
and it's not part of the core engine.
|
||||||
|
|
||||||
|
## Globals
|
||||||
|
|
||||||
|
### `argv0`
|
||||||
|
|
||||||
|
Provides the executable path.
|
||||||
|
|
||||||
|
### `scriptArgs`
|
||||||
|
|
||||||
|
Provides the command line arguments. The first argument is the script name.
|
||||||
|
|
||||||
|
### `print(...args)`
|
||||||
|
|
||||||
|
Print the arguments separated by spaces and a trailing newline.
|
||||||
|
|
||||||
|
### `console.log(...args)`
|
||||||
|
|
||||||
|
Same as `print()`.
|
||||||
|
|
||||||
|
### `navigator.userAgent`
|
||||||
|
|
||||||
|
Returns `quickjs-ng/<version>`.
|
||||||
|
|
||||||
|
### `gc()`
|
||||||
|
|
||||||
|
Shorthand for `std.gc()`.
|
||||||
|
|
||||||
|
## `bjson` module
|
||||||
|
|
||||||
|
### `bjson.write(obj, [flags])`
|
||||||
|
|
||||||
|
Serializes the given object into the QuickJS internal serialization format.
|
||||||
|
Returns an ArrayBuffer with the serialized data.
|
||||||
|
|
||||||
|
Supported flags:
|
||||||
|
|
||||||
|
- `WRITE_OBJ_BYTECODE`: allow serializing functions and modules
|
||||||
|
- `WRITE_OBJ_REFERENCE`: allow serializing object references
|
||||||
|
- `WRITE_OBJ_SAB`: allow serializing SharedArrayBuffer instances
|
||||||
|
- `WRITE_OBJ_STRIP_DEBUG`: strip debugging information when serializing
|
||||||
|
- `WRITE_OBJ_STRIP_SOURCE`: strip the source information when serializing
|
||||||
|
|
||||||
|
### `bjson.read(buf, [pos], [len], [flags])`
|
||||||
|
|
||||||
|
De-serialize the given ArrayBuffer (in QuickJS internal serialization format) back into a JavaScript value.
|
||||||
|
|
||||||
|
Supported flags:
|
||||||
|
|
||||||
|
- `READ_OBJ_BYTECODE`: allow de-serializing functions and modules
|
||||||
|
- `READ_OBJ_REFERENCE`: allow de-serializing object references
|
||||||
|
- `READ_OBJ_SAB`: allow de-serializing SharedArrayBuffer instances
|
||||||
|
|
||||||
|
## `os` module
|
||||||
|
|
||||||
|
The `os` module provides Operating System specific functions:
|
||||||
|
|
||||||
|
- low level file access
|
||||||
|
- signals
|
||||||
|
- timers
|
||||||
|
- basic asynchronous I/O
|
||||||
|
- workers (threads)
|
||||||
|
|
||||||
|
The OS functions usually return 0 if OK or an OS specific negative
|
||||||
|
error code.
|
||||||
|
|
||||||
|
### `open(filename, flags, mode = 0o666)`
|
||||||
|
|
||||||
|
Open a file. Return a handle or < 0 if error.
|
||||||
|
|
||||||
|
Supported flags:
|
||||||
|
|
||||||
|
- `O_RDONLY`
|
||||||
|
- `O_WRONLY`
|
||||||
|
- `O_RDWR`
|
||||||
|
- `O_APPEND`
|
||||||
|
- `O_CREAT`
|
||||||
|
- `O_EXCL`
|
||||||
|
- `O_TRUNC`
|
||||||
|
|
||||||
|
POSIX open flags.
|
||||||
|
|
||||||
|
- `O_TEXT`
|
||||||
|
|
||||||
|
(Windows specific). Open the file in text mode. The default is binary mode.
|
||||||
|
|
||||||
|
### `close(fd)`
|
||||||
|
|
||||||
|
Close the file handle `fd`.
|
||||||
|
|
||||||
|
### `seek(fd, offset, whence)`
|
||||||
|
|
||||||
|
Seek in the file. Use `std.SEEK_*` for
|
||||||
|
`whence`. `offset` is either a number or a BigInt. If
|
||||||
|
`offset` is a BigInt, a BigInt is returned too.
|
||||||
|
|
||||||
|
### `read(fd, buffer, offset, length)`
|
||||||
|
|
||||||
|
Read `length` bytes from the file handle `fd` to the
|
||||||
|
ArrayBuffer `buffer` at byte position `offset`.
|
||||||
|
Return the number of read bytes or < 0 if error.
|
||||||
|
|
||||||
|
### `write(fd, buffer, offset, length)`
|
||||||
|
|
||||||
|
Write `length` bytes to the file handle `fd` from the
|
||||||
|
ArrayBuffer `buffer` at byte position `offset`.
|
||||||
|
Return the number of written bytes or < 0 if error.
|
||||||
|
|
||||||
|
### `isatty(fd)`
|
||||||
|
|
||||||
|
Return `true` is `fd` is a TTY (terminal) handle.
|
||||||
|
|
||||||
|
### `ttyGetWinSize(fd)`
|
||||||
|
|
||||||
|
Return the TTY size as `[width, height]` or `null` if not available.
|
||||||
|
|
||||||
|
### `ttySetRaw(fd)`
|
||||||
|
|
||||||
|
Set the TTY in raw mode.
|
||||||
|
|
||||||
|
### `remove(filename)`
|
||||||
|
|
||||||
|
Remove a file. Return 0 if OK or `-errno`.
|
||||||
|
|
||||||
|
### `rename(oldname, newname)`
|
||||||
|
|
||||||
|
Rename a file. Return 0 if OK or `-errno`.
|
||||||
|
|
||||||
|
### `realpath(path)`
|
||||||
|
|
||||||
|
Return `[str, err]` where `str` is the canonicalized absolute
|
||||||
|
pathname of `path` and `err` the error code.
|
||||||
|
|
||||||
|
### `getcwd()`
|
||||||
|
|
||||||
|
Return `[str, err]` where `str` is the current working directory
|
||||||
|
and `err` the error code.
|
||||||
|
|
||||||
|
### `chdir(path)`
|
||||||
|
|
||||||
|
Change the current directory. Return 0 if OK or `-errno`.
|
||||||
|
|
||||||
|
### `mkdir(path, mode = 0o777)`
|
||||||
|
|
||||||
|
Create a directory at `path`. Return 0 if OK or `-errno`.
|
||||||
|
|
||||||
|
### `stat(path)` / `lstat(path)`
|
||||||
|
|
||||||
|
Return `[obj, err]` where `obj` is an object containing the
|
||||||
|
file status of `path`. `err` is the error code. The
|
||||||
|
following fields are defined in `obj`: `dev`, `ino`, `mode`, `nlink`,
|
||||||
|
`uid`, `gid`, `rdev`, `size`, `blocks`, `atime`, `mtime`, `ctime`. The times are
|
||||||
|
specified in milliseconds since 1970. `lstat()` is the same as
|
||||||
|
`stat()` excepts that it returns information about the link
|
||||||
|
itself.
|
||||||
|
|
||||||
|
- `S_IFMT`
|
||||||
|
- `S_IFIFO`
|
||||||
|
- `S_IFCHR`
|
||||||
|
- `S_IFDIR`
|
||||||
|
- `S_IFBLK`
|
||||||
|
- `S_IFREG`
|
||||||
|
- `S_IFSOCK`
|
||||||
|
- `S_IFLNK`
|
||||||
|
- `S_ISGID`
|
||||||
|
- `S_ISUID`
|
||||||
|
|
||||||
|
Constants to interpret the `mode` property returned by
|
||||||
|
`stat()`. They have the same value as in the C system header
|
||||||
|
`sys/stat.h`.
|
||||||
|
|
||||||
|
### `utimes(path, atime, mtime)`
|
||||||
|
|
||||||
|
Change the access and modification times of the file `path`. The
|
||||||
|
times are specified in milliseconds since 1970. Return 0 if OK or `-errno`.
|
||||||
|
|
||||||
|
### `symlink(target, linkpath)`
|
||||||
|
|
||||||
|
Create a link at `linkpath` containing the string `target`. Return 0 if OK or `-errno`.
|
||||||
|
|
||||||
|
### `readlink(path)`
|
||||||
|
|
||||||
|
Return `[str, err]` where `str` is the link target and `err`
|
||||||
|
the error code.
|
||||||
|
|
||||||
|
### `readdir(path)`
|
||||||
|
|
||||||
|
Return `[array, err]` where `array` is an array of strings
|
||||||
|
containing the filenames of the directory `path`. `err` is
|
||||||
|
the error code.
|
||||||
|
|
||||||
|
### `setReadHandler(fd, func)`
|
||||||
|
|
||||||
|
Add a read handler to the file handle `fd`. `func` is called
|
||||||
|
each time there is data pending for `fd`. A single read handler
|
||||||
|
per file handle is supported. Use `func = null` to remove the
|
||||||
|
handler.
|
||||||
|
|
||||||
|
### `setWriteHandler(fd, func)`
|
||||||
|
|
||||||
|
Add a write handler to the file handle `fd`. `func` is
|
||||||
|
called each time data can be written to `fd`. A single write
|
||||||
|
handler per file handle is supported. Use `func = null` to remove
|
||||||
|
the handler.
|
||||||
|
|
||||||
|
### `signal(signal, func)`
|
||||||
|
|
||||||
|
Call the function `func` when the signal `signal`
|
||||||
|
happens. Only a single handler per signal number is supported. Use
|
||||||
|
`null` to set the default handler or `undefined` to ignore
|
||||||
|
the signal. Signal handlers can only be defined in the main thread.
|
||||||
|
|
||||||
|
- `SIGINT`
|
||||||
|
- `SIGABRT`
|
||||||
|
- `SIGFPE`
|
||||||
|
- `SIGILL`
|
||||||
|
- `SIGSEGV`
|
||||||
|
- `SIGTERM`
|
||||||
|
|
||||||
|
POSIX signal numbers.
|
||||||
|
|
||||||
|
### `kill(pid, sig)`
|
||||||
|
|
||||||
|
Send the signal `sig` to the process `pid`.
|
||||||
|
|
||||||
|
### `exec(args[, options])`
|
||||||
|
|
||||||
|
Execute a process with the arguments `args`. `options` is an
|
||||||
|
object containing optional parameters:
|
||||||
|
|
||||||
|
- `block` - Boolean (default = true). If true, wait until the process is
|
||||||
|
terminated. In this case, `exec` return the exit code if positive
|
||||||
|
or the negated signal number if the process was interrupted by a
|
||||||
|
signal. If false, do not block and return the process id of the child.
|
||||||
|
- `usePath` - Boolean (default = true). If true, the file is searched in the
|
||||||
|
`PATH` environment variable.
|
||||||
|
- `file` - String (default = `args[0]`). Set the file to be executed.
|
||||||
|
- `cwd` - String. If present, set the working directory of the new process.
|
||||||
|
- `stdin`, `stdout`, `stderr` - If present, set the handle in the child for stdin, stdout or stderr.
|
||||||
|
- `env` - Object. If present, set the process environment from the object
|
||||||
|
key-value pairs. Otherwise use the same environment as the current
|
||||||
|
process.
|
||||||
|
- `uid` - Integer. If present, the process uid with `setuid`.
|
||||||
|
- `gid` - Integer. If present, the process gid with `setgid`.
|
||||||
|
|
||||||
|
### `waitpid(pid, options)`
|
||||||
|
|
||||||
|
`waitpid` Unix system call. Return the array `[ret, status]`.
|
||||||
|
`ret` contains `-errno` in case of error.
|
||||||
|
|
||||||
|
- `WNOHANG`
|
||||||
|
|
||||||
|
Constant for the `options` argument of `waitpid`.
|
||||||
|
|
||||||
|
### `dup(fd)`
|
||||||
|
|
||||||
|
`dup` Unix system call.
|
||||||
|
|
||||||
|
### `dup2(oldfd, newfd)`
|
||||||
|
|
||||||
|
`dup2` Unix system call.
|
||||||
|
|
||||||
|
### `pipe()`
|
||||||
|
|
||||||
|
`pipe` Unix system call. Return two handles as `[read_fd, write_fd]` or null in case of error.
|
||||||
|
|
||||||
|
### `sleep(delay_ms)`
|
||||||
|
|
||||||
|
Sleep during `delay_ms` milliseconds.
|
||||||
|
|
||||||
|
### `sleepAsync(delay_ms)`
|
||||||
|
|
||||||
|
Asynchronouse sleep during `delay_ms` milliseconds. Returns a promise. Example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
await os.sleepAsync(500);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setTimeout(func, delay)`
|
||||||
|
|
||||||
|
Call the function `func` after `delay` ms. Return a timer ID.
|
||||||
|
|
||||||
|
### `clearTimeout(id)`
|
||||||
|
|
||||||
|
Cancel a timer.
|
||||||
|
|
||||||
|
### `platform`
|
||||||
|
|
||||||
|
Return a string representing the platform: `"linux"`, `"darwin"`, `"win32"` or `"js"`.
|
||||||
|
|
||||||
|
### `Worker(module_filename)`
|
||||||
|
|
||||||
|
Constructor to create a new thread (worker) with an API close to that of
|
||||||
|
`WebWorkers`. `module_filename` is a string specifying the
|
||||||
|
module filename which is executed in the newly created thread. As for
|
||||||
|
dynamically imported module, it is relative to the current script or
|
||||||
|
module path. Threads normally don't share any data and communicate
|
||||||
|
between each other with messages. Nested workers are not supported. An
|
||||||
|
example is available in `tests/test_worker.js`.
|
||||||
|
|
||||||
|
The worker class has the following static properties:
|
||||||
|
|
||||||
|
- `parent` - In the created worker, `Worker.parent` represents the parent
|
||||||
|
worker and is used to send or receive messages.
|
||||||
|
|
||||||
|
The worker instances have the following properties:
|
||||||
|
|
||||||
|
- `postMessage(msg)` - Send a message to the corresponding worker. `msg` is cloned in
|
||||||
|
the destination worker using an algorithm similar to the `HTML`
|
||||||
|
structured clone algorithm. `SharedArrayBuffer` are shared
|
||||||
|
between workers.
|
||||||
|
|
||||||
|
- `onmessage` - Getter and setter. Set a function which is called each time a
|
||||||
|
message is received. The function is called with a single
|
||||||
|
argument. It is an object with a `data` property containing the
|
||||||
|
received message. The thread is not terminated if there is at least
|
||||||
|
one non `null` `onmessage` handler.
|
||||||
|
|
||||||
|
## `std` module
|
||||||
|
|
||||||
|
The `std` module provides wrappers to libc (`stdlib.h` and `stdio.h`) and a few other utilities.
|
||||||
|
|
||||||
|
### `exit(n)`
|
||||||
|
|
||||||
|
Exit the process.
|
||||||
|
|
||||||
|
### `evalScript(str, options = undefined)`
|
||||||
|
|
||||||
|
Evaluate the string `str` as a script (global
|
||||||
|
eval). `options` is an optional object containing the following
|
||||||
|
optional properties:
|
||||||
|
|
||||||
|
- `backtrace_barrier` - Boolean (default = false). If true, error backtraces do not list the
|
||||||
|
stack frames below the evalScript.
|
||||||
|
- `async` - Boolean (default = false). If true, `await` is accepted in the
|
||||||
|
script and a promise is returned. The promise is resolved with an
|
||||||
|
object whose `value` property holds the value returned by the
|
||||||
|
script.
|
||||||
|
|
||||||
|
### `loadScript(filename)`
|
||||||
|
|
||||||
|
Evaluate the file `filename` as a script (global eval).
|
||||||
|
|
||||||
|
### `loadFile(filename)`
|
||||||
|
|
||||||
|
Load the file `filename` and return it as a string assuming UTF-8
|
||||||
|
encoding. Return `null` in case of I/O error.
|
||||||
|
|
||||||
|
### `open(filename, flags, errorObj = undefined)`
|
||||||
|
|
||||||
|
Open a file (wrapper to the libc `fopen()`). Return the FILE
|
||||||
|
object or `null` in case of I/O error. If `errorObj` is not
|
||||||
|
undefined, set its `errno` property to the error code or to 0 if
|
||||||
|
no error occurred.
|
||||||
|
|
||||||
|
### `popen(command, flags, errorObj = undefined)`
|
||||||
|
|
||||||
|
Open a process by creating a pipe (wrapper to the libc
|
||||||
|
`popen()`). Return the FILE
|
||||||
|
object or `null` in case of I/O error. If `errorObj` is not
|
||||||
|
undefined, set its `errno` property to the error code or to 0 if
|
||||||
|
no error occurred.
|
||||||
|
|
||||||
|
### `fdopen(fd, flags, errorObj = undefined)`
|
||||||
|
|
||||||
|
Open a file from a file handle (wrapper to the libc
|
||||||
|
`fdopen()`). Return the FILE
|
||||||
|
object or null` in case of I/O error. If `errorObj` is not
|
||||||
|
undefined, set its `errno` property to the error code or to 0 if
|
||||||
|
no error occurred.
|
||||||
|
|
||||||
|
### `tmpfile(errorObj = undefined)`
|
||||||
|
|
||||||
|
Open a temporary file. Return the FILE
|
||||||
|
object or `null` in case of I/O error. If `errorObj` is not
|
||||||
|
undefined, set its `errno` property to the error code or to 0 if
|
||||||
|
no error occurred.
|
||||||
|
|
||||||
|
### `puts(str)`
|
||||||
|
|
||||||
|
Equivalent to `std.out.puts(str)`.
|
||||||
|
|
||||||
|
### `printf(fmt, ...args)`
|
||||||
|
|
||||||
|
Equivalent to `std.out.printf(fmt, ...args)`.
|
||||||
|
|
||||||
|
### `sprintf(fmt, ...args)`
|
||||||
|
|
||||||
|
Equivalent to the libc sprintf().
|
||||||
|
|
||||||
|
### `in`, `out`, `err`
|
||||||
|
|
||||||
|
Wrappers to the libc file `stdin`, `stdout`, `stderr`.
|
||||||
|
|
||||||
|
### `Error`
|
||||||
|
|
||||||
|
Enumeration object containing the integer value of common errors
|
||||||
|
(additional error codes may be defined):
|
||||||
|
|
||||||
|
- `EINVAL`
|
||||||
|
- `EIO`
|
||||||
|
- `EACCES`
|
||||||
|
- `EEXIST`
|
||||||
|
- `ENOSPC`
|
||||||
|
- `ENOSYS`
|
||||||
|
- `EBUSY`
|
||||||
|
- `ENOENT`
|
||||||
|
- `EPERM`
|
||||||
|
- `EPIPE`
|
||||||
|
|
||||||
|
### `strerror(errno)`
|
||||||
|
|
||||||
|
Return a string that describes the error `errno`.
|
||||||
|
|
||||||
|
### `gc()`
|
||||||
|
|
||||||
|
Manually invoke the cycle removal algorithm. The cycle removal
|
||||||
|
algorithm is automatically started when needed, so this function is
|
||||||
|
useful in case of specific memory constraints or for testing.
|
||||||
|
|
||||||
|
### `getenv(name)`
|
||||||
|
|
||||||
|
Return the value of the environment variable `name` or
|
||||||
|
`undefined` if it is not defined.
|
||||||
|
|
||||||
|
### `setenv(name, value)`
|
||||||
|
|
||||||
|
Set the value of the environment variable `name` to the string
|
||||||
|
`value`.
|
||||||
|
|
||||||
|
### `unsetenv(name)`
|
||||||
|
|
||||||
|
Delete the environment variable `name`.
|
||||||
|
|
||||||
|
### `getenviron()`
|
||||||
|
|
||||||
|
Return an object containing the environment variables as key-value pairs.
|
||||||
|
|
||||||
|
### `urlGet(url, options = undefined)`
|
||||||
|
|
||||||
|
Download `url` using the `curl` command line
|
||||||
|
utility. `options` is an optional object containing the following
|
||||||
|
optional properties:
|
||||||
|
|
||||||
|
- `binary` - Boolean (default = false). If true, the response is an ArrayBuffer
|
||||||
|
instead of a string. When a string is returned, the data is assumed
|
||||||
|
to be UTF-8 encoded.
|
||||||
|
- `full` - Boolean (default = false). If true, return the an object contains
|
||||||
|
the properties `response` (response content),
|
||||||
|
`responseHeaders` (headers separated by CRLF), `status`
|
||||||
|
(status code). `response` is `null` is case of protocol or
|
||||||
|
network error. If `full` is false, only the response is
|
||||||
|
returned if the status is between 200 and 299. Otherwise `null`
|
||||||
|
is returned.
|
||||||
|
|
||||||
|
### `FILE`
|
||||||
|
|
||||||
|
File object.
|
||||||
|
|
||||||
|
#### `close()`
|
||||||
|
|
||||||
|
Close the file. Return 0 if OK or `-errno` in case of I/O error.
|
||||||
|
|
||||||
|
#### `puts(str)`
|
||||||
|
|
||||||
|
Outputs the string with the UTF-8 encoding.
|
||||||
|
|
||||||
|
#### `printf(fmt, ...args)`
|
||||||
|
|
||||||
|
Formatted printf.
|
||||||
|
|
||||||
|
The same formats as the standard C library `printf` are
|
||||||
|
supported. Integer format types (e.g. `%d`) truncate the Numbers
|
||||||
|
or BigInts to 32 bits. Use the `l` modifier (e.g. `%ld`) to
|
||||||
|
truncate to 64 bits.
|
||||||
|
|
||||||
|
#### `flush()`
|
||||||
|
|
||||||
|
Flush the buffered file.
|
||||||
|
|
||||||
|
#### `seek(offset, whence)`
|
||||||
|
|
||||||
|
Seek to a give file position (whence is
|
||||||
|
`std.SEEK_*`). `offset` can be a number or a BigInt. Return
|
||||||
|
0 if OK or `-errno` in case of I/O error.
|
||||||
|
|
||||||
|
- `SEEK_SET`
|
||||||
|
- `SEEK_CUR`
|
||||||
|
- `SEEK_END`
|
||||||
|
|
||||||
|
Constants for seek().
|
||||||
|
|
||||||
|
#### `tell()`
|
||||||
|
|
||||||
|
Return the current file position.
|
||||||
|
|
||||||
|
#### `tello()`
|
||||||
|
|
||||||
|
Return the current file position as a BigInt.
|
||||||
|
|
||||||
|
#### `eof()`
|
||||||
|
|
||||||
|
Return true if end of file.
|
||||||
|
|
||||||
|
#### `fileno()`
|
||||||
|
|
||||||
|
Return the associated OS handle.
|
||||||
|
|
||||||
|
#### `error()`
|
||||||
|
|
||||||
|
Return true if there was an error.
|
||||||
|
|
||||||
|
#### `clearerr()`
|
||||||
|
|
||||||
|
Clear the error indication.
|
||||||
|
|
||||||
|
#### `read(buffer, position, length)`
|
||||||
|
|
||||||
|
Read `length` bytes from the file to the ArrayBuffer `buffer` at byte
|
||||||
|
position `position` (wrapper to the libc `fread`).
|
||||||
|
|
||||||
|
#### `write(buffer, position, length)`
|
||||||
|
|
||||||
|
Write `length` bytes to the file from the ArrayBuffer `buffer` at byte
|
||||||
|
position `position` (wrapper to the libc `fwrite`).
|
||||||
|
|
||||||
|
#### `getline()`
|
||||||
|
|
||||||
|
Return the next line from the file, assuming UTF-8 encoding, excluding
|
||||||
|
the trailing line feed.
|
||||||
|
|
||||||
|
#### `readAsString(max_size = undefined)`
|
||||||
|
|
||||||
|
Read `max_size` bytes from the file and return them as a string
|
||||||
|
assuming UTF-8 encoding. If `max_size` is not present, the file
|
||||||
|
is read up its end.
|
||||||
|
|
||||||
|
#### `getByte()`
|
||||||
|
|
||||||
|
Return the next byte from the file. Return -1 if the end of file is reached.
|
||||||
|
|
||||||
|
#### `putByte(c)`
|
||||||
|
|
||||||
|
Write one byte to the file.
|
18
docs/docs/supported_platforms.md
Normal file
18
docs/docs/supported_platforms.md
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
sidebar_position: 8
|
||||||
|
---
|
||||||
|
|
||||||
|
# Supported Platforms
|
||||||
|
|
||||||
|
| System | Supported versions | Notes |
|
||||||
|
|---|---|---|
|
||||||
|
| GNU/Linux | * | glibc and musl are supported |
|
||||||
|
| macOS | macOS >= 11 | Currently supported macOS releases |
|
||||||
|
| Windows | >= Windows 8 | VS >= 2022 and Clang are supported |
|
||||||
|
| FreeBSD | * | Limited testing |
|
||||||
|
| OpenBSD | * | Limited testing |
|
||||||
|
| NetBSD | * | Limited testing |
|
||||||
|
| Android | NDK >= 26.0.10792818 | Limited testing |
|
||||||
|
| iOS | * | Limited testing |
|
||||||
|
| MinGW | MinGW-w64 | |
|
||||||
|
| Other | N/A | Missing? Open a PR! |
|
114
docs/docusaurus.config.js
Normal file
114
docs/docusaurus.config.js
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
// @ts-check
|
||||||
|
// `@type` JSDoc annotations allow editor autocompletion and type checking
|
||||||
|
// (when paired with `@ts-check`).
|
||||||
|
// There are various equivalent ways to declare your Docusaurus config.
|
||||||
|
// See: https://docusaurus.io/docs/api/docusaurus-config
|
||||||
|
|
||||||
|
/** @type {import('@docusaurus/types').Config} */
|
||||||
|
const config = {
|
||||||
|
title: 'QuickJS-NG',
|
||||||
|
tagline: 'QuickJS, the Next Generation: a mighty JavaScript engine',
|
||||||
|
favicon: 'img/favicon.ico',
|
||||||
|
|
||||||
|
// Set the production url of your site here
|
||||||
|
url: 'https://quickjs-ng.github.io',
|
||||||
|
// Set the /<baseUrl>/ pathname under which your site is served
|
||||||
|
// For GitHub pages deployment, it is often '/<projectName>/'
|
||||||
|
baseUrl: '/quickjs/',
|
||||||
|
|
||||||
|
// GitHub pages deployment config.
|
||||||
|
// If you aren't using GitHub pages, you don't need these.
|
||||||
|
organizationName: 'quickjs-ng', // Usually your GitHub org/user name.
|
||||||
|
projectName: 'quickjs', // Usually your repo name.
|
||||||
|
|
||||||
|
onBrokenLinks: 'throw',
|
||||||
|
onBrokenMarkdownLinks: 'throw',
|
||||||
|
|
||||||
|
// Even if you don't use internationalization, you can use this field to set
|
||||||
|
// useful metadata like html lang. For example, if your site is Chinese, you
|
||||||
|
// may want to replace "en" with "zh-Hans".
|
||||||
|
i18n: {
|
||||||
|
defaultLocale: 'en',
|
||||||
|
locales: ['en'],
|
||||||
|
},
|
||||||
|
|
||||||
|
presets: [
|
||||||
|
[
|
||||||
|
'classic',
|
||||||
|
/** @type {import('@docusaurus/preset-classic').Options} */
|
||||||
|
({
|
||||||
|
docs: {
|
||||||
|
routeBasePath: '/',
|
||||||
|
sidebarPath: './sidebars.js',
|
||||||
|
// Please change this to your repo.
|
||||||
|
// Remove this to remove the "edit this page" links.
|
||||||
|
editUrl: 'https://github.com/quickjs-ng/quickjs/tree/master/docs/',
|
||||||
|
},
|
||||||
|
blog: false,
|
||||||
|
theme: {
|
||||||
|
customCss: './src/css/custom.css',
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
|
themeConfig:
|
||||||
|
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
|
||||||
|
({
|
||||||
|
// Replace with your project's social card
|
||||||
|
image: 'img/docusaurus-social-card.jpg',
|
||||||
|
navbar: {
|
||||||
|
title: 'QuickJS-NG',
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
type: 'docSidebar',
|
||||||
|
sidebarId: 'docsSidebar',
|
||||||
|
position: 'left',
|
||||||
|
label: 'Documentation',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: 'https://github.com/quickjs-ng/quickjs',
|
||||||
|
label: 'GitHub',
|
||||||
|
position: 'right',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
footer: {
|
||||||
|
style: 'dark',
|
||||||
|
links: [
|
||||||
|
{
|
||||||
|
title: 'Docs',
|
||||||
|
items: [
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Community',
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
label: 'GitHub Discussions',
|
||||||
|
href: 'https://github.com/quickjs-ng/quickjs/discussions',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Matrix',
|
||||||
|
href: 'https://matrix.to/#/%23quickjs-ng%3Amatrix.org?via=matrix.org',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'More',
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
label: 'GitHub',
|
||||||
|
href: 'https://github.com/quickjs-ng/quickjs',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
copyright: `Copyright © ${new Date().getFullYear()} QuickJS-NG project contributors.`,
|
||||||
|
},
|
||||||
|
prism: {
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
|
||||||
|
export default config;
|
14656
docs/package-lock.json
generated
Normal file
14656
docs/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
42
docs/package.json
Normal file
42
docs/package.json
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
{
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"docusaurus": "docusaurus",
|
||||||
|
"start": "docusaurus start",
|
||||||
|
"build": "docusaurus build",
|
||||||
|
"swizzle": "docusaurus swizzle",
|
||||||
|
"deploy": "docusaurus deploy",
|
||||||
|
"clear": "docusaurus clear",
|
||||||
|
"serve": "docusaurus serve",
|
||||||
|
"write-translations": "docusaurus write-translations",
|
||||||
|
"write-heading-ids": "docusaurus write-heading-ids"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@docusaurus/core": "3.5.2",
|
||||||
|
"@docusaurus/preset-classic": "3.5.2",
|
||||||
|
"@mdx-js/react": "3.0.1",
|
||||||
|
"clsx": "2.1.1",
|
||||||
|
"prism-react-renderer": "2.4.0",
|
||||||
|
"react": "18.3.1",
|
||||||
|
"react-dom": "18.3.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@docusaurus/module-type-aliases": "3.5.2",
|
||||||
|
"@docusaurus/types": "3.5.2"
|
||||||
|
},
|
||||||
|
"browserslist": {
|
||||||
|
"production": [
|
||||||
|
">0.5%",
|
||||||
|
"not dead",
|
||||||
|
"not op_mini all"
|
||||||
|
],
|
||||||
|
"development": [
|
||||||
|
"last 3 chrome version",
|
||||||
|
"last 3 firefox version",
|
||||||
|
"last 5 safari version"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18.0"
|
||||||
|
}
|
||||||
|
}
|
20
docs/sidebars.js
Normal file
20
docs/sidebars.js
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/**
|
||||||
|
* Creating a sidebar enables you to:
|
||||||
|
- create an ordered group of docs
|
||||||
|
- render a sidebar for each doc of that group
|
||||||
|
- provide next/previous navigation
|
||||||
|
|
||||||
|
The sidebars can be generated from the filesystem, or explicitly defined here.
|
||||||
|
|
||||||
|
Create as many sidebars as you want.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// @ts-check
|
||||||
|
|
||||||
|
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
|
||||||
|
const sidebars = {
|
||||||
|
// By default, Docusaurus generates a sidebar from the docs folder structure
|
||||||
|
docsSidebar: [{type: 'autogenerated', dirName: '.'}],
|
||||||
|
};
|
||||||
|
|
||||||
|
export default sidebars;
|
30
docs/src/css/custom.css
Normal file
30
docs/src/css/custom.css
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
/**
|
||||||
|
* Any CSS included here will be global. The classic template
|
||||||
|
* bundles Infima by default. Infima is a CSS framework designed to
|
||||||
|
* work well for content-centric websites.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* You can override the default Infima variables here. */
|
||||||
|
:root {
|
||||||
|
--ifm-color-primary: #2e8555;
|
||||||
|
--ifm-color-primary-dark: #29784c;
|
||||||
|
--ifm-color-primary-darker: #277148;
|
||||||
|
--ifm-color-primary-darkest: #205d3b;
|
||||||
|
--ifm-color-primary-light: #33925d;
|
||||||
|
--ifm-color-primary-lighter: #359962;
|
||||||
|
--ifm-color-primary-lightest: #3cad6e;
|
||||||
|
--ifm-code-font-size: 95%;
|
||||||
|
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For readability concerns, you should choose a lighter palette in dark mode. */
|
||||||
|
[data-theme='dark'] {
|
||||||
|
--ifm-color-primary: #25c2a0;
|
||||||
|
--ifm-color-primary-dark: #21af90;
|
||||||
|
--ifm-color-primary-darker: #1fa588;
|
||||||
|
--ifm-color-primary-darkest: #1a8870;
|
||||||
|
--ifm-color-primary-light: #29d5b0;
|
||||||
|
--ifm-color-primary-lighter: #32d8b4;
|
||||||
|
--ifm-color-primary-lightest: #4fddbf;
|
||||||
|
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
0
docs/static/.nojekyll
vendored
Normal file
0
docs/static/.nojekyll
vendored
Normal file
BIN
docs/static/img/favicon.ico
vendored
Normal file
BIN
docs/static/img/favicon.ico
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.5 KiB |
Loading…
Reference in a new issue