@wertarbyte/webapp-server

1.2.1 • Public • Published

Webapp Server

This is a simple almost-static server for webapps. It serves all files from the specified directory but can replace placeholders in index.html with values at runtime, which is perfect for setting API endpoint, Google Maps keys, Sentry DSNs and the like.

CLI usage

In your index.html, specify placeholders:

<head>
  <script type="text/javascript">
    window.MY_APP_CONFIG = {
      apiUrl: "{{ API_URL ?? http://localhost:3000 }}",
      sentryDsn: "{{ SENTRY_DSN }}",
    };
  </script>
</head>

Now you can start the server and set options like this:

webapp-server /path/to/your/files -c API_URL=https://api.your.app -c SENTRY_DSN=12345

You can configure the port and address the server binds to using the corresponding options (-p and --address) or using environment variables ($PORT and $ADDRESS).

Values from the environment

If you don't specify a value for a configuration option, it uses the value of the environment variable with the same name, e.g. the following command will replace {{ USER }} with your name.

webapp-server /path/to/your/files -c USER

This simplifies usage with Docker images as you don't need the verbose -c OPTION=$OPTION -c OTHER_OPTION=$OTHER_OPTION ... but can just enumerate the variables to take into account instead.

Usage as middleware

If you already have a server and want to serve your webapp with it, you can also use this library. Note that environment variables aren't taken into account by default so you need to specify all variables manually.

Express

Register the middleware after creating the express instance. The following example serves files from admin-files at /admin.

const webappServer = require("@wertarbyte/webapp-server");
const app = express();
app.use(
  "/admin",
  webappServer({
    publicPath: path.resolve(process.cwd(), "frontend"),
    variables: {
      API_ENDPOINT: "/",
    },
  })
);

NestJS

Register the middleware after initializing the NestExpressApplication. The following example serves files from frontend for every route that doesn't start with /graphql. This means that you can access the frontend at the root path and still access the GraphQL API.

import * as webappServer from "@wertarbyte/webapp-server";

const app = await NestFactory.create<NestExpressApplication>(YourAppModule);
app.use(
  webappServer({
    publicPath: path.resolve(process.cwd(), "frontend"),
    variables: {
      SERVER_URL: "/",
      SENTRY_DSN: process.env.SENTRY_DSN,
    },
    shouldInterceptRoute: (route) => !/^\/graphql/.test(route),
  })
);

Readme

Keywords

none

Package Sidebar

Install

npm i @wertarbyte/webapp-server

Weekly Downloads

15

Version

1.2.1

License

MIT

Unpacked Size

9.38 kB

Total Files

7

Last publish

Collaborators

  • evidence
  • saschb2b
  • lemaik
  • redbeard0091