@getstrata/bootstrap 2.2.12 → 2.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @getstrata/bootstrap changelog
2
2
 
3
+ ## 2.2.14
4
+
5
+ Complete the scoped HTML rendering starter adoption: generated apps inject ViewRenderer through createViewProvider instead of copying renderPage; welcome pages opt into HTMX fragments with full-page fallbacks, auth retains existing contracts, and CORS preserves representation Vary headers. Includes generator, runtime auth and cache-header regressions.
6
+
7
+ Add optional typed resourceRoutes and strict mergeRouteMaps composition, preserving native Bun routing and app-owned middleware. Add explicit ViewRenderer.namespace prefixes with unchanged layout/Response/HTMX contracts; generated auth controllers use the namespace. Includes native HTTP, compile-time, rendering isolation and generator regressions.
8
+
9
+ ## 2.2.13
10
+
11
+ - Improve view rendering and better htmx support
12
+
3
13
  ## 2.2.12
4
14
 
5
15
  - Require Bun >=1.4.3; align CI, generated/existing example runtime pins and Docker stages to 1.4.3, with bun-types >=1.4.3 behind the official @types/bun shim.
@@ -1,5 +1,14 @@
1
+ import type { WebLayoutDataOptions } from "@getstrata/core/view";
1
2
  import type { ServiceProvider } from "../contracts";
2
3
  declare const CORE_VIEW_TOKEN = "core.view";
3
4
  declare const VIEW_DIRECTORY_CONFIG_KEY = "view.directory";
5
+ interface ViewProviderOptions {
6
+ directory?: string;
7
+ layout?: string | false;
8
+ data?: WebLayoutDataOptions;
9
+ }
10
+ /** Per-app view configuration for generated and custom bootstraps. */
11
+ declare function createViewProvider(options?: ViewProviderOptions): ServiceProvider;
4
12
  declare const viewProvider: ServiceProvider;
5
- export { CORE_VIEW_TOKEN, VIEW_DIRECTORY_CONFIG_KEY, viewProvider };
13
+ export type { ViewProviderOptions };
14
+ export { CORE_VIEW_TOKEN, createViewProvider, VIEW_DIRECTORY_CONFIG_KEY, viewProvider };
@@ -835,15 +835,35 @@ import { currentRequestMeta } from "@getstrata/core/http/requestMetaContext";
835
835
  import { appDisplayName } from "@getstrata/core/runtime/appKeyPrefix";
836
836
  import { isViewsEnabled } from "@getstrata/core/runtime/frontendMode";
837
837
  import {
838
+ CORE_VIEW_RENDERER_TOKEN,
838
839
  configureWebErrorView,
839
840
  configureWebLayoutData,
841
+ createWebLayoutDataResolver,
840
842
  DEFAULT_VIEWS_DIRECTORY,
841
843
  EtaViewEngine,
842
844
  errorTemplateName,
843
- resolveWebLayoutData
845
+ resolveWebLayoutData,
846
+ ViewRenderer
844
847
  } from "@getstrata/core/view";
845
848
  var CORE_VIEW_TOKEN = "core.view";
846
849
  var VIEW_DIRECTORY_CONFIG_KEY = "view.directory";
