Merge pull request #208 from CryZe/wasm-bindgen

Switch to wasm-bindgen
This commit is contained in:
Christopher Serr
2019-12-27 15:20:35 +01:00
committed by GitHub
35 changed files with 95 additions and 8084 deletions
-21
View File
@@ -1,21 +0,0 @@
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"browsers": [
">0.5%",
"not ie <= 11",
"not OperaMini all",
"not UCAndroid < 12",
"not Samsung < 7",
"not iOS < 11.2",
"not Android < 66",
"not chrome < 57"
]
}
}
]
]
}
+1
View File
@@ -2,3 +2,4 @@ node_modules
dist
npm-debug.log
src/livesplit_core.wasm
src/livesplit-core
+35 -19
View File
@@ -1,4 +1,4 @@
<h1> <img src="https://raw.githubusercontent.com/LiveSplit/LiveSplit/master/LiveSplit/Resources/Icon.png" alt="LiveSplit" height="42" width="45" align="top"/> LiveSplit One</h1>
# <img src="https://raw.githubusercontent.com/LiveSplit/LiveSplit/master/LiveSplit/Resources/Icon.png" alt="LiveSplit" height="42" width="45" align="top"/> LiveSplit One
[![Build Status](https://travis-ci.org/LiveSplit/LiveSplitOne.svg?branch=master)](https://travis-ci.org/LiveSplit/LiveSplitOne) [![Greenkeeper badge](https://badges.greenkeeper.io/LiveSplit/LiveSplitOne.svg)](https://greenkeeper.io/)
@@ -15,41 +15,57 @@ In order to build LiveSplit One you need to install
[npm](https://www.npmjs.com/get-npm) and the [Rust
Compiler](https://www.rust-lang.org/). Make sure to recursively clone the
repository so that all git submodules are cloned as well:
```
```bash
git clone --recursive
```
Once you have cloned the repository and both the Rust compiler and npm are set
up, you need to install the WebAssembly target like so:
```
```bash
rustup target add wasm32-unknown-unknown
```
You need to set up some npm modules before compiling the project:
You also need wasm-bindgen. You can build it like so:
```bash
cargo install wasm-bindgen-cli
```
You need to set up some npm modules before compiling the project:
```bash
npm install
```
You are now ready to build livesplit-core, which powers LiveSplit One:
```
```bash
npm run build:core
```
Now you can build and host LiveSplit One:
```
```bash
npm run start
```
A browser tab with LiveSplit One should now open. Alternatively you can use `npm
run serve` to just host it without opening a browser tab.
## Browser Support
| Browser | Compatibility | Known Issues |
|---------|---------------|--------------|
| Chrome | ≥57 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Google%20Chrome.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Google%20Chrome") |
| Firefox | ≥52 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Firefox.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AFirefox) |
| Edge | ≥16 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Microsoft%20Edge.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Microsoft%20Edge") |
| Safari | ≥11 | |
| Opera | ≥44 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Google%20Chrome.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Google%20Chrome") |
| iOS | ≥11.2 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/iOS.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AiOS) |
| Android WebView | ≥62 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Android.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AAndroid) |
| Chrome Android | ≥66 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Android.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AAndroid) |
| Firefox Android | ≥60 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Android.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AAndroid) |
| Internet Explorer | Unsupported | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Internet%20Explorer.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Internet%20Explorer") |
| Opera Mini | Unsupported | |
| Browser | Compatibility | Known Issues |
| ----------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Chrome | ≥57 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Google%20Chrome.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Google%20Chrome") |
| Firefox | ≥52 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Firefox.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AFirefox) |
| Edge | ≥16 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Microsoft%20Edge.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Microsoft%20Edge") |
| Safari | ≥11 | |
| Opera | ≥44 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Google%20Chrome.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Google%20Chrome") |
| iOS | ≥11.2 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/iOS.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AiOS) |
| Android WebView | ≥62 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Android.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AAndroid) |
| Chrome Android | ≥66 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Android.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AAndroid) |
| Firefox Android | ≥60 | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Android.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3AAndroid) |
| Internet Explorer | Unsupported | [![GitHub issues by-label](https://img.shields.io/github/issues/LiveSplit/LiveSplitOne/Internet%20Explorer.svg)](https://github.com/LiveSplit/LiveSplitOne/issues?q=is%3Aissue+is%3Aopen+label%3A"Internet%20Explorer") |
| Opera Mini | Unsupported | |
+14 -5
View File
@@ -15,6 +15,7 @@ spawnSync(
[
"build",
"-p", "cdylib",
"--features", "wasm-web",
"--target", "wasm32-unknown-unknown",
"--release",
],
@@ -24,9 +25,17 @@ spawnSync(
},
);
spawnSync(
"wasm-bindgen",
[
"livesplit-core/target/wasm32-unknown-unknown/release/livesplit_core.wasm",
"--out-dir", "src/livesplit-core",
],
{
stdio: "inherit",
},
);
fs
.createReadStream("livesplit-core/target/wasm32-unknown-unknown/release/livesplit_core.wasm")
.pipe(fs.createWriteStream("src/livesplit_core.wasm"));
fs
.createReadStream("livesplit-core/capi/bindings/wasm/livesplit_core.ts")
.pipe(fs.createWriteStream("src/livesplit.ts"));
.createReadStream("livesplit-core/capi/bindings/wasm_bindgen/index.ts")
.pipe(fs.createWriteStream("src/livesplit-core/index.ts"));
+1
View File
@@ -19,6 +19,7 @@ main() {
rustup target install $TARGET
cargo install -f wasm-gc
cargo install -f wasm-bindgen-cli
# This fetches latest stable release
local tag=$(git ls-remote --tags --refs --exit-code https://github.com/japaric/cross \
+5 -7
View File
@@ -6,15 +6,13 @@ SOURCE_BRANCH="master"
TARGET_BRANCH="gh-pages"
doCompile() {
(cd livesplit-core && cargo build -p cdylib --target wasm32-unknown-unknown --release)
(cd livesplit-core/capi/bind_gen && cargo run)
$HOME/binaryen/bin/wasm-opt -O4 livesplit-core/target/wasm32-unknown-unknown/release/livesplit_core.wasm -o src/livesplit_core.wasm
wasm-gc src/livesplit_core.wasm
cp livesplit-core/capi/bindings/wasm/livesplit_core.ts src/livesplit.ts
npm install
npm run build:core
npm run publish
WASM_FILE=$(ls dist/*.wasm)
$HOME/binaryen/bin/wasm-opt -O4 "$WASM_FILE" -o "$WASM_FILE"
wasm-gc "$WASM_FILE"
}
if [ "$TRAVIS_PULL_REQUEST" != "false" -o "$TRAVIS_BRANCH" != "$SOURCE_BRANCH" ]; then
+1 -1
View File
@@ -8,7 +8,7 @@ import {
PlayersEmbedded,
} from "./SpeedrunCom";
import { Option } from "../util/OptionUtil";
import { FuzzyList } from "../livesplit";
import { FuzzyList } from "../livesplit-core";
const gameList: string[] = [];
let fuzzyList: Option<FuzzyList> = null;
+1 -3
View File
@@ -2,8 +2,6 @@ import * as React from "react";
import * as ReactDOM from "react-dom";
import { toast, ToastContainer } from "react-toastify";
import { load } from "./livesplit";
import { LiveSplit } from "./ui/LiveSplit";
import "react-toastify/dist/ReactToastify.css";
import "./css/font-awesome.css";
@@ -11,7 +9,7 @@ import "./css/main.scss";
async function run() {
try {
await load("livesplit_core.wasm");
const { LiveSplit } = await import("./ui/LiveSplit");
ReactDOM.render(
<div>
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import { LayoutStateJson } from "../livesplit";
import { LayoutStateJson } from "../livesplit-core";
import Layout from "./Layout";
export interface Props {
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import * as LiveSplit from "../livesplit";
import * as LiveSplit from "../livesplit-core";
import { gradientToCss } from "../util/ColorUtil";
export interface Props { state: LiveSplit.BlankSpaceComponentStateJson }
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import { ComponentStateJson, LayoutStateJson } from "../livesplit";
import { ComponentStateJson, LayoutStateJson } from "../livesplit-core";
import { assertNever } from "../util/OptionUtil";
import BlankSpace from "./BlankSpace";
import KeyValue from "./KeyValue";
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import * as LiveSplit from "../livesplit";
import * as LiveSplit from "../livesplit-core";
import { gradientToCss } from "../util/ColorUtil";
import { renderToSVG } from "./Timer";
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import { LayoutStateJson } from "../livesplit";
import { LayoutStateJson } from "../livesplit-core";
import { colorToCss, gradientToCss } from "../util/ColorUtil";
import { Option } from "../util/OptionUtil";
import Component from "./Component";
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import * as LiveSplit from "../livesplit";
import * as LiveSplit from "../livesplit-core";
import { colorToCss } from "../util/ColorUtil";
import "../css/Graph.scss";
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import * as LiveSplit from "../livesplit";
import * as LiveSplit from "../livesplit-core";
import { colorToCss, gradientToCss } from "../util/ColorUtil";
import { map } from "../util/OptionUtil";
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import { LayoutStateJson } from "../livesplit";
import { LayoutStateJson } from "../livesplit-core";
import { colorToCss, gradientToCss } from "../util/ColorUtil";
import Component from "./Component";
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import * as LiveSplit from "../livesplit";
import * as LiveSplit from "../livesplit-core";
import { colorToCss } from "../util/ColorUtil";
import "../css/Separator.scss";
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import * as LiveSplit from "../livesplit";
import * as LiveSplit from "../livesplit-core";
import { colorToCss, gradientToCss } from "../util/ColorUtil";
import { Option } from "../util/OptionUtil";
import { splitLabelHeight } from "./SplitLabels";
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import * as LiveSplit from "../livesplit";
import * as LiveSplit from "../livesplit-core";
import Split from "./Split";
import { gradientToCss, colorToCss } from "../util/ColorUtil";
import { Option, map } from "../util/OptionUtil";
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import * as LiveSplit from "../livesplit";
import * as LiveSplit from "../livesplit-core";
import { gradientToCss, colorToCss } from "../util/ColorUtil";
import { map } from "../util/OptionUtil";
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import * as LiveSplit from "../livesplit";
import * as LiveSplit from "../livesplit-core";
import { colorToCss, gradientToCss } from "../util/ColorUtil";
import "../css/Timer.scss";
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import * as LiveSplit from "../livesplit";
import * as LiveSplit from "../livesplit-core";
import { colorToCss, gradientToCss } from "../util/ColorUtil";
import { map } from "../util/OptionUtil";
-7987
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,7 +1,7 @@
import * as React from "react";
import { ContextMenu, ContextMenuTrigger, MenuItem } from "react-contextmenu";
import DragAutoRefreshLayout from "../layout/DragAutoRefreshLayout";
import * as LiveSplit from "../livesplit";
import * as LiveSplit from "../livesplit-core";
import { SettingsComponent } from "./Settings";
import "../css/LayoutEditor.scss";
+1 -1
View File
@@ -6,7 +6,7 @@ import {
HotkeySystem, Layout, LayoutEditor, Run, RunEditor,
Segment, SharedTimer, Timer, TimerPhase, TimingMethod,
TimeSpan, TimerRef, TimerRefMut, HotkeyConfig,
} from "../livesplit";
} from "../livesplit-core";
import { convertFileToArrayBuffer, convertFileToString, exportFile, openFileAsArrayBuffer, openFileAsString } from "../util/FileUtil";
import { Option, assertNull, expect, maybeDisposeAndThen, panic } from "../util/OptionUtil";
import * as SplitsIO from "../util/SplitsIO";
+1 -1
View File
@@ -1,6 +1,6 @@
import * as React from "react";
import { ContextMenu, ContextMenuTrigger, MenuItem } from "react-contextmenu";
import * as LiveSplit from "../livesplit";
import * as LiveSplit from "../livesplit-core";
import { openFileAsArrayBuffer } from "../util/FileUtil";
import { TextBox } from "./TextBox";
import { toast } from "react-toastify";
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import { Color, SettingsDescriptionJson, SettingsDescriptionValueJson } from "../livesplit";
import { Color, SettingsDescriptionJson, SettingsDescriptionValueJson } from "../livesplit-core";
import { assertNever, expect, Option } from "../util/OptionUtil";
import ColorPicker from "./ColorPicker";
+1 -1
View File
@@ -1,7 +1,7 @@
import * as React from "react";
import { SettingsComponent } from "./Settings";
import { SettingsDescriptionJson, SettingValue, HotkeyConfig } from "../livesplit";
import { SettingsDescriptionJson, SettingValue, HotkeyConfig } from "../livesplit-core";
import { toast } from "react-toastify";
import "../css/SettingsEditor.scss";
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from "react";
import { SharedTimerRef, TimingMethod } from "../livesplit";
import { SharedTimerRef, TimingMethod } from "../livesplit-core";
import { Option } from "../util/OptionUtil";
import "../css/SideBarContent.scss";
+1 -1
View File
@@ -1,4 +1,4 @@
import { Color, Gradient } from "../livesplit";
import { Color, Gradient } from "../livesplit-core";
export function colorToCss(color: Color): string {
const r = Math.round(color[0] * 255);
+1 -1
View File
@@ -1,6 +1,6 @@
import * as React from "react";
import { Parser as CommonMarkParser } from "commonmark";
import CommonMarkRenderer = require("commonmark-react-renderer");
import CommonMarkRenderer from "commonmark-react-renderer";
import * as emojilib from "emojilib";
import { emoteList } from "../api/EmoteList";
import Twemoji from "react-twemoji";
+1 -1
View File
@@ -1,4 +1,4 @@
import { Run } from "../livesplit";
import { Run } from "../livesplit-core";
import { PostRunResponse } from "./json/PostRunResponse";
function mapPromiseErr<T, E>(promise: Promise<T>, err: E): Promise<T> {
+9 -4
View File
@@ -1,10 +1,9 @@
{
"compilerOptions": {
"outDir": "./dist/",
"sourceMap": true,
"noImplicitAny": true,
"module": "commonjs",
"target": "es2018",
"module": "ESNext",
"target": "ES5",
"jsx": "react",
"strictNullChecks": true,
"noImplicitReturns": true,
@@ -14,7 +13,13 @@
"noFallthroughCasesInSwitch": true,
"alwaysStrict": true,
"strictFunctionTypes": true,
"strict": true
"strict": true,
"allowSyntheticDefaultImports": true,
"moduleResolution": "Node",
"lib": [
"ES2015",
"DOM"
]
},
"include": [
"./src/**/*"
+4 -13
View File
@@ -29,7 +29,7 @@ module.exports = (env, argv) => {
},
resolve: {
extensions: [".webpack.js", ".web.js", ".ts", ".tsx", ".js", ".json"],
extensions: [".webpack.js", ".web.js", ".ts", ".tsx", ".js", ".json", ".wasm"],
},
plugins: [
@@ -51,9 +51,6 @@ module.exports = (env, argv) => {
},
],
})] : []),
new CopyWebpackPlugin([
{ from: "src/livesplit_core.wasm", to: "livesplit_core.wasm" },
], {}),
],
module: {
@@ -62,12 +59,6 @@ module.exports = (env, argv) => {
{
test: /\.tsx?$/,
use: [
{
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
},
"ts-loader",
],
exclude: "/node_modules",
@@ -75,12 +66,12 @@ module.exports = (env, argv) => {
{
test: /\.(s*)css$/,
use: ["style-loader", "css-loader", {
loader: 'sass-loader',
loader: "sass-loader",
options: {
// Prefer `dart-sass`
implementation: require('sass'),
implementation: require("sass"),
},
},],
}],
},
{
test: /\.(png|jpg|gif|woff|ico)$/,