From 3387abbfe072cbfe1ed1e7a3d71668603831591b Mon Sep 17 00:00:00 2001 From: 深淵の鴿子 <71170059+ZerxZ@users.noreply.github.com> Date: Sun, 27 Oct 2024 20:51:48 -0700 Subject: Add Support WASM ESM and CommonJs module, Typescript. (#176) --- .github/workflows/wasm.yml | 23 +++++++++ makefile | 122 ++++++++++++++++++++++++++++++++++++++++++++- wasm/package.json | 64 ++++++++++++++++++++++++ 3 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/wasm.yml create mode 100644 wasm/package.json diff --git a/.github/workflows/wasm.yml b/.github/workflows/wasm.yml new file mode 100644 index 0000000..a0910ba --- /dev/null +++ b/.github/workflows/wasm.yml @@ -0,0 +1,23 @@ +name: Wasm Build + +on: + workflow_dispatch: + +jobs: + build: + name: Build + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Build Wasm + run: | + brew upgrade -f python + brew install emscripten + make wasm-node + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: yuescript-wasm + path: ./wasm + retention-days: 7 diff --git a/makefile b/makefile index 49698fb..aa9bc4a 100644 --- a/makefile +++ b/makefile @@ -207,11 +207,131 @@ endif @echo -n "Total build time: " @$(END_TIME) +.PHONY: wasm-node +wasm-node: clean + @$(MAKE) generic CC='emcc' AR='emar rcu' RANLIB='emranlib' -C $(SRC_PATH)/3rdParty/lua + @mkdir -p wasm/dist + @mkdir -p wasm/dist/esm + @mkdir -p wasm/dist/cjs + # ESM Module + @emcc $(SRC_PATH)/yue_wasm.cpp \ + $(SRC_PATH)/yuescript/ast.cpp \ + $(SRC_PATH)/yuescript/yue_ast.cpp \ + $(SRC_PATH)/yuescript/parser.cpp \ + $(SRC_PATH)/yuescript/yue_compiler.cpp \ + $(SRC_PATH)/yuescript/yue_parser.cpp \ + $(SRC_PATH)/yuescript/yuescript.cpp \ + $(SRC_PATH)/3rdParty/lua/liblua.a \ + -O2 \ + -o wasm/dist/esm/yuescript.mjs \ + -I $(SRC_PATH) \ + -I $(SRC_PATH)/3rdParty/lua \ + -std=c++17 \ + --bind \ + -fexceptions \ + -Wno-deprecated-declarations \ + -gsource-map \ + --emit-tsd="yuescript.d.ts" \ + -s EXPORT_NAME="'_createYuescriptModule'" \ + -s EXPORT_EXCEPTION_HANDLING_HELPERS \ + -s EXCEPTION_CATCHING_ALLOWED=['we only want to allow exception handling in side modules'] \ + -sEXPORTED_RUNTIME_METHODS='wasmTable,ERRNO_CODES' \ + -s FORCE_FILESYSTEM=1 \ + -s TOTAL_MEMORY=20971520 \ + -s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]' \ + -s EXPORT_ALL=1 \ + -s FS_DEBUG=1 \ + -s STACK_SIZE=5MB \ + -s AUTO_JS_LIBRARIES=0 \ + -s AUTO_NATIVE_LIBRARIES=0 \ + -s NODEJS_CATCH_EXIT=0 \ + -s NODEJS_CATCH_REJECTION=0 \ + -sGL_WORKAROUND_SAFARI_GETCONTEXT_BUG=0 \ + -s USE_ZLIB \ + -s USE_BZIP2 \ + -s WASM_BIGINT \ + -s MODULARIZE=1 \ + -s LZ4=1 + # CommonJS Module + @emcc $(SRC_PATH)/yue_wasm.cpp \ + $(SRC_PATH)/yuescript/ast.cpp \ + $(SRC_PATH)/yuescript/yue_ast.cpp \ + $(SRC_PATH)/yuescript/parser.cpp \ + $(SRC_PATH)/yuescript/yue_compiler.cpp \ + $(SRC_PATH)/yuescript/yue_parser.cpp \ + $(SRC_PATH)/yuescript/yuescript.cpp \ + $(SRC_PATH)/3rdParty/lua/liblua.a \ + -O2 \ + -o wasm/dist/cjs/yuescript.cjs \ + --emit-tsd="yuescript.d.ts" \ + -I $(SRC_PATH) \ + -I $(SRC_PATH)/3rdParty/lua \ + -std=c++17 \ + --bind \ + -fexceptions \ + -Wno-deprecated-declarations \ + -gsource-map \ + -s EXPORT_NAME="'_createYuescriptModule'" \ + -s EXPORT_EXCEPTION_HANDLING_HELPERS \ + -s EXCEPTION_CATCHING_ALLOWED=['we only want to allow exception handling in side modules'] \ + -sEXPORTED_RUNTIME_METHODS='wasmTable,ERRNO_CODES' \ + -s FORCE_FILESYSTEM=1 \ + -s TOTAL_MEMORY=20971520 \ + -s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]' \ + -s EXPORT_ALL=1 \ + -s FS_DEBUG=1 \ + -s STACK_SIZE=5MB \ + -s AUTO_JS_LIBRARIES=0 \ + -s AUTO_NATIVE_LIBRARIES=0 \ + -s NODEJS_CATCH_EXIT=0 \ + -s NODEJS_CATCH_REJECTION=0 \ + -sGL_WORKAROUND_SAFARI_GETCONTEXT_BUG=0 \ + -s USE_ZLIB \ + -s USE_BZIP2 \ + -s WASM_BIGINT\ + -s MODULARIZE=1\ + -s LZ4=1 + @${MAKE} clean + .PHONY: wasm wasm: clean @$(MAKE) generic CC='emcc' AR='emar rcu' RANLIB='emranlib' -C $(SRC_PATH)/3rdParty/lua @mkdir -p doc/docs/.vuepress/public/js - @emcc $(SRC_PATH)/yue_wasm.cpp $(SRC_PATH)/yuescript/ast.cpp $(SRC_PATH)/yuescript/yue_ast.cpp $(SRC_PATH)/yuescript/parser.cpp $(SRC_PATH)/yuescript/yue_compiler.cpp $(SRC_PATH)/yuescript/yue_parser.cpp $(SRC_PATH)/yuescript/yuescript.cpp $(SRC_PATH)/3rdParty/lua/liblua.a -O2 -o doc/docs/.vuepress/public/js/yuescript.js -I $(SRC_PATH) -I $(SRC_PATH)/3rdParty/lua -std=c++17 --bind -fexceptions -Wno-deprecated-declarations + @emcc $(SRC_PATH)/yue_wasm.cpp \ + $(SRC_PATH)/yuescript/ast.cpp \ + $(SRC_PATH)/yuescript/yue_ast.cpp \ + $(SRC_PATH)/yuescript/parser.cpp \ + $(SRC_PATH)/yuescript/yue_compiler.cpp \ + $(SRC_PATH)/yuescript/yue_parser.cpp \ + $(SRC_PATH)/yuescript/yuescript.cpp \ + $(SRC_PATH)/3rdParty/lua/liblua.a \ + -O2 \ + -o doc/docs/.vuepress/public/js/yuescript.js \ + -I $(SRC_PATH) \ + -I $(SRC_PATH)/3rdParty/lua \ + -std=c++17 \ + --bind \ + -fexceptions \ + -Wno-deprecated-declarations \ + -s EXPORT_EXCEPTION_HANDLING_HELPERS \ + -s EXCEPTION_CATCHING_ALLOWED=['we only want to allow exception handling in side modules'] \ + -sEXPORTED_RUNTIME_METHODS='wasmTable,ERRNO_CODES' \ + -s FORCE_FILESYSTEM=1 \ + -s TOTAL_MEMORY=20971520 \ + -s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]' \ + -s EXPORT_ALL=1 \ + -s FS_DEBUG=1 \ + -s STACK_SIZE=5MB \ + -s AUTO_JS_LIBRARIES=0 \ + -s AUTO_NATIVE_LIBRARIES=0 \ + -s NODEJS_CATCH_EXIT=0 \ + -s NODEJS_CATCH_REJECTION=0 \ + -sGL_WORKAROUND_SAFARI_GETCONTEXT_BUG=0 \ + -s USE_ZLIB \ + -s USE_BZIP2 \ + -s WASM_BIGINT\ + -s MODULARIZE=1 \ + -s LZ4=1 @${MAKE} clean # Debug build for gdb debugging diff --git a/wasm/package.json b/wasm/package.json new file mode 100644 index 0000000..b8d2586 --- /dev/null +++ b/wasm/package.json @@ -0,0 +1,64 @@ +{ + "name": "yuescript", + "version": "0.25.5", + "description": "A Moonscript dialect compiles to Lua.", + "main": "./dist/esm/yuescript.mjs", + "repository": { + "type": "git", + "url": "git+https://github.com/pigpigyyy/Yuescript.git" + }, + "keywords": ["lua", "cpp", "moonscript", "yuescript", "transpiler"], + "exports": { + ".": { + "import": "./dist/esm/yuescript.mjs", + "require": "./dist/cjs/yuescript.js", + "types": "./dist/esm/yuescript.d.ts" + }, + "./yuescript.wasm": { + "import": "./dist/esm/yuescript.wasm", + "require": "./dist/cjs/yuescript.wasm" + }, + "./yuescript.wasm.map": { + "import": "./dist/esm/yuescript.wasm.map", + "require": "./dist/cjs/yuescript.wasm.map" + } + }, + "files": [ + "./dist/cjs/yuescript.cjs", + "./dist/esm/yuescript.mjs", + "./dist/esm/yuescript.d.ts", + "./dist/esm/yuescript.wasm", + "./dist/esm/yuescript.wasm.map", + "./dist/cjs/yuescript.d.ts", + "./dist/cjs/yuescript.wasm", + "./dist/cjs/yuescript.wasm.map" + + ], + "browser": { + "child_process": false, + "crypto": false, + "fs": false, + "fs/promises": false, + "path": false, + "url": false, + "vm": false, + "ws": false + }, + "author": "pigpigyyy", + "license": "MIT", + "bugs": { + "url": "https://github.com/pigpigyyy/Yuescript/issues" + }, + "homepage": "https://github.com/pigpigyyy/Yuescript#readme", + "tsd": { + "compilerOptions": { + "lib": ["ES2017", "DOM"] + } + }, + "types": "./dist/esm/yuescript.d.ts", + "engines": { + "node": ">=18.0.0" + }, + "devDependencies": {}, + "scripts": {} +} -- cgit v1.2.3-55-g6feb