850
+ function createViewProvider(options = {}) {
851
+ const directory = options.directory;
852
+ const layout = options.layout;
853
+ const data = { ...options.data };
854
+ return {
855
+ name: "view",
856
+ register({ container, config }) {
857
+ if (!isViewsEnabled())
858
+ return;
859
+ const viewsDirectory = directory ?? (process.env.VIEW_DIRECTORY?.trim() || DEFAULT_VIEWS_DIRECTORY);
860
+ config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
861
+ const engine = new EtaViewEngine(viewsDirectory, createWebLayoutDataResolver(container, data));
862
+ container.set(CORE_VIEW_TOKEN, engine);
863
+ container.set(CORE_VIEW_RENDERER_TOKEN, new ViewRenderer(engine, layout));
864
+ }
865
+ };
866
+ }
847
867
  var viewProvider = {
848
868
  name: "view",
849
869
  register({ container, config }) {
@@ -854,6 +874,7 @@ var viewProvider = {
854
874
  config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
855
875
  const engine = new EtaViewEngine(viewsDirectory, (request) => resolveWebLayoutData(container, request ?? currentRequestMeta().request));
856
876
  container.set(CORE_VIEW_TOKEN, engine);
877
+ container.set(CORE_VIEW_RENDERER_TOKEN, new ViewRenderer(engine));
857
878
  configureWebLayoutData({
858
879
  extra: async () => ({
859
880
  appName: appDisplayName(),
@@ -835,15 +835,35 @@ import { currentRequestMeta } from "@getstrata/core/http/requestMetaContext";
835
835
  import { appDisplayName } from "@getstrata/core/runtime/appKeyPrefix";
836
836
  import { isViewsEnabled } from "@getstrata/core/runtime/frontendMode";
837
837
  import {
838
+ CORE_VIEW_RENDERER_TOKEN,
838
839
  configureWebErrorView,
839
840
  configureWebLayoutData,
841
+ createWebLayoutDataResolver,
840
842
  DEFAULT_VIEWS_DIRECTORY,
841
843
  EtaViewEngine,
842
844
  errorTemplateName,
843
- resolveWebLayoutData
845
+ resolveWebLayoutData,
846
+ ViewRenderer
844
847
  } from "@getstrata/core/view";
845
848
  var CORE_VIEW_TOKEN = "core.view";
846
849
  var VIEW_DIRECTORY_CONFIG_KEY = "view.directory";
850
+ function createViewProvider(options = {}) {
851
+ const directory = options.directory;
852
+ const layout = options.layout;
853
+ const data = { ...options.data };
854
+ return {
855
+ name: "view",
856
+ register({ container, config }) {
857
+ if (!isViewsEnabled())
858
+ return;
859
+ const viewsDirectory = directory ?? (process.env.VIEW_DIRECTORY?.trim() || DEFAULT_VIEWS_DIRECTORY);
860
+ config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
861
+ const engine = new EtaViewEngine(viewsDirectory, createWebLayoutDataResolver(container, data));
862
+ container.set(CORE_VIEW_TOKEN, engine);
863
+ container.set(CORE_VIEW_RENDERER_TOKEN, new ViewRenderer(engine, layout));
864
+ }
865
+ };
866
+ }
847
867
  var viewProvider = {
848
868
  name: "view",
849
869
  register({ container, config }) {
@@ -854,6 +874,7 @@ var viewProvider = {
854
874
  config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
855
875
  const engine = new EtaViewEngine(viewsDirectory, (request) => resolveWebLayoutData(container, request ?? currentRequestMeta().request));
856
876
  container.set(CORE_VIEW_TOKEN, engine);
877
+ container.set(CORE_VIEW_RENDERER_TOKEN, new ViewRenderer(engine));
857
878
  configureWebLayoutData({
858
879
  extra: async () => ({
859
880
  appName: appDisplayName(),
@@ -4,15 +4,35 @@ import { currentRequestMeta } from "@getstrata/core/http/requestMetaContext";
4
4
  import { appDisplayName } from "@getstrata/core/runtime/appKeyPrefix";
5
5
  import { isViewsEnabled } from "@getstrata/core/runtime/frontendMode";
6
6
  import {
7
+ CORE_VIEW_RENDERER_TOKEN,
7
8
  configureWebErrorView,
8
9
  configureWebLayoutData,
10
+ createWebLayoutDataResolver,
9
11
  DEFAULT_VIEWS_DIRECTORY,
10
12
  EtaViewEngine,
11
13
  errorTemplateName,
12
- resolveWebLayoutData
14
+ resolveWebLayoutData,
15
+ ViewRenderer
13
16
  } from "@getstrata/core/view";
14
17
  var CORE_VIEW_TOKEN = "core.view";
15
18
  var VIEW_DIRECTORY_CONFIG_KEY = "view.directory";
19
+ function createViewProvider(options = {}) {
20
+ const directory = options.directory;
21
+ const layout = options.layout;
22
+ const data = { ...options.data };
23
+ return {
24
+ name: "view",
25
+ register({ container, config }) {
26
+ if (!isViewsEnabled())
27
+ return;
28
+ const viewsDirectory = directory ?? (process.env.VIEW_DIRECTORY?.trim() || DEFAULT_VIEWS_DIRECTORY);
29
+ config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
30
+ const engine = new EtaViewEngine(viewsDirectory, createWebLayoutDataResolver(container, data));
31
+ container.set(CORE_VIEW_TOKEN, engine);
32
+ container.set(CORE_VIEW_RENDERER_TOKEN, new ViewRenderer(engine, layout));
33
+ }
34
+ };
35
+ }
16
36
  var viewProvider = {
17
37
  name: "view",
18
38
  register({ container, config }) {
@@ -23,6 +43,7 @@ var viewProvider = {
23
43
  config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
24
44
  const engine = new EtaViewEngine(viewsDirectory, (request) => resolveWebLayoutData(container, request ?? currentRequestMeta().request));
25
45
  container.set(CORE_VIEW_TOKEN, engine);
46
+ container.set(CORE_VIEW_RENDERER_TOKEN, new ViewRenderer(engine));
26
47
  configureWebLayoutData({
27
48
  extra: async () => ({
28
49
  appName: appDisplayName(),
@@ -42,5 +63,6 @@ var viewProvider = {
42
63
  export {
43
64
  CORE_VIEW_TOKEN,
44
65
  VIEW_DIRECTORY_CONFIG_KEY,
66
+ createViewProvider,
45
67
  viewProvider
46
68
  };
@@ -820,15 +820,35 @@ import { currentRequestMeta } from "@getstrata/core/http/requestMetaContext";
820
820
  import { appDisplayName } from "@getstrata/core/runtime/appKeyPrefix";
821
821
  import { isViewsEnabled } from "@getstrata/core/runtime/frontendMode";
822
822
  import {
823
+ CORE_VIEW_RENDERER_TOKEN,
823
824
  configureWebErrorView,
824
825
  configureWebLayoutData,
826
+ createWebLayoutDataResolver,
825
827
  DEFAULT_VIEWS_DIRECTORY,
826
828
  EtaViewEngine,
827
829
  errorTemplateName,
828
- resolveWebLayoutData
830
+ resolveWebLayoutData,
831
+ ViewRenderer
829
832
  } from "@getstrata/core/view";
830
833
  var CORE_VIEW_TOKEN = "core.view";
831
834
  var VIEW_DIRECTORY_CONFIG_KEY = "view.directory";
835
+ function createViewProvider(options = {}) {
836
+ const directory = options.directory;
837
+ const layout = options.layout;
838
+ const data = { ...options.data };
839
+ return {
840
+ name: "view",
841
+ register({ container, config }) {
842
+ if (!isViewsEnabled())
843
+ return;
844
+ const viewsDirectory = directory ?? (process.env.VIEW_DIRECTORY?.trim() || DEFAULT_VIEWS_DIRECTORY);
845
+ config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
846
+ const engine = new EtaViewEngine(viewsDirectory, createWebLayoutDataResolver(container, data));
847
+ container.set(CORE_VIEW_TOKEN, engine);
848
+ container.set(CORE_VIEW_RENDERER_TOKEN, new ViewRenderer(engine, layout));
849
+ }
850
+ };
851
+ }
832
852
  var viewProvider = {
833
853
  name: "view",
834
854
  register({ container, config }) {
@@ -839,6 +859,7 @@ var viewProvider = {
839
859
  config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
840
860
  const engine = new EtaViewEngine(viewsDirectory, (request) => resolveWebLayoutData(container, request ?? currentRequestMeta().request));
841
861
  container.set(CORE_VIEW_TOKEN, engine);
862
+ container.set(CORE_VIEW_RENDERER_TOKEN, new ViewRenderer(engine));
842
863
  configureWebLayoutData({
843
864
  extra: async () => ({
844
865
  appName: appDisplayName(),
package/dist/index.js CHANGED
@@ -1263,12 +1263,15 @@ import { currentRequestMeta } from "@getstrata/core/http/requestMetaContext";
1263
1263
  import { appDisplayName } from "@getstrata/core/runtime/appKeyPrefix";
1264
1264
  import { isViewsEnabled as isViewsEnabled2 } from "@getstrata/core/runtime/frontendMode";
1265
1265
  import {
1266
+ CORE_VIEW_RENDERER_TOKEN,
1266
1267
  configureWebErrorView,
1267
1268
  configureWebLayoutData,
1269
+ createWebLayoutDataResolver,
1268
1270
  DEFAULT_VIEWS_DIRECTORY,
1269
1271
  EtaViewEngine,
1270
1272
  errorTemplateName,
1271
- resolveWebLayoutData
1273
+ resolveWebLayoutData,
1274
+ ViewRenderer
1272
1275
  } from "@getstrata/core/view";
1273
1276
  var CORE_VIEW_TOKEN = "core.view";
1274
1277
  var VIEW_DIRECTORY_CONFIG_KEY = "view.directory";
@@ -1282,6 +1285,7 @@ var viewProvider = {
1282
1285
  config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
1283
1286
  const engine = new EtaViewEngine(viewsDirectory, (request) => resolveWebLayoutData(container, request ?? currentRequestMeta().request));
1284
1287
  container.set(CORE_VIEW_TOKEN, engine);
1288
+ container.set(CORE_VIEW_RENDERER_TOKEN, new ViewRenderer(engine));
1285
1289
  configureWebLayoutData({
1286
1290
  extra: async () => ({
1287
1291
  appName: appDisplayName(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/bootstrap",
3
- "version": "2.2.12",
3
+ "version": "2.2.14",
4
4
  "description": "Strata application bootstrap: HttpKernel, DI, web session helpers",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -190,7 +190,7 @@
190
190
  "access": "public"
191
191
  },
192
192
  "peerDependencies": {
193
- "@getstrata/core": "^2.2.12",
193
+ "@getstrata/core": "^2.2.14",
194
194
  "typescript": "^5.9.0 || ^6.0.0 || ^7.0.0"
195
195
  },
196
196
  "engines": {