# JavaScript API ## Programmatic Usage of CLI commands All CLI commands are available in `project-watchtower/lib/bin`. They take their parameters as strings: ```ts import build from 'project-watchtower/lib/bin/build' build('server', 'prod') ``` ## React Components ### PageLifecycleProvider See [Page Lifecycle Provider](./page-lifecycle-provider.md) ## Functions, Config and Middleware All functional areas are available as a top-level import from the `project-watchtower` module. However, deep imports are preferred, which is especially important on the client where we don't want unnecessary code bundled up (like WebPack/TypeScript, you probably don't want them in your client bundle in production). The webpack build bundles project-watchtower itself into the server bundle, so it is not required to be present in `node_modules` to run the server. Many functions that are important for development, however, depend on external dependencies that are not included in the webpack bundle and would throw an error if imported statically during production. Components and functions in `/lib/runtime` are safe to statically import in production builds, even if project-watchtower is installed as a `devDependency`, because they have no external dependencies other than the ones listed as required for production in the README. All other functions have to be imported dynamically for development only: ```ts // safe to statically import import { getAssetLocations } from 'project-watchtower/lib/runtime/server' // only safe to use during development if (process.env.START_WATCH_MODE) { const { getHotReloadMiddleware } = require('project-watchtower/lib/server') app.use(getHotReloadMiddleware()) } ``` ### Safe to import in production `project-watchtower/lib/runtime/client` `project-watchtower/lib/runtime/config` ```ts default CONFIG // application configuration ``` `project-watchtower/lib/runtime/server` These dependencies are safe to import into a node server ```ts import { createServer } from 'project-watchtower/lib/runtime/server' import { createSsrMiddleware } from 'project-watchtower/lib/runtime/server/ssr' import { configureStore, rootReducer, AppState } from 'store' import { renderApp } from './render-server' import { renderHtml } from 'server/render-html' export const startServer = () => { return createServer(options?: { /** Early middleware hook is before static middleswares etc */ earlyMiddlewareHook?: (app: express.Express) => void, middlewareHook?: (app: express.Express) => void, callback?: () => void, startListening?: boolean, }) } ``` `project-watchtower/lib/runtime/server/ssr` See [Server Side Rendering](./server-side-rendering.md) ```ts getAssetLocations(): Assets getAbsoluteAssetPath(asset: string): string createServer(options?: { /** Early middleware hook is before static middleswares etc */ earlyMiddlewareHook?: (app: express.Express) => void, middlewareHook?: (app: express.Express) => void, callback?: () => void, startListening?: boolean, }) => express.Express getDefaultHtmlMiddleware() => express.RequestHandler ``` `project-watchtower/lib/runtime/universal` Exposes a number of utilities and helpers which are safe to use on the server or client ### Import for dev only `project-watchtower/lib/build` ```ts getWebpackConfig( target: BuildTarget, environment: BuildEnvironment ): webpack.Configuration merge(...configs: webpack.Configuration[]) => webpack.Configuration[] ``` `project-watchtower/lib/clean` ```ts default clean(paths: string | string[]) => Promise ``` `project-watchtower/lib/config` ```ts base: (buildConfig: BuildConfig) => webpack.Configuration clientBase: (buildConfig: BuildConfig) => webpack.Configuration clientDev: (buildConfig: BuildConfig) => webpack.Configuration clientDebug: (buildConfig: BuildConfig) => webpack.Configuration clientProd: (buildConfig: BuildConfig) => webpack.Configuration serverDev: (buildConfig: BuildConfig) => webpack.Configuration serverDebug: (buildConfig: BuildConfig) => webpack.Configuration serverProd: (buildConfig: BuildConfig) => webpack.Configuration devBase: webpack.Configuration prodBase: webpack.Configuration ``` `project-watchtower/lib/server` ```ts getHotReloadMiddleware(buildConfig: BuildConfig) => express.RequestHandler[] openBrowser(buildConfig: BuildConfig, port?: number) ``` `project-watchtower/lib/stats` ```ts measureBuildStats() => Promise writeBuildStats(metrics: BuildMetrics) => Promise measureAndWriteBuildStats() => Promise ``` ### Types `project-watchtower/lib/types` - `Assets`: Mapping of webpack assets to file locations - `BuildConfig` / `BuildConfigOverride`: Basic configuration for the project