You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: route applications by host/urlPath declared in the root config
Where an application is served is a deployment concern, not an application concern, but
`host`/`urlPath` were only readable from the config file that declared a plugin. For an
application that is its own `config.yaml`, so the hostname and mount point had to be
checked into the app — unoverridable from outside it (the env-config overlay is
root-config-only).
Worse, `host`/`urlPath` on a root-config *application* entry were silently inert. An
application's plugin scopes read the application's own config.yaml and nothing carried the
root entry's routing down to them, so `deploy_component urlPath=/api` (#1113) persisted a
value that changed nothing. The flow described in #1113 only ever held for a root-declared
*plugin*, whose scope does read the root config.
The root config is now authoritative for where an application is served:
my-app:
host: api.example.com
urlPath: /v1
- `scopeMount.ts` — pure mount model. `host` is replaced outright (an operator remapping a
hostname must win over a value the app shipped). `urlPath` is composed rather than
replaced, because a plugin's `urlPath` doubles as its app-internal base path (static's
asset root, fastify's route prefix); replacing it would silently relocate app-internal
URLs and collapse distinct plugins onto one path. Mount `/v1` + `static: { urlPath:
assets }` → `/v1/assets/`. The composed value is a fixed point of `resolveBaseURLPath`,
so downstream consumers keep resolving it without compounding the prefix.
- Overlaid in `OptionsWatcher`, not at each call site, so `scope.options.getAll()` is the
one effective view of a plugin's config. static's redirects and external paths, the
EntryHandler's entry URLs, and fastify's route prefix are all correct with no changes of
their own. Composed from the freshly-parsed file on every read, so live reload cannot
compound the prefix.
- Applied on both load paths: the root-config `package` recursion and the components-root
directory scan. The scan is the path that matters most — it loads apps with no root
entry at all, so a mount works for a payload-deployed app, not just an installed one.
- `deploy_component` accepts and persists `host` alongside `urlPath`, rejecting a host
that carries a port or path (it would never match the router's host compare).
Also fixes the Scope `server` proxy passing a raw config `urlPath` straight to the router:
a plugin that spreads its whole config section into these options (REST does) handed the
router the literal './', which normalized to the unmatchable route '/.'. The proxy now
resolves whichever source supplied the value.
Documented in HarperFast/documentation#595.
0 commit comments