start spring cleaning, use rollup instead of both webpack and rollup
This commit is contained in:
parent
13bccc7bd9
commit
07f25566ca
12
.eslintrc.js
Normal file
12
.eslintrc.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
plugins: [
|
||||||
|
'@typescript-eslint',
|
||||||
|
],
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
'plugin:@typescript-eslint/eslint-recommended',
|
||||||
|
'plugin:@typescript-eslint/recommended',
|
||||||
|
],
|
||||||
|
};
|
49
Makefile
49
Makefile
@ -1,39 +1,26 @@
|
|||||||
src = src
|
src = src
|
||||||
poname = taler-wallet-webex
|
poname = taler-wallet-webex
|
||||||
|
|
||||||
gulp = node_modules/gulp/bin/gulp.js
|
|
||||||
tsc = node_modules/typescript/bin/tsc
|
tsc = node_modules/typescript/bin/tsc
|
||||||
pogen = node_modules/pogen/bin/pogen.js
|
pogen = node_modules/pogen/bin/pogen.js
|
||||||
typedoc = node_modules/typedoc/bin/typedoc
|
typedoc = node_modules/typedoc/bin/typedoc
|
||||||
ava = node_modules/ava/cli.js
|
ava = node_modules/.bin/ava
|
||||||
nyc = node_modules/nyc/bin/nyc.js
|
nyc = node_modules/nyc/bin/nyc.js
|
||||||
tslint = node_modules/tslint/bin/tslint
|
|
||||||
|
|
||||||
include config.mk
|
include config.mk
|
||||||
|
|
||||||
.PHONY: tsc
|
.PHONY: tsc
|
||||||
tsc: tsconfig.json yarn-install
|
tsc: yarn-install
|
||||||
$(tsc)
|
$(tsc)
|
||||||
|
|
||||||
.PHONY: webex-stable
|
|
||||||
webex-stable: i18n
|
|
||||||
$(gulp) stable
|
|
||||||
|
|
||||||
.PHONY: webex-unstable
|
|
||||||
webex-unstable: i18n
|
|
||||||
$(gulp) unstable
|
|
||||||
|
|
||||||
tsconfig.json: gulpfile.js yarn-install
|
|
||||||
$(gulp) tsconfig
|
|
||||||
|
|
||||||
.PHONY: dist
|
.PHONY: dist
|
||||||
dist:
|
dist:
|
||||||
$(gulp) srcdist
|
git archive --format=tar.gz HEAD -o taler-wallet.tar.gz
|
||||||
|
|
||||||
# make documentation from docstrings
|
# make documentation from docstrings
|
||||||
.PHONY: typedoc
|
.PHONY: typedoc
|
||||||
typedoc:
|
typedoc:
|
||||||
$(typedoc) --out build/typedoc --readme README
|
$(typedoc) --out dist/typedoc --readme README
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
@ -45,20 +32,23 @@ submodules-update:
|
|||||||
|
|
||||||
.PHONY: check
|
.PHONY: check
|
||||||
check: tsc yarn-install
|
check: tsc yarn-install
|
||||||
find dist/node -name '*-test.js' | xargs $(ava)
|
$(ava)
|
||||||
|
|
||||||
.PHONY: coverage
|
.PHONY: coverage
|
||||||
coverage: tsc yarn-install
|
coverage: tsc yarn-install
|
||||||
$(nyc) --all $(ava) 'build/**/*-test.js'
|
$(nyc) --all $(ava) 'build/**/*-test.js'
|
||||||
|
|
||||||
.PHONY: lint
|
|
||||||
lint: tsc yarn-install
|
|
||||||
$(tslint) -e src/i18n/strings.ts --project tsconfig.json -t verbose 'src/**/*.ts' 'src/**/*.tsx'
|
|
||||||
|
|
||||||
.PHONY: yarn-install
|
.PHONY: yarn-install
|
||||||
yarn-install:
|
yarn-install:
|
||||||
$(yarn) install
|
$(yarn) install
|
||||||
|
|
||||||
|
.PHONY: webextensions
|
||||||
|
webextensions: rollup
|
||||||
|
rm -rf dist/wx
|
||||||
|
mkdir dist/wx
|
||||||
|
cp webextension/manifest.json dist/wx/
|
||||||
|
cp -r webextension/static/* dist/wx/
|
||||||
|
cp -r dist/webextension/* dist/wx/
|
||||||
|
|
||||||
.PHONY: i18n
|
.PHONY: i18n
|
||||||
i18n: yarn-install
|
i18n: yarn-install
|
||||||
@ -74,7 +64,7 @@ i18n: yarn-install
|
|||||||
msgmerge -o $$pofile $$pofile src/i18n/$(poname).pot; \
|
msgmerge -o $$pofile $$pofile src/i18n/$(poname).pot; \
|
||||||
done;
|
done;
|
||||||
# generate .ts file containing all translations
|
# generate .ts file containing all translations
|
||||||
$(gulp) po2js
|
./contrib/po2ts
|
||||||
|
|
||||||
# Some commands are only available when ./configure has been run
|
# Some commands are only available when ./configure has been run
|
||||||
|
|
||||||
@ -90,20 +80,7 @@ install: tsc
|
|||||||
$(yarn) global add file://$(CURDIR) --prefix $(prefix)
|
$(yarn) global add file://$(CURDIR) --prefix $(prefix)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: watch
|
|
||||||
watch: tsconfig.json
|
|
||||||
./node_modules/.bin/webpack --watch
|
|
||||||
|
|
||||||
.PHONY: rollup
|
.PHONY: rollup
|
||||||
rollup: tsc
|
rollup: tsc
|
||||||
./node_modules/.bin/rollup -c
|
./node_modules/.bin/rollup -c
|
||||||
|
|
||||||
# Create the node_modules directory for the android wallet
|
|
||||||
package-android:
|
|
||||||
rm -rf dist/android
|
|
||||||
mkdir -p dist/android
|
|
||||||
yarn pack --filename dist/android/taler-wallet.tar.gz
|
|
||||||
cp contrib/package-android.json dist/android/package.json
|
|
||||||
cd dist/android && yarn install
|
|
||||||
#cd dist/android && npm install --global --prefix $(CURDIR)/dist/android $(CURDIR)
|
|
||||||
|
|
||||||
|
352
gulpfile.js
352
gulpfile.js
@ -1,352 +0,0 @@
|
|||||||
/*
|
|
||||||
This file is part of TALER
|
|
||||||
(C) 2015-2016 GNUnet e.V.
|
|
||||||
|
|
||||||
TALER is free software; you can redistribute it and/or modify it under the
|
|
||||||
terms of the GNU General Public License as published by the Free Software
|
|
||||||
Foundation; either version 3, or (at your option) any later version.
|
|
||||||
|
|
||||||
TALER is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along with
|
|
||||||
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run with
|
|
||||||
* $ gulp <taskname>
|
|
||||||
*
|
|
||||||
* The important tasks are:
|
|
||||||
* - tsconfig: generate tsconfig.json file for
|
|
||||||
* development
|
|
||||||
* - package: create Chrome extension zip file in
|
|
||||||
* dist/.
|
|
||||||
*
|
|
||||||
* @author Florian Dold
|
|
||||||
*/
|
|
||||||
|
|
||||||
const gulp = require("gulp");
|
|
||||||
const map = require("map-stream");
|
|
||||||
const zip = require("gulp-zip");
|
|
||||||
const gzip = require("gulp-gzip");
|
|
||||||
const rename = require("gulp-rename");
|
|
||||||
const tar = require("gulp-tar");
|
|
||||||
const glob = require("glob");
|
|
||||||
const jsonTransform = require("gulp-json-transform");
|
|
||||||
const fs = require("fs");
|
|
||||||
const through = require("through2");
|
|
||||||
const File = require("vinyl");
|
|
||||||
const Stream = require("stream").Stream;
|
|
||||||
const vfs = require("vinyl-fs");
|
|
||||||
const webpack = require("webpack");
|
|
||||||
const po2json = require("po2json");
|
|
||||||
const path = require("path");
|
|
||||||
|
|
||||||
const paths = {
|
|
||||||
ts: {
|
|
||||||
src: [
|
|
||||||
"src/**/*.{ts,tsx,js}",
|
|
||||||
"!src/**/*-test*.ts",
|
|
||||||
],
|
|
||||||
test: [
|
|
||||||
"src/**/*-test*.ts",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
// distributed in the chrome extension
|
|
||||||
dist: [
|
|
||||||
"dist/*-bundle.js",
|
|
||||||
"dist/*-bundle.js.map",
|
|
||||||
"img/icon.png",
|
|
||||||
"img/logo.png",
|
|
||||||
"src/webex/**/*.{js,css,html}",
|
|
||||||
],
|
|
||||||
// for the source distribution
|
|
||||||
extra: [
|
|
||||||
"AUTHORS",
|
|
||||||
"COPYING",
|
|
||||||
"Makefile",
|
|
||||||
"README",
|
|
||||||
"configure",
|
|
||||||
"gulpfile.js",
|
|
||||||
"manifest.json",
|
|
||||||
"package.json",
|
|
||||||
"src/i18n/*.po",
|
|
||||||
"src/i18n/*.pot",
|
|
||||||
"src/i18n/poheader",
|
|
||||||
"src/i18n/strings-prelude",
|
|
||||||
"tooling/**",
|
|
||||||
"tsconfig.json",
|
|
||||||
"webpack.config.js",
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const tsBaseArgs = {
|
|
||||||
target: "es6",
|
|
||||||
jsx: "react",
|
|
||||||
reactNamespace: "React",
|
|
||||||
experimentalDecorators: true,
|
|
||||||
module: "commonjs",
|
|
||||||
sourceMap: true,
|
|
||||||
lib: ["es6", "dom"],
|
|
||||||
noImplicitReturns: true,
|
|
||||||
noFallthroughCasesInSwitch: true,
|
|
||||||
strict: true,
|
|
||||||
strictPropertyInitialization: false,
|
|
||||||
outDir: "dist/node",
|
|
||||||
noImplicitAny: true,
|
|
||||||
noImplicitThis: true,
|
|
||||||
allowJs: true,
|
|
||||||
checkJs: true,
|
|
||||||
incremental: true,
|
|
||||||
esModuleInterop: true,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const manifest = JSON.parse(fs.readFileSync("manifest.json", "utf8"));
|
|
||||||
|
|
||||||
|
|
||||||
// Concatenate node streams,
|
|
||||||
// taken from dominictarr's event-stream module
|
|
||||||
function concatStreams (...streams) {
|
|
||||||
var stream = new Stream();
|
|
||||||
stream.setMaxListeners(0); // allow adding more than 11 streams
|
|
||||||
var endCount = 0;
|
|
||||||
stream.writable = stream.readable = true;
|
|
||||||
|
|
||||||
streams.forEach(function (e) {
|
|
||||||
e.pipe(stream, {end: false});
|
|
||||||
var ended = false;
|
|
||||||
e.on('end', function () {
|
|
||||||
if (ended) return;
|
|
||||||
ended = true;
|
|
||||||
endCount++;
|
|
||||||
if (endCount == streams.length)
|
|
||||||
stream.emit('end');
|
|
||||||
})
|
|
||||||
});
|
|
||||||
stream.write = function (data) {
|
|
||||||
this.emit('data', data);
|
|
||||||
};
|
|
||||||
stream.destroy = function () {
|
|
||||||
streams.forEach(function (e) {
|
|
||||||
if (e.destroy) e.destroy();
|
|
||||||
})
|
|
||||||
};
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function dist_prod() {
|
|
||||||
return vfs.src(paths.dist, {base: ".", stripBOM: false})
|
|
||||||
.pipe(gulp.dest("dist/ext/"));
|
|
||||||
}
|
|
||||||
|
|
||||||
function compile_prod(callback) {
|
|
||||||
let config = require("./webpack.config.js")({ mode: "production" });
|
|
||||||
webpack(config, function(err, stats) {
|
|
||||||
if (err) {
|
|
||||||
throw new gutil.PluginError("webpack", err);
|
|
||||||
}
|
|
||||||
if (stats.hasErrors() || stats.hasWarnins) {
|
|
||||||
console.log("[webpack]", stats.toString({
|
|
||||||
colors: true,
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
if (stats.hasErrors()) {
|
|
||||||
callback(Error("webpack completed with errors"))
|
|
||||||
} else {
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function manifest_stable() {
|
|
||||||
return gulp.src("manifest.json")
|
|
||||||
.pipe(jsonTransform((data) => {
|
|
||||||
data.name = "GNU Taler Wallet";
|
|
||||||
return data;
|
|
||||||
}, 2))
|
|
||||||
.pipe(gulp.dest("dist/ext/"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function manifest_unstable() {
|
|
||||||
return gulp.src("manifest.json")
|
|
||||||
.pipe(jsonTransform((data) => {
|
|
||||||
data.name = "GNU Taler Wallet (unstable)";
|
|
||||||
return data;
|
|
||||||
}, 2))
|
|
||||||
.pipe(gulp.dest("dist/ext/"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function package_stable () {
|
|
||||||
let basename = String.prototype.concat("taler-wallet-stable-", manifest.version_name, "-", manifest.version);
|
|
||||||
let zipname = basename + ".zip";
|
|
||||||
let xpiname = basename + ".xpi";
|
|
||||||
return gulp.src("dist/ext/**", {buffer: false, stripBOM: false})
|
|
||||||
.pipe(zip(zipname))
|
|
||||||
.pipe(gulp.dest("dist/"));
|
|
||||||
}
|
|
||||||
|
|
||||||
function package_unstable () {
|
|
||||||
let basename = String.prototype.concat("taler-wallet-unstable-", manifest.version_name, "-", manifest.version);
|
|
||||||
let zipname = basename + ".zip";
|
|
||||||
let xpiname = basename + ".xpi";
|
|
||||||
return gulp.src("dist/ext/**", {buffer: false, stripBOM: false})
|
|
||||||
.pipe(zip(zipname))
|
|
||||||
.pipe(gulp.dest("dist/"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create source distribution.
|
|
||||||
*/
|
|
||||||
function srcdist() {
|
|
||||||
const name = String.prototype.concat("taler-wallet-webex-", manifest.version_name);
|
|
||||||
const opts = {buffer: false, stripBOM: false, base: "."};
|
|
||||||
// We can't just concat patterns due to exclude patterns
|
|
||||||
const files = concatStreams(
|
|
||||||
gulp.src(paths.ts.src, opts),
|
|
||||||
gulp.src(paths.ts.test, opts),
|
|
||||||
gulp.src(paths.dist, opts),
|
|
||||||
gulp.src(paths.extra, opts));
|
|
||||||
|
|
||||||
return files
|
|
||||||
.pipe(rename(function (p) { p.dirname = name + "/" + p.dirname; }))
|
|
||||||
.pipe(tar(name + "-src.tar"))
|
|
||||||
.pipe(gzip())
|
|
||||||
.pipe(gulp.dest("."));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extract .po files from source code
|
|
||||||
*/
|
|
||||||
gulp.task("pogen", function (cb) {
|
|
||||||
throw Error("not yet implemented");
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate a tsconfig.json with the
|
|
||||||
* given compiler options that compiles
|
|
||||||
* all files piped into it.
|
|
||||||
*/
|
|
||||||
function genTSConfig(confBase) {
|
|
||||||
let conf = {
|
|
||||||
compileOnSave: true,
|
|
||||||
compilerOptions: {},
|
|
||||||
files: []
|
|
||||||
};
|
|
||||||
Object.assign(conf.compilerOptions, confBase);
|
|
||||||
return through.obj(function (file, enc, cb) {
|
|
||||||
conf.files.push(file.relative);
|
|
||||||
cb();
|
|
||||||
}, function (cb) {
|
|
||||||
conf.files.sort();
|
|
||||||
let x = JSON.stringify(conf, null, 2);
|
|
||||||
let f = new File({
|
|
||||||
path: "tsconfig.json",
|
|
||||||
contents: Buffer.from(x),
|
|
||||||
});
|
|
||||||
this.push(f);
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the content of a Vinyl file object as a buffer.
|
|
||||||
*/
|
|
||||||
function readContentsBuffer(file, cb) {
|
|
||||||
if (file.isBuffer()) {
|
|
||||||
cb(file.contents);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!file.isStream()) {
|
|
||||||
throw Error("file must be stream or buffer");
|
|
||||||
}
|
|
||||||
const chunks = [];
|
|
||||||
file.contents.on("data", function (chunk) {
|
|
||||||
if (!Buffer.isBuffer(chunk)) {
|
|
||||||
throw Error("stream data must be a buffer");
|
|
||||||
}
|
|
||||||
chunks.push(chunk);
|
|
||||||
});
|
|
||||||
file.contents.on("end", function (chunk) {
|
|
||||||
cb(Buffer.concat(chunks));
|
|
||||||
});
|
|
||||||
file.contents.on("error", function (err) {
|
|
||||||
cb(undefined, err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Combine multiple translations (*.po files) into
|
|
||||||
* one JavaScript file.
|
|
||||||
*/
|
|
||||||
function pofilesToJs(targetPath) {
|
|
||||||
const outStream = through();
|
|
||||||
const f = new File({
|
|
||||||
path: targetPath,
|
|
||||||
contents: outStream,
|
|
||||||
});
|
|
||||||
const prelude = fs.readFileSync("./src/i18n/strings-prelude");
|
|
||||||
outStream.write(prelude);
|
|
||||||
return through.obj(function (file, enc, cb) {
|
|
||||||
console.log("processing file", file);
|
|
||||||
readContentsBuffer(file, function (buf, error) {
|
|
||||||
console.log("got contents");
|
|
||||||
if (error) {
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
const lang = path.basename(file.path, ".po");
|
|
||||||
if (!lang) {
|
|
||||||
throw Error();
|
|
||||||
}
|
|
||||||
console.log("lang", lang);
|
|
||||||
const pojson = po2json.parse(buf, {format: "jed1.x", fuzzy: true});
|
|
||||||
outStream.write("strings['" + lang + "'] = " + JSON.stringify(pojson, null, " ") + ";\n");
|
|
||||||
console.log("...done");
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
}, function (cb) {
|
|
||||||
console.log("processing done");
|
|
||||||
outStream.end();
|
|
||||||
this.push(f);
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function tsconfig() {
|
|
||||||
let opts = {base: "."};
|
|
||||||
const files = concatStreams(
|
|
||||||
vfs.src(paths.ts.src, opts),
|
|
||||||
vfs.src(paths.ts.test, opts));
|
|
||||||
return files.pipe(genTSConfig(tsBaseArgs))
|
|
||||||
.pipe(gulp.dest("."));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function po2js() {
|
|
||||||
return gulp.src("src/i18n/*.po", {base: "."})
|
|
||||||
.pipe(pofilesToJs("src/i18n/strings.ts"))
|
|
||||||
.pipe(gulp.dest("."));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
exports.srcdist = srcdist
|
|
||||||
exports.tsconfig = tsconfig
|
|
||||||
exports.po2js = po2js
|
|
||||||
exports.stable = gulp.series(tsconfig, manifest_stable, compile_prod, dist_prod, package_stable)
|
|
||||||
exports.default = exports.stable
|
|
59
package.json
59
package.json
@ -18,7 +18,8 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "make tsc",
|
"build": "make tsc",
|
||||||
"pretty": "prettier --config .prettierrc --write src",
|
"pretty": "prettier --config .prettierrc --write src",
|
||||||
"test": "ava"
|
"test": "ava",
|
||||||
|
"coverage": "nyc ava"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"AUTHORS",
|
"AUTHORS",
|
||||||
@ -29,52 +30,42 @@
|
|||||||
"src/"
|
"src/"
|
||||||
],
|
],
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@rollup/plugin-json": "^4.0.0",
|
"@ava/typescript": "^1.1.1",
|
||||||
"@types/chrome": "^0.0.91",
|
"@rollup/plugin-json": "^4.0.2",
|
||||||
"@types/react": "^16.4.0",
|
"@rollup/plugin-replace": "^2.3.1",
|
||||||
"@types/react-dom": "^16.0.0",
|
"@types/chrome": "^0.0.103",
|
||||||
|
"@types/react": "^16.9.6",
|
||||||
|
"@types/react-dom": "^16.9.6",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^2.26.0",
|
||||||
|
"@typescript-eslint/parser": "^2.26.0",
|
||||||
"ava": "^3.6.0",
|
"ava": "^3.6.0",
|
||||||
"awesome-typescript-loader": "^5.2.1",
|
"eslint": "^6.8.0",
|
||||||
"glob": "^7.1.1",
|
"eslint-plugin-import": "^2.20.2",
|
||||||
"gulp": "^4.0.0",
|
"eslint-plugin-react": "^7.19.0",
|
||||||
"gulp-gzip": "^1.2.0",
|
"eslint-plugin-react-hooks": "^3.0.0",
|
||||||
"gulp-json-transform": "^0.4.2",
|
|
||||||
"gulp-rename": "^1.2.2",
|
|
||||||
"gulp-tar": "^3.0.0",
|
|
||||||
"gulp-zip": "^5.0.0",
|
|
||||||
"jed": "^1.1.1",
|
"jed": "^1.1.1",
|
||||||
"map-stream": "^0.0.7",
|
|
||||||
"moment": "^2.18.1",
|
"moment": "^2.18.1",
|
||||||
"nyc": "^14.1.1",
|
"nyc": "^15.0.1",
|
||||||
"po2json": "^1.0.0-alpha",
|
"po2json": "^0.4.5",
|
||||||
"pogen": "^0.0.5",
|
"pogen": "^0.0.5",
|
||||||
"prettier": "^2.0.3",
|
"prettier": "^2.0.4",
|
||||||
"react": "^16.8.5",
|
"react": "^16.13.1",
|
||||||
"react-dom": "^16.8.5",
|
"react-dom": "^16.13.1",
|
||||||
"rollup": "^1.27.8",
|
"rollup": "^2.3.3",
|
||||||
"rollup-plugin-commonjs": "^10.1.0",
|
"rollup-plugin-commonjs": "^10.1.0",
|
||||||
"rollup-plugin-node-resolve": "^5.2.0",
|
"rollup-plugin-node-resolve": "^5.2.0",
|
||||||
|
"rollup-plugin-terser": "^5.3.0",
|
||||||
"structured-clone": "^0.2.2",
|
"structured-clone": "^0.2.2",
|
||||||
"terser-webpack-plugin": "^2.2.1",
|
"typedoc": "^0.17.4",
|
||||||
"through2": "3.0.1",
|
"typescript": "^3.8.3"
|
||||||
"tslint": "^5.19.0",
|
|
||||||
"typedoc": "^0.15.0",
|
|
||||||
"typescript": "^3.8.3",
|
|
||||||
"uglify-js": "^3.0.27",
|
|
||||||
"vinyl": "^2.2.0",
|
|
||||||
"vinyl-fs": "^3.0.3",
|
|
||||||
"webpack": "^4.39.3",
|
|
||||||
"webpack-bundle-analyzer": "^3.0.2",
|
|
||||||
"webpack-cli": "^3.1.0",
|
|
||||||
"webpack-merge": "^4.2.2"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ava/typescript": "^1.1.1",
|
|
||||||
"axios": "^0.19.2",
|
"axios": "^0.19.2",
|
||||||
"big-integer": "^1.6.48",
|
"big-integer": "^1.6.48",
|
||||||
"idb-bridge": "^0.0.15",
|
"idb-bridge": "^0.0.15",
|
||||||
"qrcode-generator": "^1.4.3",
|
"qrcode-generator": "^1.4.3",
|
||||||
"source-map-support": "^0.5.12"
|
"source-map-support": "^0.5.12",
|
||||||
|
"tslib": "^1.11.1"
|
||||||
},
|
},
|
||||||
"ava": {
|
"ava": {
|
||||||
"files": [
|
"files": [
|
||||||
|
190
rollup.config.js
190
rollup.config.js
@ -1,56 +1,192 @@
|
|||||||
// rollup.config.js
|
// rollup.config.js
|
||||||
import commonjs from 'rollup-plugin-commonjs';
|
import commonjs from "rollup-plugin-commonjs";
|
||||||
import nodeResolve from 'rollup-plugin-node-resolve';
|
import nodeResolve from "rollup-plugin-node-resolve";
|
||||||
import json from '@rollup/plugin-json';
|
import json from "@rollup/plugin-json";
|
||||||
import builtins from 'builtin-modules'
|
import replace from "@rollup/plugin-replace";
|
||||||
|
import builtins from "builtin-modules";
|
||||||
|
import { terser } from "rollup-plugin-terser";
|
||||||
|
|
||||||
const walletCli = {
|
const walletCli = {
|
||||||
input: 'dist/node/headless/taler-wallet-cli.js',
|
input: "dist/node/headless/taler-wallet-cli.js",
|
||||||
output: {
|
output: {
|
||||||
file: 'dist/standalone/taler-wallet-cli.js',
|
file: "dist/standalone/taler-wallet-cli.js",
|
||||||
format: 'cjs'
|
format: "cjs",
|
||||||
},
|
},
|
||||||
external: builtins,
|
external: builtins,
|
||||||
plugins: [
|
plugins: [
|
||||||
|
commonjs({
|
||||||
|
include: ["node_modules/**", "src/**"],
|
||||||
|
extensions: [".js", ".ts"],
|
||||||
|
ignoreGlobal: false, // Default: false
|
||||||
|
sourceMap: false,
|
||||||
|
ignore: ["taler-wallet"],
|
||||||
|
}),
|
||||||
nodeResolve({
|
nodeResolve({
|
||||||
preferBuiltins: true,
|
preferBuiltins: true,
|
||||||
}),
|
}),
|
||||||
commonjs({
|
|
||||||
include: ['node_modules/**', 'dist/node/**'],
|
|
||||||
extensions: [ '.js' ],
|
|
||||||
ignoreGlobal: false, // Default: false
|
|
||||||
sourceMap: false,
|
|
||||||
ignore: [ 'taler-wallet' ]
|
|
||||||
}),
|
|
||||||
|
|
||||||
json(),
|
json(),
|
||||||
|
],
|
||||||
]
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const walletAndroid = {
|
const walletAndroid = {
|
||||||
input: 'dist/node/android/index.js',
|
input: "dist/node/android/index.js",
|
||||||
output: {
|
output: {
|
||||||
file: 'dist/standalone/taler-wallet-android.js',
|
file: "dist/standalone/taler-wallet-android.js",
|
||||||
format: 'cjs',
|
format: "cjs",
|
||||||
exports: 'named',
|
exports: "named",
|
||||||
},
|
},
|
||||||
external: builtins,
|
external: builtins,
|
||||||
plugins: [
|
plugins: [
|
||||||
json(),
|
json(),
|
||||||
|
|
||||||
nodeResolve({
|
nodeResolve({
|
||||||
preferBuiltins: true
|
preferBuiltins: true,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
commonjs({
|
commonjs({
|
||||||
include: ['node_modules/**', 'dist/node/**'],
|
include: ["node_modules/**", "dist/node/**"],
|
||||||
extensions: [ '.js' ],
|
extensions: [".js"],
|
||||||
ignoreGlobal: false, // Default: false
|
ignoreGlobal: false, // Default: false
|
||||||
sourceMap: false,
|
sourceMap: false,
|
||||||
ignore: [ 'taler-wallet' ]
|
ignore: ["taler-wallet"],
|
||||||
})
|
}),
|
||||||
]
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
export default [walletCli, walletAndroid];
|
const webExtensionPageEntryPoint = {
|
||||||
|
input: "dist/node/webex/pageEntryPoint.js",
|
||||||
|
output: {
|
||||||
|
file: "dist/webextension/pageEntryPoint.js",
|
||||||
|
format: "iife",
|
||||||
|
exports: "default",
|
||||||
|
name: "webExtensionPageEntry",
|
||||||
|
},
|
||||||
|
external: builtins,
|
||||||
|
plugins: [
|
||||||
|
json(),
|
||||||
|
|
||||||
|
nodeResolve({
|
||||||
|
preferBuiltins: true,
|
||||||
|
}),
|
||||||
|
|
||||||
|
terser(),
|
||||||
|
|
||||||
|
replace({
|
||||||
|
"process.env.NODE_ENV": JSON.stringify("production"),
|
||||||
|
}),
|
||||||
|
|
||||||
|
commonjs({
|
||||||
|
include: ["node_modules/**", "dist/node/**"],
|
||||||
|
extensions: [".js"],
|
||||||
|
ignoreGlobal: false, // Default: false
|
||||||
|
sourceMap: false,
|
||||||
|
ignore: ["taler-wallet"],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const webExtensionBackgroundPageScript = {
|
||||||
|
input: "dist/node/webex/background.js",
|
||||||
|
output: {
|
||||||
|
file: "dist/webextension/background.js",
|
||||||
|
format: "iife",
|
||||||
|
exports: "default",
|
||||||
|
name: "webExtensionBackgroundScript",
|
||||||
|
},
|
||||||
|
external: builtins,
|
||||||
|
plugins: [
|
||||||
|
json(),
|
||||||
|
|
||||||
|
nodeResolve({
|
||||||
|
preferBuiltins: true,
|
||||||
|
}),
|
||||||
|
|
||||||
|
terser(),
|
||||||
|
|
||||||
|
replace({
|
||||||
|
"process.env.NODE_ENV": JSON.stringify("production"),
|
||||||
|
}),
|
||||||
|
|
||||||
|
commonjs({
|
||||||
|
include: ["node_modules/**", "dist/node/**"],
|
||||||
|
extensions: [".js"],
|
||||||
|
ignoreGlobal: false, // Default: false
|
||||||
|
sourceMap: false,
|
||||||
|
ignore: ["taler-wallet", "crypto"],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const webExtensionCryptoWorker = {
|
||||||
|
input: "dist/node/crypto/workers/browserWorkerEntry.js",
|
||||||
|
output: {
|
||||||
|
file: "dist/webextension/browserWorkerEntry.js",
|
||||||
|
format: "iife",
|
||||||
|
exports: "default",
|
||||||
|
name: "webExtensionCryptoWorker",
|
||||||
|
},
|
||||||
|
external: builtins,
|
||||||
|
plugins: [
|
||||||
|
json(),
|
||||||
|
|
||||||
|
nodeResolve({
|
||||||
|
preferBuiltins: true,
|
||||||
|
}),
|
||||||
|
|
||||||
|
terser(),
|
||||||
|
|
||||||
|
replace({
|
||||||
|
"process.env.NODE_ENV": JSON.stringify("production"),
|
||||||
|
}),
|
||||||
|
|
||||||
|
commonjs({
|
||||||
|
include: ["node_modules/**", "dist/node/**"],
|
||||||
|
extensions: [".js"],
|
||||||
|
ignoreGlobal: false, // Default: false
|
||||||
|
sourceMap: false,
|
||||||
|
ignore: ["taler-wallet", "crypto"],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const webExtensionContentScript = {
|
||||||
|
input: "dist/node/webex/notify.js",
|
||||||
|
output: {
|
||||||
|
file: "dist/webextension/contentScript.js",
|
||||||
|
format: "iife",
|
||||||
|
exports: "default",
|
||||||
|
name: "webExtensionContentScript",
|
||||||
|
},
|
||||||
|
external: builtins,
|
||||||
|
plugins: [
|
||||||
|
json(),
|
||||||
|
|
||||||
|
nodeResolve({
|
||||||
|
preferBuiltins: true,
|
||||||
|
}),
|
||||||
|
|
||||||
|
terser(),
|
||||||
|
|
||||||
|
replace({
|
||||||
|
"process.env.NODE_ENV": JSON.stringify("production"),
|
||||||
|
}),
|
||||||
|
|
||||||
|
commonjs({
|
||||||
|
include: ["node_modules/**", "dist/node/**"],
|
||||||
|
extensions: [".js"],
|
||||||
|
ignoreGlobal: false, // Default: false
|
||||||
|
sourceMap: false,
|
||||||
|
ignore: ["taler-wallet"],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
export default [
|
||||||
|
walletCli,
|
||||||
|
walletAndroid,
|
||||||
|
webExtensionPageEntryPoint,
|
||||||
|
webExtensionBackgroundPageScript,
|
||||||
|
webExtensionCryptoWorker,
|
||||||
|
webExtensionContentScript,
|
||||||
|
];
|
||||||
|
@ -24,7 +24,7 @@ import {
|
|||||||
DefaultNodeWalletArgs,
|
DefaultNodeWalletArgs,
|
||||||
} from "../headless/helpers";
|
} from "../headless/helpers";
|
||||||
import { openPromise, OpenedPromise } from "../util/promiseUtils";
|
import { openPromise, OpenedPromise } from "../util/promiseUtils";
|
||||||
import fs = require("fs");
|
import fs from "fs";
|
||||||
import {
|
import {
|
||||||
HttpRequestLibrary,
|
HttpRequestLibrary,
|
||||||
HttpResponse,
|
HttpResponse,
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import nacl = require("./nacl-fast");
|
import * as nacl from "./nacl-fast";
|
||||||
import { sha256 } from "./sha256";
|
import { sha256 } from "./sha256";
|
||||||
|
|
||||||
export function sha512(data: Uint8Array): Uint8Array {
|
export function sha512(data: Uint8Array): Uint8Array {
|
||||||
|
@ -3078,16 +3078,16 @@ export function sign_ed25519_pk_to_curve25519(
|
|||||||
(function () {
|
(function () {
|
||||||
// Initialize PRNG if environment provides CSPRNG.
|
// Initialize PRNG if environment provides CSPRNG.
|
||||||
// If not, methods calling randombytes will throw.
|
// If not, methods calling randombytes will throw.
|
||||||
const crypto =
|
const cr =
|
||||||
typeof self !== "undefined" ? self.crypto || (self as any).msCrypto : null;
|
typeof self !== "undefined" ? self.crypto || (self as any).msCrypto : null;
|
||||||
if (crypto && crypto.getRandomValues) {
|
if (cr && cr.getRandomValues) {
|
||||||
// Browsers.
|
// Browsers.
|
||||||
var QUOTA = 65536;
|
var QUOTA = 65536;
|
||||||
setPRNG(function (x: Uint8Array, n: number) {
|
setPRNG(function (x: Uint8Array, n: number) {
|
||||||
var i,
|
var i,
|
||||||
v = new Uint8Array(n);
|
v = new Uint8Array(n);
|
||||||
for (i = 0; i < n; i += QUOTA) {
|
for (i = 0; i < n; i += QUOTA) {
|
||||||
crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));
|
cr.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));
|
||||||
}
|
}
|
||||||
for (i = 0; i < n; i++) x[i] = v[i];
|
for (i = 0; i < n; i++) x[i] = v[i];
|
||||||
cleanup(v);
|
cleanup(v);
|
||||||
|
@ -30,7 +30,7 @@ import {
|
|||||||
rsaVerify,
|
rsaVerify,
|
||||||
} from "./talerCrypto";
|
} from "./talerCrypto";
|
||||||
import { sha512, kdf } from "./primitives/kdf";
|
import { sha512, kdf } from "./primitives/kdf";
|
||||||
import nacl = require("./primitives/nacl-fast");
|
import * as nacl from "./primitives/nacl-fast";
|
||||||
|
|
||||||
function hexToBytes(hex: string) {
|
function hexToBytes(hex: string) {
|
||||||
for (var bytes = [], c = 0; c < hex.length; c += 2)
|
for (var bytes = [], c = 0; c < hex.length; c += 2)
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
* Native implementation of GNU Taler crypto.
|
* Native implementation of GNU Taler crypto.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import nacl = require("./primitives/nacl-fast");
|
import * as nacl from "./primitives/nacl-fast";
|
||||||
import bigint from "big-integer";
|
import bigint from "big-integer";
|
||||||
import { kdf } from "./primitives/kdf";
|
import { kdf } from "./primitives/kdf";
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ export interface CryptoWorkerFactory {
|
|||||||
export class BrowserCryptoWorkerFactory implements CryptoWorkerFactory {
|
export class BrowserCryptoWorkerFactory implements CryptoWorkerFactory {
|
||||||
startWorker(): CryptoWorker {
|
startWorker(): CryptoWorker {
|
||||||
const workerCtor = Worker;
|
const workerCtor = Worker;
|
||||||
const workerPath = "/dist/cryptoWorker-bundle.js";
|
const workerPath = "/dist/webextension/browserWorkerEntry.js";
|
||||||
return new workerCtor(workerPath) as CryptoWorker;
|
return new workerCtor(workerPath) as CryptoWorker;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,7 +206,7 @@ export class CryptoApi {
|
|||||||
};
|
};
|
||||||
this.resetWorkerTimeout(ws);
|
this.resetWorkerTimeout(ws);
|
||||||
work.startTime = timer.performanceNow();
|
work.startTime = timer.performanceNow();
|
||||||
setImmediate(() => ws.w!.postMessage(msg));
|
setTimeout(() => ws.w!.postMessage(msg), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
resetWorkerTimeout(ws: WorkerState) {
|
resetWorkerTimeout(ws: WorkerState) {
|
||||||
|
@ -19,7 +19,7 @@ import { CryptoWorkerFactory } from "./cryptoApi";
|
|||||||
// tslint:disable:no-var-requires
|
// tslint:disable:no-var-requires
|
||||||
|
|
||||||
import { CryptoWorker } from "./cryptoWorker";
|
import { CryptoWorker } from "./cryptoWorker";
|
||||||
import os = require("os");
|
import os from "os";
|
||||||
import { CryptoImplementation } from "./cryptoImplementation";
|
import { CryptoImplementation } from "./cryptoImplementation";
|
||||||
|
|
||||||
const f = __filename;
|
const f = __filename;
|
||||||
|
@ -93,7 +93,7 @@ export class SynchronousCryptoWorker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
setImmediate(() => this.dispatchMessage({ result, id }));
|
setTimeout(() => this.dispatchMessage({ result, id }), 0);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("got error during dispatch", e);
|
console.log("got error during dispatch", e);
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,9 @@
|
|||||||
/**
|
/**
|
||||||
* Imports.
|
* Imports.
|
||||||
*/
|
*/
|
||||||
import process = require("process");
|
import process from "process";
|
||||||
import path = require("path");
|
import path from "path";
|
||||||
import readline = require("readline");
|
import readline from "readline";
|
||||||
|
|
||||||
class Converter<T> {}
|
class Converter<T> {}
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ import { openTalerDatabase } from "../db";
|
|||||||
import { HttpRequestLibrary } from "../util/http";
|
import { HttpRequestLibrary } from "../util/http";
|
||||||
import * as amounts from "../util/amounts";
|
import * as amounts from "../util/amounts";
|
||||||
import { Bank } from "./bank";
|
import { Bank } from "./bank";
|
||||||
import fs = require("fs");
|
import fs from "fs";
|
||||||
import { NodeThreadCryptoWorkerFactory } from "../crypto/workers/nodeThreadWorker";
|
import { NodeThreadCryptoWorkerFactory } from "../crypto/workers/nodeThreadWorker";
|
||||||
import { WalletNotification, NotificationType } from "../types/notifications";
|
import { WalletNotification, NotificationType } from "../types/notifications";
|
||||||
import { Database } from "../util/query";
|
import { Database } from "../util/query";
|
||||||
|
@ -14,13 +14,13 @@
|
|||||||
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import os = require("os");
|
import os from "os";
|
||||||
import fs = require("fs");
|
import fs from "fs";
|
||||||
import { getDefaultNodeWallet, withdrawTestBalance } from "./helpers";
|
import { getDefaultNodeWallet, withdrawTestBalance } from "./helpers";
|
||||||
import { MerchantBackendConnection } from "./merchant";
|
import { MerchantBackendConnection } from "./merchant";
|
||||||
import { runIntegrationTest, runIntegrationTestBasic } from "./integrationtest";
|
import { runIntegrationTest, runIntegrationTestBasic } from "./integrationtest";
|
||||||
import { Wallet } from "../wallet";
|
import { Wallet } from "../wallet";
|
||||||
import qrcodeGenerator = require("qrcode-generator");
|
import qrcodeGenerator from "qrcode-generator";
|
||||||
import * as clk from "./clk";
|
import * as clk from "./clk";
|
||||||
import { BridgeIDBFactory, MemoryBackend } from "idb-bridge";
|
import { BridgeIDBFactory, MemoryBackend } from "idb-bridge";
|
||||||
import { Logger } from "../util/logging";
|
import { Logger } from "../util/logging";
|
||||||
@ -29,17 +29,11 @@ import { decodeCrock } from "../crypto/talerCrypto";
|
|||||||
import { OperationFailedAndReportedError } from "../operations/errors";
|
import { OperationFailedAndReportedError } from "../operations/errors";
|
||||||
import { Bank } from "./bank";
|
import { Bank } from "./bank";
|
||||||
import { classifyTalerUri, TalerUriType } from "../util/taleruri";
|
import { classifyTalerUri, TalerUriType } from "../util/taleruri";
|
||||||
import util = require("util");
|
|
||||||
import { Configuration } from "../util/talerconfig";
|
import { Configuration } from "../util/talerconfig";
|
||||||
import { setDangerousTimetravel } from "../util/time";
|
import { setDangerousTimetravel } from "../util/time";
|
||||||
import { makeCodecForList, codecForString } from "../util/codec";
|
import { makeCodecForList, codecForString } from "../util/codec";
|
||||||
import { NodeHttpLib } from "./NodeHttpLib";
|
import { NodeHttpLib } from "./NodeHttpLib";
|
||||||
|
|
||||||
// Backwards compatibility with nodejs<0.11, where TextEncoder and TextDecoder
|
|
||||||
// are not globals yet.
|
|
||||||
(global as any).TextEncoder = util.TextEncoder;
|
|
||||||
(global as any).TextDecoder = util.TextDecoder;
|
|
||||||
|
|
||||||
const logger = new Logger("taler-wallet-cli.ts");
|
const logger = new Logger("taler-wallet-cli.ts");
|
||||||
|
|
||||||
const defaultWalletDbPath = os.homedir + "/" + ".talerwalletdb.json";
|
const defaultWalletDbPath = os.homedir + "/" + ".talerwalletdb.json";
|
||||||
|
@ -53,9 +53,9 @@ export class InternalWalletState {
|
|||||||
logger.trace("Notification", n);
|
logger.trace("Notification", n);
|
||||||
for (const l of this.listeners) {
|
for (const l of this.listeners) {
|
||||||
const nc = JSON.parse(JSON.stringify(n));
|
const nc = JSON.parse(JSON.stringify(n));
|
||||||
setImmediate(() => {
|
setTimeout(() => {
|
||||||
l(nc);
|
l(nc);
|
||||||
});
|
}, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
/**
|
/**
|
||||||
* Imports.
|
* Imports.
|
||||||
*/
|
*/
|
||||||
import wxApi = require("./wxApi");
|
import * as wxApi from "./wxApi";
|
||||||
|
|
||||||
declare var cloneInto: any;
|
declare var cloneInto: any;
|
||||||
|
|
||||||
|
64
src/webex/pageEntryPoint.ts
Normal file
64
src/webex/pageEntryPoint.ts
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
This file is part of GNU Taler
|
||||||
|
(C) 2020 Taler Systems S.A.
|
||||||
|
|
||||||
|
GNU Taler is free software; you can redistribute it and/or modify it under the
|
||||||
|
terms of the GNU General Public License as published by the Free Software
|
||||||
|
Foundation; either version 3, or (at your option) any later version.
|
||||||
|
|
||||||
|
GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with
|
||||||
|
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main entry point for extension pages.
|
||||||
|
*
|
||||||
|
* @author Florian Dold <dold@taler.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
import ReactDOM from "react-dom";
|
||||||
|
import { createPopup } from "./pages/popup";
|
||||||
|
import { createWithdrawPage } from "./pages/withdraw";
|
||||||
|
import { createWelcomePage } from "./pages/welcome";
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
try {
|
||||||
|
let mainElement;
|
||||||
|
const m = location.pathname.match(/([^/]+)$/);
|
||||||
|
if (!m) {
|
||||||
|
throw Error("can't parse page URL");
|
||||||
|
}
|
||||||
|
const page = m[1];
|
||||||
|
switch (page) {
|
||||||
|
case "popup.html":
|
||||||
|
mainElement = createPopup();
|
||||||
|
break;
|
||||||
|
case "withdraw.html":
|
||||||
|
mainElement = createWithdrawPage();
|
||||||
|
break;
|
||||||
|
case "welcome.html":
|
||||||
|
mainElement = createWelcomePage();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw Error(`page '${page}' not implemented`);
|
||||||
|
}
|
||||||
|
const container = document.getElementById("container");
|
||||||
|
if (!container) {
|
||||||
|
throw Error("container not found, can't mount page contents");
|
||||||
|
}
|
||||||
|
ReactDOM.render(mainElement, container);
|
||||||
|
} catch (e) {
|
||||||
|
console.error("got error", e);
|
||||||
|
document.body.innerText = `Fatal error: "${e.message}". Please report this bug at https://bugs.gnunet.org/.`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (document.readyState === "loading") {
|
||||||
|
document.addEventListener("DOMContentLoaded", main);
|
||||||
|
} else {
|
||||||
|
main();
|
||||||
|
}
|
@ -23,7 +23,6 @@
|
|||||||
import { CurrencyRecord } from "../../types/dbTypes";
|
import { CurrencyRecord } from "../../types/dbTypes";
|
||||||
import { getCurrencies, updateCurrency } from "../wxApi";
|
import { getCurrencies, updateCurrency } from "../wxApi";
|
||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { registerMountPage } from "../renderHtml";
|
|
||||||
|
|
||||||
interface ConfirmAuditorProps {
|
interface ConfirmAuditorProps {
|
||||||
url: string;
|
url: string;
|
||||||
@ -114,7 +113,7 @@ function ConfirmAuditor(props: ConfirmAuditorProps) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
registerMountPage(() => {
|
export function makeAddAuditorPage() {
|
||||||
const walletPageUrl = new URL(document.location.href);
|
const walletPageUrl = new URL(document.location.href);
|
||||||
const url = walletPageUrl.searchParams.get("url");
|
const url = walletPageUrl.searchParams.get("url");
|
||||||
if (!url) {
|
if (!url) {
|
||||||
@ -135,4 +134,4 @@ registerMountPage(() => {
|
|||||||
const expirationStamp = Number.parseInt(auditorStampStr);
|
const expirationStamp = Number.parseInt(auditorStampStr);
|
||||||
const args = { url, currency, auditorPub, expirationStamp };
|
const args = { url, currency, auditorPub, expirationStamp };
|
||||||
return <ConfirmAuditor {...args} />;
|
return <ConfirmAuditor {...args} />;
|
||||||
});
|
}
|
||||||
|
@ -151,8 +151,6 @@ class CurrencyList extends React.Component<{}, CurrencyListState> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function main() {
|
function makeAuditorsPage() {
|
||||||
ReactDOM.render(<CurrencyList />, document.getElementById("container")!);
|
return <CurrencyList />;
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", main);
|
|
||||||
|
@ -27,8 +27,6 @@ import { BenchmarkResult } from "../../types/walletTypes";
|
|||||||
import * as wxApi from "../wxApi";
|
import * as wxApi from "../wxApi";
|
||||||
|
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import * as ReactDOM from "react-dom";
|
|
||||||
import { registerMountPage } from "../renderHtml";
|
|
||||||
|
|
||||||
interface BenchmarkRunnerState {
|
interface BenchmarkRunnerState {
|
||||||
repetitions: number;
|
repetitions: number;
|
||||||
@ -101,6 +99,6 @@ class BenchmarkRunner extends React.Component<any, BenchmarkRunnerState> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
registerMountPage(() => {
|
export function makeBenchmarkPage() {
|
||||||
return <BenchmarkRunner />;
|
return <BenchmarkRunner />;
|
||||||
});
|
}
|
||||||
|
@ -26,7 +26,7 @@ import * as i18n from "../i18n";
|
|||||||
|
|
||||||
import { PreparePayResult } from "../../types/walletTypes";
|
import { PreparePayResult } from "../../types/walletTypes";
|
||||||
|
|
||||||
import { renderAmount, ProgressButton, registerMountPage } from "../renderHtml";
|
import { renderAmount, ProgressButton } from "../renderHtml";
|
||||||
import * as wxApi from "../wxApi";
|
import * as wxApi from "../wxApi";
|
||||||
|
|
||||||
import React, { useState, useEffect } from "react";
|
import React, { useState, useEffect } from "react";
|
||||||
@ -178,11 +178,11 @@ function TalerPayDialog({ talerPayUri }: { talerPayUri: string }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
registerMountPage(() => {
|
export function makePayPage() {
|
||||||
const url = new URL(document.location.href);
|
const url = new URL(document.location.href);
|
||||||
const talerPayUri = url.searchParams.get("talerPayUri");
|
const talerPayUri = url.searchParams.get("talerPayUri");
|
||||||
if (!talerPayUri) {
|
if (!talerPayUri) {
|
||||||
throw Error("invalid parameter");
|
throw Error("invalid parameter");
|
||||||
}
|
}
|
||||||
return <TalerPayDialog talerPayUri={talerPayUri} />;
|
return <TalerPayDialog talerPayUri={talerPayUri} />;
|
||||||
});
|
}
|
@ -23,13 +23,8 @@
|
|||||||
/**
|
/**
|
||||||
* Imports.
|
* Imports.
|
||||||
*/
|
*/
|
||||||
import { ReserveRecord } from "../../types/dbTypes";
|
|
||||||
import { renderAmount, registerMountPage } from "../renderHtml";
|
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import { useState } from "react";
|
|
||||||
|
|
||||||
function Payback() {
|
export function makePaybackPage() {
|
||||||
return <div>not implemented</div>;
|
return <div>not implemented</div>;
|
||||||
}
|
}
|
||||||
|
|
||||||
registerMountPage(() => <Payback />);
|
|
||||||
|
@ -35,7 +35,6 @@ import {
|
|||||||
abbrev,
|
abbrev,
|
||||||
renderAmount,
|
renderAmount,
|
||||||
PageLink,
|
PageLink,
|
||||||
registerMountPage,
|
|
||||||
} from "../renderHtml";
|
} from "../renderHtml";
|
||||||
import * as wxApi from "../wxApi";
|
import * as wxApi from "../wxApi";
|
||||||
|
|
||||||
@ -807,7 +806,7 @@ function WalletPopup() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
registerMountPage(() => {
|
export function createPopup() {
|
||||||
chrome.runtime.connect({ name: "popup" });
|
chrome.runtime.connect({ name: "popup" });
|
||||||
return <WalletPopup />;
|
return <WalletPopup />;
|
||||||
});
|
}
|
@ -1,12 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
|
|
||||||
<script src="/src/webex/pages/redirect.js"></script>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
Redirecting to extension page ...
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,16 +0,0 @@
|
|||||||
/**
|
|
||||||
* This is the entry point for redirects, and should be the only
|
|
||||||
* web-accessible resource declared in the manifest. This prevents
|
|
||||||
* malicious websites from embedding wallet pages in them.
|
|
||||||
*
|
|
||||||
* We still need this redirect page since a webRequest can only directly
|
|
||||||
* redirect to pages inside the extension that are a web-accessible resource.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const myUrl = new URL(window.location.href);
|
|
||||||
const redirectUrl = myUrl.searchParams.get("url");
|
|
||||||
if (!redirectUrl) {
|
|
||||||
console.error("missing redirect URL");
|
|
||||||
} else {
|
|
||||||
window.location.replace(redirectUrl);
|
|
||||||
}
|
|
@ -73,7 +73,7 @@ function RefundStatusView(props: { talerRefundUri: string }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function main() {
|
export function createRefundPage() {
|
||||||
const url = new URL(document.location.href);
|
const url = new URL(document.location.href);
|
||||||
|
|
||||||
const container = document.getElementById("container");
|
const container = document.getElementById("container");
|
||||||
@ -88,10 +88,5 @@ async function main() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReactDOM.render(
|
return <RefundStatusView talerRefundUri={talerRefundUri} />;
|
||||||
<RefundStatusView talerRefundUri={talerRefundUri} />,
|
|
||||||
container,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", () => main());
|
|
||||||
|
@ -21,7 +21,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import * as ReactDOM from "react-dom";
|
|
||||||
|
|
||||||
import * as wxApi from "../wxApi";
|
import * as wxApi from "../wxApi";
|
||||||
|
|
||||||
@ -89,6 +88,6 @@ class ResetNotification extends React.Component<any, State> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", () => {
|
export function createResetRequiredPage() {
|
||||||
ReactDOM.render(<ResetNotification />, document.getElementById("container")!);
|
return <ResetNotification />;
|
||||||
});
|
}
|
||||||
|
@ -310,8 +310,6 @@ class ReturnCoins extends React.Component<{}, ReturnCoinsState> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function main() {
|
export function createReturnCoinsPage() {
|
||||||
ReactDOM.render(<ReturnCoins />, document.getElementById("container")!);
|
return <ReturnCoins />;
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", main);
|
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<title>Taler Wallet: Reserve Created</title>
|
|
||||||
<link rel="stylesheet" type="text/css" href="../style/wallet.css" />
|
|
||||||
<link rel="icon" href="/img/icon.png" />
|
|
||||||
<script src="/dist/page-common-bundle.js"></script>
|
|
||||||
<script src="/dist/show-db-bundle.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>DB Dump</h1>
|
|
||||||
<input type="file" id="fileInput" style="display: none;" />
|
|
||||||
<button id="import">Import Dump</button>
|
|
||||||
<button id="download">Download Dump</button>
|
|
||||||
<pre id="dump"></pre>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,103 +0,0 @@
|
|||||||
/*
|
|
||||||
This file is part of TALER
|
|
||||||
(C) 2015 GNUnet e.V.
|
|
||||||
|
|
||||||
TALER is free software; you can redistribute it and/or modify it under the
|
|
||||||
terms of the GNU General Public License as published by the Free Software
|
|
||||||
Foundation; either version 3, or (at your option) any later version.
|
|
||||||
|
|
||||||
TALER is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along with
|
|
||||||
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wallet database dump for debugging.
|
|
||||||
*
|
|
||||||
* @author Florian Dold
|
|
||||||
*/
|
|
||||||
|
|
||||||
function replacer(
|
|
||||||
match: string,
|
|
||||||
pIndent: string,
|
|
||||||
pKey: string,
|
|
||||||
pVal: string,
|
|
||||||
pEnd: string,
|
|
||||||
) {
|
|
||||||
const key = "<span class=json-key>";
|
|
||||||
const val = "<span class=json-value>";
|
|
||||||
const str = "<span class=json-string>";
|
|
||||||
let r = pIndent || "";
|
|
||||||
if (pKey) {
|
|
||||||
r = r + key + '"' + pKey.replace(/[": ]/g, "") + '":</span> ';
|
|
||||||
}
|
|
||||||
if (pVal) {
|
|
||||||
r = r + (pVal[0] === '"' ? str : val) + pVal + "</span>";
|
|
||||||
}
|
|
||||||
return r + (pEnd || "");
|
|
||||||
}
|
|
||||||
|
|
||||||
function prettyPrint(obj: any) {
|
|
||||||
const jsonLine = /^( *)("[\w]+": )?("[^"]*"|[\w.+-]*)?([,[{])?$/gm;
|
|
||||||
return JSON.stringify(obj, null as any, 3)
|
|
||||||
.replace(/&/g, "&")
|
|
||||||
.replace(/\\"/g, """)
|
|
||||||
.replace(/</g, "<")
|
|
||||||
.replace(/>/g, ">")
|
|
||||||
.replace(jsonLine, replacer);
|
|
||||||
}
|
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", () => {
|
|
||||||
chrome.runtime.sendMessage({ type: "dump-db" }, (resp) => {
|
|
||||||
const el = document.getElementById("dump");
|
|
||||||
if (!el) {
|
|
||||||
throw Error();
|
|
||||||
}
|
|
||||||
el.innerHTML = prettyPrint(resp);
|
|
||||||
|
|
||||||
document.getElementById("download")!.addEventListener("click", (evt) => {
|
|
||||||
console.log("creating download");
|
|
||||||
const element = document.createElement("a");
|
|
||||||
element.setAttribute(
|
|
||||||
"href",
|
|
||||||
"data:text/plain;charset=utf-8," +
|
|
||||||
encodeURIComponent(JSON.stringify(resp)),
|
|
||||||
);
|
|
||||||
element.setAttribute("download", "wallet-dump.txt");
|
|
||||||
element.style.display = "none";
|
|
||||||
document.body.appendChild(element);
|
|
||||||
element.click();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const fileInput = document.getElementById("fileInput")! as HTMLInputElement;
|
|
||||||
fileInput.onchange = (evt) => {
|
|
||||||
if (!fileInput.files || fileInput.files.length !== 1) {
|
|
||||||
alert("please select exactly one file to import");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const file = fileInput.files[0];
|
|
||||||
const fr = new FileReader();
|
|
||||||
fr.onload = (e: any) => {
|
|
||||||
console.log("got file");
|
|
||||||
const dump = JSON.parse(e.target.result);
|
|
||||||
console.log("parsed contents", dump);
|
|
||||||
chrome.runtime.sendMessage(
|
|
||||||
{ type: "import-db", detail: { dump } },
|
|
||||||
(resp) => {
|
|
||||||
alert("loaded");
|
|
||||||
},
|
|
||||||
);
|
|
||||||
};
|
|
||||||
console.log("reading file", file);
|
|
||||||
fr.readAsText(file);
|
|
||||||
};
|
|
||||||
|
|
||||||
document.getElementById("import")!.addEventListener("click", (evt) => {
|
|
||||||
fileInput.click();
|
|
||||||
evt.preventDefault();
|
|
||||||
});
|
|
||||||
});
|
|
@ -100,26 +100,12 @@ function TipDisplay(props: { talerTipUri: string }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function main() {
|
export function createTipPage() {
|
||||||
try {
|
|
||||||
const url = new URL(document.location.href);
|
const url = new URL(document.location.href);
|
||||||
const talerTipUri = url.searchParams.get("talerTipUri");
|
const talerTipUri = url.searchParams.get("talerTipUri");
|
||||||
if (typeof talerTipUri !== "string") {
|
if (typeof talerTipUri !== "string") {
|
||||||
throw Error("talerTipUri must be a string");
|
throw Error("talerTipUri must be a string");
|
||||||
}
|
}
|
||||||
|
|
||||||
ReactDOM.render(
|
return <TipDisplay talerTipUri={talerTipUri} />;
|
||||||
<TipDisplay talerTipUri={talerTipUri} />,
|
|
||||||
document.getElementById("container")!,
|
|
||||||
);
|
|
||||||
} catch (e) {
|
|
||||||
// TODO: provide more context information, maybe factor it out into a
|
|
||||||
// TODO:generic error reporting function or component.
|
|
||||||
document.body.innerText = i18n.str`Fatal error: "${e.message}".`;
|
|
||||||
console.error(`got error "${e.message}"`, e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", () => {
|
|
||||||
main();
|
|
||||||
});
|
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
import React, { useState, useEffect } from "react";
|
import React, { useState, useEffect } from "react";
|
||||||
import { getDiagnostics } from "../wxApi";
|
import { getDiagnostics } from "../wxApi";
|
||||||
import { registerMountPage, PageLink } from "../renderHtml";
|
import { PageLink } from "../renderHtml";
|
||||||
import { WalletDiagnostics } from "../../types/walletTypes";
|
import { WalletDiagnostics } from "../../types/walletTypes";
|
||||||
|
|
||||||
function Diagnostics() {
|
function Diagnostics() {
|
||||||
@ -110,4 +110,6 @@ function Welcome() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
registerMountPage(() => <Welcome />);
|
export function createWelcomePage() {
|
||||||
|
return <Welcome />;
|
||||||
|
}
|
@ -217,6 +217,11 @@ async function main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", () => {
|
export function createWithdrawPage() {
|
||||||
main();
|
const url = new URL(document.location.href);
|
||||||
});
|
const talerWithdrawUri = url.searchParams.get("talerWithdrawUri");
|
||||||
|
if (!talerWithdrawUri) {
|
||||||
|
throw Error("withdraw URI required");
|
||||||
|
}
|
||||||
|
return <NewExchangeSelection talerWithdrawUri={talerWithdrawUri} />;
|
||||||
|
}
|
@ -27,7 +27,6 @@ import { AmountJson } from "../util/amounts";
|
|||||||
import * as Amounts from "../util/amounts";
|
import * as Amounts from "../util/amounts";
|
||||||
import { DenominationRecord } from "../types/dbTypes";
|
import { DenominationRecord } from "../types/dbTypes";
|
||||||
import { ExchangeWithdrawDetails } from "../types/walletTypes";
|
import { ExchangeWithdrawDetails } from "../types/walletTypes";
|
||||||
import * as moment from "moment";
|
|
||||||
import * as i18n from "./i18n";
|
import * as i18n from "./i18n";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import ReactDOM from "react-dom";
|
import ReactDOM from "react-dom";
|
||||||
@ -331,29 +330,6 @@ export function ProgressButton(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function registerMountPage(mainFn: () => React.ReactElement) {
|
|
||||||
async function main() {
|
|
||||||
try {
|
|
||||||
const mainElement = mainFn();
|
|
||||||
const container = document.getElementById("container");
|
|
||||||
if (!container) {
|
|
||||||
throw Error("container not found, can't mount page contents");
|
|
||||||
}
|
|
||||||
ReactDOM.render(mainElement, container);
|
|
||||||
} catch (e) {
|
|
||||||
document.body.innerText = `Fatal error: "${e.message}". Please report this bug at https://bugs.gnunet.org/.`;
|
|
||||||
console.error("got error", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (document.readyState === "loading") {
|
|
||||||
document.addEventListener("DOMContentLoaded", main);
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
main();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function PageLink(props: React.PropsWithChildren<{ pageName: string }>) {
|
export function PageLink(props: React.PropsWithChildren<{ pageName: string }>) {
|
||||||
const url = chrome.extension.getURL(`/src/webex/pages/${props.pageName}`);
|
const url = chrome.extension.getURL(`/src/webex/pages/${props.pageName}`);
|
||||||
return (
|
return (
|
||||||
|
105
tsconfig.json
105
tsconfig.json
@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"compileOnSave": true,
|
"compileOnSave": true,
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "es6",
|
"target": "ES6",
|
||||||
"jsx": "react",
|
"jsx": "react",
|
||||||
"reactNamespace": "React",
|
"reactNamespace": "React",
|
||||||
"experimentalDecorators": true,
|
|
||||||
"module": "commonjs",
|
"module": "commonjs",
|
||||||
|
"moduleResolution": "node",
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"lib": [
|
"lib": [
|
||||||
"es6",
|
"es6",
|
||||||
@ -21,103 +21,8 @@
|
|||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"checkJs": true,
|
"checkJs": true,
|
||||||
"incremental": true,
|
"incremental": true,
|
||||||
"esModuleInterop": true
|
"esModuleInterop": true,
|
||||||
|
"importHelpers": true
|
||||||
},
|
},
|
||||||
"files": [
|
"include": ["src/**/*"]
|
||||||
"src/android/index.ts",
|
|
||||||
"src/crypto/primitives/kdf.ts",
|
|
||||||
"src/crypto/primitives/nacl-fast.ts",
|
|
||||||
"src/crypto/primitives/sha256.ts",
|
|
||||||
"src/crypto/talerCrypto-test.ts",
|
|
||||||
"src/crypto/talerCrypto.ts",
|
|
||||||
"src/crypto/workers/browserWorkerEntry.ts",
|
|
||||||
"src/crypto/workers/cryptoApi.ts",
|
|
||||||
"src/crypto/workers/cryptoImplementation.ts",
|
|
||||||
"src/crypto/workers/cryptoWorker.ts",
|
|
||||||
"src/crypto/workers/nodeThreadWorker.ts",
|
|
||||||
"src/crypto/workers/synchronousWorker.ts",
|
|
||||||
"src/db.ts",
|
|
||||||
"src/headless/NodeHttpLib.ts",
|
|
||||||
"src/headless/bank.ts",
|
|
||||||
"src/headless/clk.ts",
|
|
||||||
"src/headless/helpers.ts",
|
|
||||||
"src/headless/integrationtest.ts",
|
|
||||||
"src/headless/merchant.ts",
|
|
||||||
"src/headless/taler-wallet-cli.ts",
|
|
||||||
"src/i18n/strings.ts",
|
|
||||||
"src/index.ts",
|
|
||||||
"src/operations/balance.ts",
|
|
||||||
"src/operations/errors.ts",
|
|
||||||
"src/operations/exchanges.ts",
|
|
||||||
"src/operations/history.ts",
|
|
||||||
"src/operations/pay.ts",
|
|
||||||
"src/operations/pending.ts",
|
|
||||||
"src/operations/recoup.ts",
|
|
||||||
"src/operations/refresh.ts",
|
|
||||||
"src/operations/refund.ts",
|
|
||||||
"src/operations/reserves.ts",
|
|
||||||
"src/operations/state.ts",
|
|
||||||
"src/operations/tip.ts",
|
|
||||||
"src/operations/versions.ts",
|
|
||||||
"src/operations/withdraw.ts",
|
|
||||||
"src/types/ReserveStatus.ts",
|
|
||||||
"src/types/ReserveTransaction.ts",
|
|
||||||
"src/types/dbTypes.ts",
|
|
||||||
"src/types/history.ts",
|
|
||||||
"src/types/notifications.ts",
|
|
||||||
"src/types/pending.ts",
|
|
||||||
"src/types/schemacore.ts",
|
|
||||||
"src/types/talerTypes.ts",
|
|
||||||
"src/types/types-test.ts",
|
|
||||||
"src/types/walletTypes.ts",
|
|
||||||
"src/util/RequestThrottler.ts",
|
|
||||||
"src/util/amounts.ts",
|
|
||||||
"src/util/assertUnreachable.ts",
|
|
||||||
"src/util/asyncMemo.ts",
|
|
||||||
"src/util/codec-test.ts",
|
|
||||||
"src/util/codec.ts",
|
|
||||||
"src/util/helpers-test.ts",
|
|
||||||
"src/util/helpers.ts",
|
|
||||||
"src/util/http.ts",
|
|
||||||
"src/util/libtoolVersion-test.ts",
|
|
||||||
"src/util/libtoolVersion.ts",
|
|
||||||
"src/util/logging.ts",
|
|
||||||
"src/util/payto-test.ts",
|
|
||||||
"src/util/payto.ts",
|
|
||||||
"src/util/promiseUtils.ts",
|
|
||||||
"src/util/query.ts",
|
|
||||||
"src/util/reserveHistoryUtil-test.ts",
|
|
||||||
"src/util/reserveHistoryUtil.ts",
|
|
||||||
"src/util/talerconfig.ts",
|
|
||||||
"src/util/taleruri-test.ts",
|
|
||||||
"src/util/taleruri.ts",
|
|
||||||
"src/util/time.ts",
|
|
||||||
"src/util/timer.ts",
|
|
||||||
"src/util/wire.ts",
|
|
||||||
"src/wallet-test.ts",
|
|
||||||
"src/wallet.ts",
|
|
||||||
"src/webex/background.ts",
|
|
||||||
"src/webex/chromeBadge.ts",
|
|
||||||
"src/webex/compat.ts",
|
|
||||||
"src/webex/i18n.tsx",
|
|
||||||
"src/webex/messages.ts",
|
|
||||||
"src/webex/notify.ts",
|
|
||||||
"src/webex/pages/add-auditor.tsx",
|
|
||||||
"src/webex/pages/auditors.tsx",
|
|
||||||
"src/webex/pages/benchmark.tsx",
|
|
||||||
"src/webex/pages/pay.tsx",
|
|
||||||
"src/webex/pages/payback.tsx",
|
|
||||||
"src/webex/pages/popup.tsx",
|
|
||||||
"src/webex/pages/redirect.js",
|
|
||||||
"src/webex/pages/refund.tsx",
|
|
||||||
"src/webex/pages/reset-required.tsx",
|
|
||||||
"src/webex/pages/return-coins.tsx",
|
|
||||||
"src/webex/pages/show-db.ts",
|
|
||||||
"src/webex/pages/tip.tsx",
|
|
||||||
"src/webex/pages/welcome.tsx",
|
|
||||||
"src/webex/pages/withdraw.tsx",
|
|
||||||
"src/webex/renderHtml.tsx",
|
|
||||||
"src/webex/wxApi.ts",
|
|
||||||
"src/webex/wxBackend.ts"
|
|
||||||
]
|
|
||||||
}
|
}
|
63
tslint.json
63
tslint.json
@ -1,63 +0,0 @@
|
|||||||
{
|
|
||||||
"defaultSeverity": "error",
|
|
||||||
"extends": [
|
|
||||||
"tslint:recommended"
|
|
||||||
],
|
|
||||||
"jsRules": {},
|
|
||||||
"rules": {
|
|
||||||
"arrow-parens": false,
|
|
||||||
"max-line-length": {
|
|
||||||
"options": [120]
|
|
||||||
},
|
|
||||||
"space-before-function-paren": [true, {"named": "never", "anonymous": "always"}],
|
|
||||||
"no-console": [false],
|
|
||||||
"no-consecutive-blank-lines": [true, 2],
|
|
||||||
"forin": false,
|
|
||||||
"member-access": false,
|
|
||||||
"variable-name": false,
|
|
||||||
"interface-name": false,
|
|
||||||
"max-classes-per-file": false,
|
|
||||||
"ordered-imports": [true,
|
|
||||||
{
|
|
||||||
"import-sources-order": "lowercase-last",
|
|
||||||
"named-imports-order": "lowercase-last"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"no-namespace": false,
|
|
||||||
"member-ordering": false,
|
|
||||||
"array-type": [true, "array-simple"],
|
|
||||||
"class-name": false,
|
|
||||||
"no-bitwise": false,
|
|
||||||
"file-header": [true, "GNU General Public License"],
|
|
||||||
"completed-docs": [true, {
|
|
||||||
"methods": {
|
|
||||||
"privacies": ["public"],
|
|
||||||
"locations": "all"
|
|
||||||
},
|
|
||||||
"properties": {
|
|
||||||
"privacies": ["public"],
|
|
||||||
"locations": ["all"]
|
|
||||||
},
|
|
||||||
"functions": {
|
|
||||||
"visibilities": ["exported"]
|
|
||||||
},
|
|
||||||
"interfaces": {
|
|
||||||
"visibilities": ["exported"]
|
|
||||||
},
|
|
||||||
"types": {
|
|
||||||
"visibilities": ["exported"]
|
|
||||||
},
|
|
||||||
"enums": {
|
|
||||||
"visibilities": ["exported"]
|
|
||||||
},
|
|
||||||
"classes": {
|
|
||||||
"visibilities": ["exported"]
|
|
||||||
},
|
|
||||||
"namespaces": {
|
|
||||||
"visibilities": ["exported"]
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
"no-unused-variable": true
|
|
||||||
},
|
|
||||||
"rulesDirectory": []
|
|
||||||
}
|
|
@ -36,25 +36,21 @@
|
|||||||
"32": "img/icon.png"
|
"32": "img/icon.png"
|
||||||
},
|
},
|
||||||
"default_title": "Taler",
|
"default_title": "Taler",
|
||||||
"default_popup": "src/webex/pages/popup.html"
|
"default_popup": "pages/popup.html"
|
||||||
},
|
},
|
||||||
|
|
||||||
"content_scripts": [
|
"content_scripts": [
|
||||||
{
|
{
|
||||||
"matches": ["*://*/*"],
|
"matches": ["*://*/*"],
|
||||||
"js": [
|
"js": [
|
||||||
"dist/contentScript-bundle.js"
|
"js/contentScript.js"
|
||||||
],
|
],
|
||||||
"run_at": "document_start"
|
"run_at": "document_start"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
"web_accessible_resources": [
|
|
||||||
"src/webex/pages/redirect.html"
|
|
||||||
],
|
|
||||||
|
|
||||||
"background": {
|
"background": {
|
||||||
"page": "src/webex/background.html",
|
"page": "background.html",
|
||||||
"persistent": true
|
"persistent": true
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -9,8 +9,7 @@
|
|||||||
|
|
||||||
<link rel="icon" href="/img/icon.png" />
|
<link rel="icon" href="/img/icon.png" />
|
||||||
|
|
||||||
<script src="/dist/page-common-bundle.js"></script>
|
<script src="/dist/webextension/pageEntryPoint.js"></script>
|
||||||
<script src="/dist/add-auditor-bundle.js"></script>
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.tree-item {
|
.tree-item {
|
@ -8,8 +8,7 @@
|
|||||||
|
|
||||||
<link rel="icon" href="/img/icon.png" />
|
<link rel="icon" href="/img/icon.png" />
|
||||||
|
|
||||||
<script src="/dist/page-common-bundle.js"></script>
|
<script src="/dist/webextension/pageEntryPoint.js"></script>
|
||||||
<script src="/dist/auditors-bundle.js"></script>
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
@ -2,7 +2,7 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<script src="../../dist/background-bundle.js"></script>
|
<script src="/dist/webextension/background.js"></script>
|
||||||
<title>(wallet bg page)</title>
|
<title>(wallet bg page)</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
@ -5,8 +5,7 @@
|
|||||||
<title>Taler Wallet: Benchmarks</title>
|
<title>Taler Wallet: Benchmarks</title>
|
||||||
<link rel="stylesheet" type="text/css" href="../style/wallet.css" />
|
<link rel="stylesheet" type="text/css" href="../style/wallet.css" />
|
||||||
<link rel="icon" href="/img/icon.png" />
|
<link rel="icon" href="/img/icon.png" />
|
||||||
<script src="/dist/page-common-bundle.js"></script>
|
<script src="/dist/webextension/pageEntryPoint.js"></script>
|
||||||
<script src="/dist/benchmark-bundle.js"></script>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<section id="main">
|
<section id="main">
|
Before Width: | Height: | Size: 830 B After Width: | Height: | Size: 830 B |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
@ -9,8 +9,7 @@
|
|||||||
|
|
||||||
<link rel="icon" href="/img/icon.png" />
|
<link rel="icon" href="/img/icon.png" />
|
||||||
|
|
||||||
<script src="/dist/page-common-bundle.js"></script>
|
<script src="/dist/webextension/pageEntryPoint.js"></script>
|
||||||
<script src="/dist/pay-bundle.js"></script>
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
button.accept {
|
button.accept {
|
@ -8,8 +8,7 @@
|
|||||||
|
|
||||||
<link rel="icon" href="/img/icon.png" />
|
<link rel="icon" href="/img/icon.png" />
|
||||||
|
|
||||||
<script src="/dist/page-common-bundle.js"></script>
|
<script src="/dist/webextension/pageEntryPoint.js"></script>
|
||||||
<script src="/dist/payback-bundle.js"></script>
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
@ -6,8 +6,7 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="../style/wallet.css" />
|
<link rel="stylesheet" type="text/css" href="../style/wallet.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="popup.css" />
|
<link rel="stylesheet" type="text/css" href="popup.css" />
|
||||||
|
|
||||||
<script src="/dist/page-common-bundle.js"></script>
|
<script src="/dist/webextension/pageEntryPoint.js"></script>
|
||||||
<script src="/dist/popup-bundle.js"></script>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
@ -8,8 +8,7 @@
|
|||||||
|
|
||||||
<link rel="icon" href="/img/icon.png" />
|
<link rel="icon" href="/img/icon.png" />
|
||||||
|
|
||||||
<script src="/dist/page-common-bundle.js"></script>
|
<script src="/dist/webextension/pageEntryPoint.js"></script>
|
||||||
<script src="/dist/refund-bundle.js"></script>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
@ -8,8 +8,7 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="../style/wallet.css" />
|
<link rel="stylesheet" type="text/css" href="../style/wallet.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="../style/pure.css" />
|
<link rel="stylesheet" type="text/css" href="../style/pure.css" />
|
||||||
|
|
||||||
<script src="/dist/page-common-bundle.js"></script>
|
<script src="/dist/webextension/pageEntryPoint.js"></script>
|
||||||
<script src="/dist/reset-required-bundle.js"></script>
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
@ -9,8 +9,7 @@
|
|||||||
|
|
||||||
<link rel="icon" href="/img/icon.png" />
|
<link rel="icon" href="/img/icon.png" />
|
||||||
|
|
||||||
<script src="/dist/page-common-bundle.js"></script>
|
<script src="/dist/webextension/pageEntryPoint.js"></script>
|
||||||
<script src="/dist/return-coins-bundle.js"></script>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
@ -8,8 +8,7 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="../style/pure.css" />
|
<link rel="stylesheet" type="text/css" href="../style/pure.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="../style/wallet.css" />
|
<link rel="stylesheet" type="text/css" href="../style/wallet.css" />
|
||||||
|
|
||||||
<script src="/dist/page-common-bundle.js"></script>
|
<script src="/dist/webextension/pageEntryPoint.js"></script>
|
||||||
<script src="/dist/tip-bundle.js"></script>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
@ -8,8 +8,7 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="../style/pure.css" />
|
<link rel="stylesheet" type="text/css" href="../style/pure.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="../style/wallet.css" />
|
<link rel="stylesheet" type="text/css" href="../style/wallet.css" />
|
||||||
|
|
||||||
<script src="/dist/page-common-bundle.js"></script>
|
<script src="/dist/webextension/pageEntryPoint.js"></script>
|
||||||
<script src="/dist/welcome-bundle.js"></script>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
@ -8,14 +8,13 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="../style/pure.css" />
|
<link rel="stylesheet" type="text/css" href="../style/pure.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="../style/wallet.css" />
|
<link rel="stylesheet" type="text/css" href="../style/wallet.css" />
|
||||||
|
|
||||||
<script src="/dist/page-common-bundle.js"></script>
|
<script src="/dist/webextension/pageEntryPoint.js"></script>
|
||||||
<script src="/dist/withdraw-bundle.js"></script>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<section id="main">
|
<section id="main">
|
||||||
<h1>GNU Taler Wallet</h1>
|
<h1>GNU Taler Wallet</h1>
|
||||||
<div class="fade" id="exchange-selection"></div>
|
<div class="fade" id="container"></div>
|
||||||
</section>
|
</section>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -1,111 +0,0 @@
|
|||||||
const path = require('path');
|
|
||||||
const webpack = require('webpack');
|
|
||||||
const merge = require('webpack-merge');
|
|
||||||
const { CheckerPlugin } = require('awesome-typescript-loader')
|
|
||||||
const TerserPlugin = require('terser-webpack-plugin');
|
|
||||||
|
|
||||||
|
|
||||||
function externalsCb(context, request, callback) {
|
|
||||||
if (/.*taler-emscripten-lib.*/.test(request)) {
|
|
||||||
callback(null, "undefined");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = function (env) {
|
|
||||||
env = env || {};
|
|
||||||
const base = {
|
|
||||||
output: {
|
|
||||||
filename: '[name]-bundle.js',
|
|
||||||
chunkFilename: "[name]-bundle.js",
|
|
||||||
path: path.resolve(__dirname, "dist"),
|
|
||||||
},
|
|
||||||
module: {
|
|
||||||
noParse: /taler-emscripten-lib/,
|
|
||||||
rules: [
|
|
||||||
{
|
|
||||||
test: /\.tsx?$/,
|
|
||||||
loader: 'awesome-typescript-loader',
|
|
||||||
exclude: /node_modules|taler-emscripten-lib|nodeEmscriptenLoader|synchronousWorker/,
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
resolve: {
|
|
||||||
modules: [path.resolve(__dirname, "./"), "node_modules"],
|
|
||||||
extensions: [".tsx", ".ts", ".js"]
|
|
||||||
},
|
|
||||||
plugins: [
|
|
||||||
new CheckerPlugin(),
|
|
||||||
],
|
|
||||||
devtool: "source-map",
|
|
||||||
externals: [
|
|
||||||
externalsCb,
|
|
||||||
"child_process",
|
|
||||||
],
|
|
||||||
optimization: {
|
|
||||||
minimize: false,
|
|
||||||
minimizer: [
|
|
||||||
new TerserPlugin({
|
|
||||||
sourceMap: true,
|
|
||||||
terserOptions: {
|
|
||||||
keep_classnames: true,
|
|
||||||
keep_fnames: true,
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const configWebWorker = {
|
|
||||||
entry: {"cryptoWorker": "./src/crypto/workers/browserWorkerEntry.ts"},
|
|
||||||
target: "webworker",
|
|
||||||
name: "webworker",
|
|
||||||
};
|
|
||||||
|
|
||||||
const configBackground = {
|
|
||||||
entry: {"background": "./src/webex/background.ts"},
|
|
||||||
name: "background",
|
|
||||||
};
|
|
||||||
|
|
||||||
const configContentScript = {
|
|
||||||
entry: {"contentScript": "./src/webex/notify.ts"},
|
|
||||||
name: "contentScript",
|
|
||||||
};
|
|
||||||
|
|
||||||
const configExtensionPages = {
|
|
||||||
entry: {
|
|
||||||
"add-auditor": "./src/webex/pages/add-auditor.tsx",
|
|
||||||
"auditors": "./src/webex/pages/auditors.tsx",
|
|
||||||
"benchmark": "./src/webex/pages/benchmark.tsx",
|
|
||||||
"pay": "./src/webex/pages/pay.tsx",
|
|
||||||
"withdraw": "./src/webex/pages/withdraw.tsx",
|
|
||||||
"welcome": "./src/webex/pages/welcome.tsx",
|
|
||||||
"payback": "./src/webex/pages/payback.tsx",
|
|
||||||
"popup": "./src/webex/pages/popup.tsx",
|
|
||||||
"reset-required": "./src/webex/pages/reset-required.tsx",
|
|
||||||
"return-coins": "./src/webex/pages/return-coins.tsx",
|
|
||||||
"refund": "./src/webex/pages/refund.tsx",
|
|
||||||
"show-db": "./src/webex/pages/show-db.ts",
|
|
||||||
"tip": "./src/webex/pages/tip.tsx",
|
|
||||||
},
|
|
||||||
name: "pages",
|
|
||||||
optimization: {
|
|
||||||
splitChunks: {
|
|
||||||
cacheGroups: {
|
|
||||||
commons: {
|
|
||||||
name: 'page-common',
|
|
||||||
chunks: 'all',
|
|
||||||
minChunks: 2,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
return [
|
|
||||||
merge(base, configBackground),
|
|
||||||
merge(base, configWebWorker),
|
|
||||||
merge(base, configExtensionPages),
|
|
||||||
merge(base, configContentScript)
|
|
||||||
];
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user