wallet-core/packages/anastasis-webui/build.mjs
2022-12-06 11:21:12 -03:00

148 lines
3.4 KiB
JavaScript
Executable File

#!/usr/bin/env node
/*
This file is part of GNU Anastasis
(C) 2021-2022 Anastasis SARL
GNU Anastasis is free software; you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License as published by the Free Software
Foundation; either version 3, or (at your option) any later version.
GNU Anastasis 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along with
GNU Anastasis; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
/* eslint-disable no-undef */
import esbuild from 'esbuild'
import fs from 'fs';
import path from "path"
import sass from "sass";
// eslint-disable-next-line no-undef
const BASE = process.cwd();
const preact = path.join(
BASE,
"node_modules",
"preact",
"compat",
"dist",
"compat.module.js",
);
const preactCompatPlugin = {
name: "preact-compat",
setup(build) {
build.onResolve({ filter: /^(react-dom|react)$/ }, (args) => {
return {
path: preact,
};
});
},
};
let GIT_ROOT = BASE
while (!fs.existsSync(path.join(GIT_ROOT, '.git')) && GIT_ROOT !== '/') {
GIT_ROOT = path.join(GIT_ROOT, '../')
}
if (GIT_ROOT === '/') {
// eslint-disable-next-line no-undef
console.log("not found")
// eslint-disable-next-line no-undef
process.exit(1);
}
const GIT_HASH = GIT_ROOT === '/' ? undefined : git_hash()
let _package = JSON.parse(fs.readFileSync(path.join(BASE, 'package.json')));
function git_hash() {
const rev = fs.readFileSync(path.join(GIT_ROOT, '.git', 'HEAD')).toString().trim().split(/.*[: ]/).slice(-1)[0];
if (rev.indexOf('/') === -1) {
return rev;
} else {
return fs.readFileSync(path.join(GIT_ROOT, '.git', rev)).toString().trim();
}
}
const DEFAULT_SASS_FILTER = /\.(s[ac]ss|css)$/
const buildSassPlugin = {
name: "custom-build-sass",
setup(build) {
build.onLoad({ filter: DEFAULT_SASS_FILTER }, ({ path: file }) => {
const resolveDir = path.dirname(file)
const { css: contents } = sass.compile(file, { loadPaths: ["./"] })
return {
resolveDir,
loader: 'css',
contents
}
});
},
};
function copyFilesPlugin(options) {
if (!options.basedir) {
options.basedir = process.cwd()
}
return {
name: "copy-files",
setup(build) {
build.onEnd(() => {
for (const fop of options) {
fs.copyFileSync(path.join(options.basedir, fop.src), path.join(options.basedir, fop.dest));
}
});
},
};
}
export const buildConfig = {
entryPoints: ['src/index.ts', 'src/stories.tsx'],
bundle: true,
outdir: 'dist',
minify: false,
loader: {
'.svg': 'dataurl',
'.ttf': 'file',
'.woff': 'file',
'.woff2': 'file',
'.eot': 'file',
},
target: [
'es6'
],
format: 'esm',
platform: 'browser',
sourcemap: true,
jsxFactory: 'h',
jsxFragment: 'Fragment',
define: {
'__VERSION__': `"${_package.version}"`,
'__GIT_HASH__': `"${GIT_HASH}"`,
},
plugins: [
preactCompatPlugin,
copyFilesPlugin([
{
src: "./src/index.html",
dest: "./dist/index.html",
},
]),
buildSassPlugin
],
}
await esbuild.build(buildConfig)