1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2025-12-17 09:37:02 +00:00

Migrate to Yarn & Parcel (#260)

* Switch from npm to yarn
* Add minimum viable parcel dev server config
* Remove webpack configs
* Update docker build, build w/ yarn on node 16.x
This commit is contained in:
James Hillyerd
2022-04-23 13:35:54 -07:00
committed by GitHub
parent 58bcd4f557
commit 06d4120682
17 changed files with 2306 additions and 7986 deletions

View File

@@ -16,17 +16,15 @@ jobs:
with: with:
go-version: 1.17 go-version: 1.17
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v1 uses: actions/setup-node@v3
with: with:
node-version: '14.x' node-version: '16.x'
- name: Setup Elm cache: 'yarn'
uses: jorelali/setup-elm@v2 cache-dependency-path: ui/yarn.lock
with:
elm-version: 0.19.1
- name: Build frontend - name: Build frontend
run: | run: |
npm ci yarn install --frozen-lockfile --non-interactive
npm run build yarn run build
working-directory: ./ui working-directory: ./ui
- name: Test build release - name: Test build release
uses: goreleaser/goreleaser-action@v2 uses: goreleaser/goreleaser-action@v2

1
.gitignore vendored
View File

@@ -52,3 +52,4 @@ repl-temp-*
/ui/dist/ /ui/dist/
# Dependency directories # Dependency directories
/ui/node_modules /ui/node_modules
/ui/.parcel-cache

View File

@@ -6,6 +6,10 @@ This project adheres to [Semantic Versioning](http://semver.org/).
## [Unreleased] ## [Unreleased]
### Changed
- arm Docker builds now rely on amd64 frontend build stage
- Frontend build migrated from npm+webpack to yarn+parcel, node 16
## [v3.0.1-rc2] - 2022-01-23 ## [v3.0.1-rc2] - 2022-01-23

View File

@@ -2,15 +2,13 @@
### Build frontend ### Build frontend
# Due to no official elm compiler for arm; build frontend with amd64. # Due to no official elm compiler for arm; build frontend with amd64.
FROM --platform=linux/amd64 node:14 as frontend FROM --platform=linux/amd64 node:16 as frontend
WORKDIR /build WORKDIR /build
COPY . . COPY . .
WORKDIR /build/ui WORKDIR /build/ui
RUN rm -rf dist elm-stuff node_modules RUN rm -rf .parcel-cache dist elm-stuff node_modules
RUN npm ci RUN yarn install --frozen-lockfile --non-interactive
ADD https://github.com/elm/compiler/releases/download/0.19.1/binary-for-linux-64-bit.gz elm.gz RUN yarn run build
RUN gunzip elm.gz && chmod 755 elm && mv elm /usr/bin/
RUN npm run build
### Build backend ### Build backend
FROM golang:1.17-alpine3.14 as backend FROM golang:1.17-alpine3.14 as backend

View File

@@ -33,14 +33,13 @@ tracks our tagged releases, and `edge` tracks our potentially unstable
## Building from Source ## Building from Source
You will need functioning [Go], [Elm] and [Node.js] installations for this to You will need functioning [Go] and [Node.js] installations for this to work.
work.
```sh ```sh
git clone https://github.com/inbucket/inbucket.git git clone https://github.com/inbucket/inbucket.git
cd inbucket/ui cd inbucket/ui
npm ci yarn install
npm run build yarn build
cd .. cd ..
go build ./cmd/inbucket go build ./cmd/inbucket
``` ```

View File

@@ -13,7 +13,8 @@ stdenv.mkDerivation rec {
elmPackages.elm-test elmPackages.elm-test
go go
golint golint
nodejs-14_x nodejs-16_x
nodePackages.yarn
rpm rpm
swaks swaks
]; ];

4
ui/.parcelrc Normal file
View File

@@ -0,0 +1,4 @@
{
"extends": "@parcel/config-default",
"namers": [ "parcel-namer-rewrite" ]
}

12
ui/.proxyrc.json Normal file
View File

@@ -0,0 +1,12 @@
{
"/api": {
"target": "http://localhost:9000",
"ws": true
},
"/debug": {
"target": "http://localhost:9000"
},
"/serve": {
"target": "http://localhost:9000"
}
}

View File

@@ -11,9 +11,8 @@ One time setup (assuming [Node.js] is already installed):
``` ```
cd $INBUCKET/ui cd $INBUCKET/ui
npm i elm -g yarn install
npm i yarn build
npm run build
``` ```
This will the create `node_modules`, `elm-stuff`, and `dist` directories. This will the create `node_modules`, `elm-stuff`, and `dist` directories.
@@ -30,15 +29,16 @@ Inbucket will start, with HTTP listening on port 9000. You may verify the web
UI is functional if this is your first time building Inbucket, but your dev/test UI is functional if this is your first time building Inbucket, but your dev/test
cycle should favor the development server below. cycle should favor the development server below.
### Terminal 2: webpack development server ### Terminal 2: parcel development server
``` ```
cd $INBUCKET/ui cd $INBUCKET/ui
npm run dev yarn start
``` ```
npm will start a development HTTP server listening on port 3000. You should use yarn will start a development HTTP server listening on port 1234. You should
this server for UI development, as it features hot reload and the Elm debugger. use this server for UI development, as it features hot reload and the Elm
debugger.
[Elm]: https://elm-lang.org [Elm]: https://elm-lang.org
[Node.js]: https://nodejs.org [Node.js]: https://nodejs.org

7849
ui/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,30 +4,29 @@
"license": "MIT", "license": "MIT",
"private": true, "private": true,
"scripts": { "scripts": {
"clean": "rm -rf dist elm-stuff", "build": "parcel build",
"build": "webpack --mode production", "start": "parcel --hmr-port 1235 src/index-dev.html",
"watch": "webpack --mode development --watch", "clean": "rm -rf .parcel-cache dist elm-stuff"
"dev": "webpack-dev-server --mode development --port 3000 --hot --watch",
"errors": "webpack --mode development --display-error-details"
}, },
"dependencies": { "source": "src/index.html",
"opensans-npm-webfont": "^1.0.0" "parcel-namer-rewrite": {
"rules": {
"(.*)\\.(css|js|json|eot|png|svg|ttf|webmanifest|woff|woff2)": "static/$1{.hash}.$2"
}
}, },
"browserslist": "defaults",
"dependencies": {},
"devDependencies": { "devDependencies": {
"@babel/core": "^7.14.8",
"@babel/preset-env": "^7.14.8",
"@fortawesome/fontawesome-free": "^5.15.3", "@fortawesome/fontawesome-free": "^5.15.3",
"@parcel/packager-raw-url": "2.4.1",
"@parcel/transformer-elm": "^2.2.1",
"@parcel/transformer-webmanifest": "2.4.1",
"@webcomponents/webcomponentsjs": "^2.5.0", "@webcomponents/webcomponentsjs": "^2.5.0",
"babel-loader": "^8.2.2", "opensans-npm-webfont": "^1.0.0",
"css-loader": "^4.3.0", "parcel": "^2.4.1",
"elm-hot-webpack-loader": "^1.1.8", "parcel-namer-rewrite": "^2.0.0-rc.2"
"elm-webpack-loader": "^7.0.1", },
"file-loader": "^6.2.0", "optionalDependencies": {
"html-webpack-plugin": "^4.5.2", "elm": "^0.19.1-5"
"node-elm-compiler": "^5.0.6",
"style-loader": "^1.3.0",
"webpack": "^4.46.0",
"webpack-cli": "^3.3.12",
"webpack-dev-server": "^3.11.2"
} }
} }

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -1,15 +1,17 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<!-- This index file will be served by the webpack development server. --> <!-- This index file will be served by the development server. -->
<base href="/"> <base href="/">
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge"> <meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000"> <meta name="theme-color" content="#000000">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0" /> <meta http-equiv="Expires" content="0">
<link rel="icon" type="image/png" href="./favicon.png">
<link rel="manifest" href="./manifest.json">
<title>Inbucket</title> <title>Inbucket</title>
</head> </head>
<body> <body>
@@ -17,5 +19,6 @@
You need to enable JavaScript to run this app. You need to enable JavaScript to run this app.
</noscript> </noscript>
<div id="root"></div> <div id="root"></div>
<script type="module" src="index.js"></script>
</body> </body>
</html> </html>

