Frontend build fixes (#191)
* copy specific files * replace api host env var * remove unused dotenv * Update frontend/webpack.dev.js Co-authored-by: Ilya Kreymer <ikreymer@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									4190e40964
								
							
						
					
					
						commit
						6fabea3e7a
					
				@ -1,2 +0,0 @@
 | 
			
		||||
API_BASE_URL=https://btrix.webrecorder.net/api
 | 
			
		||||
GLITCHTIP_DSN=
 | 
			
		||||
@ -8,7 +8,13 @@ WORKDIR /app
 | 
			
		||||
COPY package.json .
 | 
			
		||||
COPY yarn.lock .
 | 
			
		||||
RUN yarn --frozen-lockfile
 | 
			
		||||
COPY *.* ./
 | 
			
		||||
 | 
			
		||||
COPY lit-localize.json ./
 | 
			
		||||
COPY postcss.config.js ./
 | 
			
		||||
COPY tailwind.config.js ./
 | 
			
		||||
COPY tsconfig.json ./
 | 
			
		||||
COPY webpack.config.js ./
 | 
			
		||||
COPY webpack.prod.js ./
 | 
			
		||||
COPY src ./src/
 | 
			
		||||
 | 
			
		||||
ARG GIT_COMMIT_HASH
 | 
			
		||||
 | 
			
		||||
@ -2,16 +2,22 @@
 | 
			
		||||
 | 
			
		||||
## Quickstart
 | 
			
		||||
 | 
			
		||||
Install dependencies:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
yarn
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Copy environment variables from the sample file:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
cp sample.env.local .env.local
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Install dependencies:
 | 
			
		||||
Update `API_BASE_URL` in `.env.local` to point to your dev backend API. For example:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
yarn
 | 
			
		||||
```
 | 
			
		||||
API_BASE_URL=http://dev.example.com/api
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Start the dev server:
 | 
			
		||||
@ -27,16 +33,16 @@ follow instructions for deploying to a local Docker instance. Update `API_BASE_U
 | 
			
		||||
 | 
			
		||||
## Scripts
 | 
			
		||||
 | 
			
		||||
| `yarn <name>`      |                                                                     |
 | 
			
		||||
| ------------------ | ------------------------------------------------------------------- |
 | 
			
		||||
| `start`            | runs app in development server, reloading on file changes           |
 | 
			
		||||
| `test`             | runs tests in chromium with playwright                              |
 | 
			
		||||
| `build-dev`        | bundles app and outputs it in `dist` directory                      |
 | 
			
		||||
| `build`            | bundles app, optimized for production, and outputs it to `dist`     |
 | 
			
		||||
| `lint`             | find and fix auto-fixable javascript errors                         |
 | 
			
		||||
| `format`           | formats js, html and css files                                      |
 | 
			
		||||
| `localize:extract` | generate XLIFF file to be translated                                |
 | 
			
		||||
| `localize:build`   | output a localized version of strings/templates                     |
 | 
			
		||||
| `yarn <name>`      |                                                                 |
 | 
			
		||||
| ------------------ | --------------------------------------------------------------- |
 | 
			
		||||
| `start`            | runs app in development server, reloading on file changes       |
 | 
			
		||||
| `test`             | runs tests in chromium with playwright                          |
 | 
			
		||||
| `build-dev`        | bundles app and outputs it in `dist` directory                  |
 | 
			
		||||
| `build`            | bundles app, optimized for production, and outputs it to `dist` |
 | 
			
		||||
| `lint`             | find and fix auto-fixable javascript errors                     |
 | 
			
		||||
| `format`           | formats js, html and css files                                  |
 | 
			
		||||
| `localize:extract` | generate XLIFF file to be translated                            |
 | 
			
		||||
| `localize:build`   | output a localized version of strings/templates                 |
 | 
			
		||||
 | 
			
		||||
## Testing
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -26,7 +26,7 @@
 | 
			
		||||
    "prebuild": "del-cli ./dist",
 | 
			
		||||
    "build": "webpack --config webpack.prod.js",
 | 
			
		||||
    "build-dev": "webpack --mode development",
 | 
			
		||||
    "start": "webpack serve --mode=development",
 | 
			
		||||
    "start": "webpack serve --mode=development --config webpack.dev.js",
 | 
			
		||||
    "lint": "eslint --fix \"src/**/*.{ts,js}\"",
 | 
			
		||||
    "format": "prettier --write \"**/*.{ts,js,html,css}\"",
 | 
			
		||||
    "localize:extract": "lit-localize extract",
 | 
			
		||||
 | 
			
		||||
@ -1,2 +1,2 @@
 | 
			
		||||
API_BASE_URL=https://btrix-dev.webrecorder.net/api
 | 
			
		||||
API_BASE_URL=
 | 
			
		||||
GLITCHTIP_DSN=
 | 
			
		||||
@ -233,7 +233,7 @@ export class Screencast extends LitElement {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const baseURL = `${window.location.protocol === "https:" ? "wss" : "ws"}:${
 | 
			
		||||
      process.env.API_HOST
 | 
			
		||||
      process.env.WEBSOCKET_HOST || window.location.host
 | 
			
		||||
    }/watch/${this.archiveId}/${this.crawlId}`;
 | 
			
		||||
 | 
			
		||||
    this.watchIPs.forEach((ip: string) => {
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,5 @@
 | 
			
		||||
// webpack.config.js
 | 
			
		||||
const path = require("path");
 | 
			
		||||
const webpack = require("webpack");
 | 
			
		||||
const ESLintPlugin = require("eslint-webpack-plugin");
 | 
			
		||||
const HtmlWebpackPlugin = require("html-webpack-plugin");
 | 
			
		||||
const CopyPlugin = require("copy-webpack-plugin");
 | 
			
		||||
@ -11,10 +10,6 @@ const isDevServer = process.env.WEBPACK_SERVE;
 | 
			
		||||
// for testing: for prod, the Dockerfile should have the official prod version used
 | 
			
		||||
const RWP_BASE_URL = process.env.RWP_BASE_URL || "https://replayweb.page/";
 | 
			
		||||
 | 
			
		||||
const dotEnvPath = path.resolve(
 | 
			
		||||
  process.cwd(),
 | 
			
		||||
  `.env${isDevServer ? `.local` : ""}`
 | 
			
		||||
);
 | 
			
		||||
// Get git info to use as Glitchtip release version
 | 
			
		||||
 | 
			
		||||
const execCommand = (cmd, defValue) => {
 | 
			
		||||
@ -35,13 +30,14 @@ const commitHash =
 | 
			
		||||
  process.env.GIT_COMMIT_HASH ||
 | 
			
		||||
  execCommand("git rev-parse --short HEAD", "unknown");
 | 
			
		||||
 | 
			
		||||
const dotEnvPath = path.resolve(
 | 
			
		||||
  process.cwd(),
 | 
			
		||||
  `.env${isDevServer ? `.local` : ""}`
 | 
			
		||||
);
 | 
			
		||||
require("dotenv").config({
 | 
			
		||||
  path: dotEnvPath,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const backendUrl = new URL(
 | 
			
		||||
  process.env.API_BASE_URL || "https://btrix.webrecorder.net/"
 | 
			
		||||
);
 | 
			
		||||
const shoelaceAssetsSrcPath = path.resolve(
 | 
			
		||||
  __dirname,
 | 
			
		||||
  "node_modules/@shoelace-style/shoelace/dist/assets"
 | 
			
		||||
@ -84,48 +80,7 @@ module.exports = {
 | 
			
		||||
    extensions: [".ts", ".js"],
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  devServer: {
 | 
			
		||||
    watchFiles: ["src/*.js"],
 | 
			
		||||
    open: true,
 | 
			
		||||
    compress: true,
 | 
			
		||||
    hot: true,
 | 
			
		||||
    static: [
 | 
			
		||||
      {
 | 
			
		||||
        directory: shoelaceAssetsSrcPath,
 | 
			
		||||
        publicPath: "/" + shoelaceAssetsPublicPath,
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        directory: path.join(__dirname),
 | 
			
		||||
        //publicPath: "/",
 | 
			
		||||
        watch: true,
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
    historyApiFallback: true,
 | 
			
		||||
    proxy: {
 | 
			
		||||
      "/api": {
 | 
			
		||||
        target: backendUrl.href,
 | 
			
		||||
        headers: {
 | 
			
		||||
          Host: backendUrl.host,
 | 
			
		||||
        },
 | 
			
		||||
        pathRewrite: { "^/api": "" },
 | 
			
		||||
        ws: true,
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    // Serve replay service worker file
 | 
			
		||||
    onBeforeSetupMiddleware: (server) => {
 | 
			
		||||
      server.app.get("/replay/sw.js", (req, res) => {
 | 
			
		||||
        res.set("Content-Type", "application/javascript");
 | 
			
		||||
        res.send(`importScripts("${RWP_BASE_URL}sw.js")`);
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
    port: 9870,
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  plugins: [
 | 
			
		||||
    new webpack.DefinePlugin({
 | 
			
		||||
      "process.env.API_HOST": JSON.stringify(backendUrl.host),
 | 
			
		||||
    }),
 | 
			
		||||
 | 
			
		||||
    new HtmlWebpackPlugin({
 | 
			
		||||
      template: "src/index.ejs",
 | 
			
		||||
      templateParameters: {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										64
									
								
								frontend/webpack.dev.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								frontend/webpack.dev.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,64 @@
 | 
			
		||||
const path = require("path");
 | 
			
		||||
const webpack = require("webpack");
 | 
			
		||||
const { merge } = require("webpack-merge");
 | 
			
		||||
 | 
			
		||||
const common = require("./webpack.config.js");
 | 
			
		||||
 | 
			
		||||
// for testing: for prod, the Dockerfile should have the official prod version used
 | 
			
		||||
const RWP_BASE_URL = process.env.RWP_BASE_URL || "https://replayweb.page/";
 | 
			
		||||
 | 
			
		||||
if (!process.env.API_BASE_URL) {
 | 
			
		||||
  throw new Error("To run a dev frontend server, please set the API_BASE_URL pointing to your backend api server in '.env.local'")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const devBackendUrl = new URL(process.env.API_BASE_URL);
 | 
			
		||||
const shoelaceAssetsSrcPath = path.resolve(
 | 
			
		||||
  __dirname,
 | 
			
		||||
  "node_modules/@shoelace-style/shoelace/dist/assets"
 | 
			
		||||
);
 | 
			
		||||
const shoelaceAssetsPublicPath = "shoelace/assets";
 | 
			
		||||
 | 
			
		||||
module.exports = merge(common, {
 | 
			
		||||
  devServer: {
 | 
			
		||||
    watchFiles: ["src/*.js"],
 | 
			
		||||
    open: true,
 | 
			
		||||
    compress: true,
 | 
			
		||||
    hot: true,
 | 
			
		||||
    static: [
 | 
			
		||||
      {
 | 
			
		||||
        directory: shoelaceAssetsSrcPath,
 | 
			
		||||
        publicPath: "/" + shoelaceAssetsPublicPath,
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        directory: path.join(__dirname),
 | 
			
		||||
        //publicPath: "/",
 | 
			
		||||
        watch: true,
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
    historyApiFallback: true,
 | 
			
		||||
    proxy: {
 | 
			
		||||
      "/api": {
 | 
			
		||||
        target: devBackendUrl.href,
 | 
			
		||||
        headers: {
 | 
			
		||||
          Host: devBackendUrl.host,
 | 
			
		||||
        },
 | 
			
		||||
        pathRewrite: { "^/api": "" },
 | 
			
		||||
        ws: true,
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    // Serve replay service worker file
 | 
			
		||||
    onBeforeSetupMiddleware: (server) => {
 | 
			
		||||
      server.app.get("/replay/sw.js", (req, res) => {
 | 
			
		||||
        res.set("Content-Type", "application/javascript");
 | 
			
		||||
        res.send(`importScripts("${RWP_BASE_URL}sw.js")`);
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
    port: 9870,
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  plugins: [
 | 
			
		||||
    new webpack.DefinePlugin({
 | 
			
		||||
      "process.env.WEBSOCKET_HOST": JSON.stringify(devBackendUrl.host),
 | 
			
		||||
    }),
 | 
			
		||||
  ],
 | 
			
		||||
});
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user