View File

@@ -6,9 +6,11 @@
<meta http-equiv="x-ua-compatible" content="ie=edge"> <meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000"> <meta name="theme-color" content="#000000">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0" /> <meta http-equiv="Expires" content="0">
<link rel="icon" type="image/png" href="./favicon.png">
<link rel="manifest" href="./manifest.json">
<title>Inbucket</title> <title>Inbucket</title>
</head> </head>
<body> <body>
@@ -16,5 +18,6 @@
You need to enable JavaScript to run this app. You need to enable JavaScript to run this app.
</noscript> </noscript>
<div id="root"></div> <div id="root"></div>
<script type="module" src="index.js"></script>
</body> </body>
</html> </html>

View File

@@ -1,84 +0,0 @@
const HtmlWebpackPlugin = require('html-webpack-plugin')
const webpack = require('webpack')
module.exports = (env, argv) => {
const production = argv.mode === 'production'
const config = {
output: {
filename: 'static/[name].[hash:8].js',
publicPath: '',
},
module: {
rules: [
{
test: /\.js$/,
exclude: [/elm-stuff/, /node_modules/],
loader: 'babel-loader',
query: {
presets: [
'@babel/preset-env',
],
},
},
{
test: /\.elm$/,
exclude: [/elm-stuff/, /node_modules/],
use: [
{ loader: 'elm-hot-webpack-loader' },
{
loader: 'elm-webpack-loader',
options: {
debug: !production,
optimize: production,
},
},
],
},
{
test: /\.css$/,
loader: ['style-loader', 'css-loader'],
},
{
test: /\.(eot|svg|ttf|woff|woff2)$/,
loader: 'file-loader',
options: {
name: 'static/[name].[hash:8].[ext]',
},
},
]
},
plugins: [
new HtmlWebpackPlugin({
template: 'public/index.html',
favicon: 'public/favicon.png',
}),
new HtmlWebpackPlugin({
filename: 'index-dev.html',
template: 'public/index-dev.html',
favicon: 'public/favicon.png',
}),
],
devServer: {
historyApiFallback: {
index: '/index-dev.html',
},
index: 'index-dev.html',
inline: true,
overlay: true,
open: true,
proxy: [{
context: ['/api', '/debug', '/serve'],
target: 'http://localhost:9000',
ws: true,
}],
stats: { colors: true },
watchOptions: {
ignored: /node_modules/,
},
},
}
if (argv.hot) {
config.plugins.push(new webpack.HotModuleReplacementPlugin())
}
return config
}

2231
ui/yarn.lock Normal file

File diff suppressed because it is too large Load Diff