@getstrata/starter 1.1.0 → 1.1.1

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/dist/cli.js CHANGED
@@ -2856,9 +2856,9 @@ function renderPackageJson(projectName, options = {}) {
2856
2856
  "@getstrata/cli": "workspace:*",
2857
2857
  "@getstrata/core": "workspace:*"
2858
2858
  } : {
2859
- "@getstrata/bootstrap": "^1.1.0",
2860
- "@getstrata/cli": "^1.1.0",
2861
- "@getstrata/core": "^1.1.0"
2859
+ "@getstrata/bootstrap": "^1.1.1",
2860
+ "@getstrata/cli": "^1.1.1",
2861
+ "@getstrata/core": "^1.1.1"
2862
2862
  };
2863
2863
  coreDeps.eta = "^4.6.0";
2864
2864
  if (options.layers?.database === "mysql") {
@@ -4067,7 +4067,8 @@ export default configProvider;
4067
4067
  `;
4068
4068
  }
4069
4069
  function renderQueueProvider() {
4070
- return `import type { ServiceProvider } from "@getstrata/core/contracts/di";
4070
+ return `import { registerDefaultJobs } from "@getstrata/bootstrap/queue/defaultJobs";
4071
+ import type { ServiceProvider } from "@getstrata/core/contracts/di";
4071
4072
  import { CORE_QUEUE_TOKEN } from "@getstrata/core/contracts/serviceTokens";
4072
4073
  import {
4073
4074
  createAppQueue,
@@ -4081,7 +4082,10 @@ const queueProvider: ServiceProvider = {
4081
4082
  const driver = (process.env.QUEUE_DRIVER ?? "sync") as "sync" | "async" | "redis";
4082
4083
  const failedJobs = createFailedJobService();
4083
4084
  container.set(FAILED_JOB_SERVICE_TOKEN, failedJobs);
4084
- container.set(CORE_QUEUE_TOKEN, createAppQueue(driver, process.env.REDIS_URL, failedJobs));
4085
+ container.set(
4086
+ CORE_QUEUE_TOKEN,
4087
+ createAppQueue(driver, process.env.REDIS_URL, failedJobs, registerDefaultJobs),
4088
+ );
4085
4089
  },
4086
4090
  };
4087
4091
 
@@ -4185,7 +4189,9 @@ export default policyProvider;
4185
4189
  `;
4186
4190
  }
4187
4191
  function renderProvidersIndex() {
4188
- return `import type { ServiceProvider } from "@getstrata/core/contracts/di";
4192
+ return `import { discoverListeners } from "@getstrata/bootstrap/discoverListeners";
4193
+ import { registerInvalidateCacheOnModelWriteListeners } from "@getstrata/bootstrap/listeners/invalidateCacheOnModelWrite";
4194
+ import type { ServiceProvider } from "@getstrata/core/contracts/di";
4189
4195
  import authProvider from "./auth.ts";
4190
4196
  import cacheProvider from "./cache.ts";
4191
4197
  import configProvider from "./config.ts";
@@ -4193,6 +4199,30 @@ import policyProvider from "./policy.ts";
4193
4199
  import queueProvider from "./queue.ts";
4194
4200
  import storageProvider from "./storage.ts";
4195
4201
 
4202
+ const registeredListenerGroups = new Set<string>();
4203
+
4204
+ function registerListenerGroup(name: string, register: () => void): void {
4205
+ if (registeredListenerGroups.has(name)) {
4206
+ return;
4207
+ }
4208
+
4209
+ registeredListenerGroups.add(name);
4210
+ register();
4211
+ }
4212
+
4213
+ const listenersProvider: ServiceProvider = {
4214
+ name: "starter.listeners",
4215
+ boot() {
4216
+ registerListenerGroup("cache.invalidate-on-model-write", () => {
4217
+ registerInvalidateCacheOnModelWriteListeners();
4218
+ });
4219
+
4220
+ for (const registerListener of discoverListeners()) {
4221
+ registerListener();
4222
+ }
4223
+ },
4224
+ };
4225
+
4196
4226
  const starterProviders: ServiceProvider[] = [
4197
4227
  configProvider,
4198
4228
  cacheProvider,
@@ -4200,6 +4230,7 @@ const starterProviders: ServiceProvider[] = [
4200
4230
  queueProvider,
4201
4231
  authProvider,
4202
4232
  policyProvider,
4233
+ listenersProvider,
4203
4234
  ];
4204
4235
 
4205
4236
  export { starterProviders };
@@ -4228,6 +4259,7 @@ import {
4228
4259
  import { mergeSpaRoutes } from "@getstrata/bootstrap/createSpaRoutes";
4229
4260
  import {
4230
4261
  configureModulesDirectory,
4262
+ discoverModules,
4231
4263
  ensureModulesLoaded,
4232
4264
  } from "@getstrata/bootstrap/discoverModules";
4233
4265
  import { createHealthRoutes } from "@getstrata/bootstrap/health";
@@ -4286,6 +4318,10 @@ function createAppContext(): AppContext {
4286
4318
  runProviderPhase(starterProviders, "register", context);
4287
4319
  runProviderPhase(starterProviders, "boot", context);
4288
4320
 
4321
+ const moduleProviders = discoverModules().flatMap((module) => module.providers ?? []);
4322
+ runProviderPhase(moduleProviders, "register", context);
4323
+ runProviderPhase(moduleProviders, "boot", context);
4324
+
4289
4325
  assertAppDependenciesComplete(dependencies);
4290
4326
 
4291
4327
  const appContext = { container, config, dependencies: dependencies as AppDependencies };
@@ -11,9 +11,9 @@
11
11
  "check": "tsc --noEmit"
12
12
  },
13
13
  "dependencies": {
14
- "@getstrata/bootstrap": "^1.1.0",
15
- "@getstrata/cli": "^1.1.0",
16
- "@getstrata/core": "^1.1.0",
14
+ "@getstrata/bootstrap": "^1.1.1",
15
+ "@getstrata/cli": "^1.1.1",
16
+ "@getstrata/core": "^1.1.1",
17
17
  "eta": "^4.6.0"
18
18
  },
19
19
  "devDependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/starter",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Interactive create-strata wizard. Choose each layer; one database engine.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,95 +0,0 @@
1
- import { runProviderPhase } from "@getstrata/bootstrap/context";
2
- import {
3
- type AppContext,
4
- type AppDependencies,
5
- type AppRouteMap,
6
- assertAppDependenciesComplete,
7
- type ConfigStore,
8
- type MutableAppDependencies,
9
- type ProviderContext,
10
- ServiceContainer,
11
- } from "@getstrata/bootstrap/contracts";
12
- import { createWebServer } from "@getstrata/bootstrap/web/server";
13
- import { isProductionEnv } from "@getstrata/core/runtime/appEnv";
14
- import { setActiveApplicationContext } from "@getstrata/core/runtime/applicationRegistry";
15
- import { migrate } from "../db/migrate.ts";
16
- import { buildRoutes } from "../routes.ts";
17
- import { loadConfig } from "./config.ts";
18
- import { starterProviders } from "./providers/index.ts";
19
-
20
- export interface BootstrapOptions {
21
- migrate?: boolean;
22
- }
23
-
24
- export interface BootstrappedApp {
25
- context: AppContext;
26
- routes: AppRouteMap;
27
- config: ReturnType<typeof loadConfig>;
28
- }
29
-
30
- class AppConfigStore {
31
- private readonly values = new Map<string, unknown>();
32
-
33
- set<T>(key: string, value: T): T {
34
- this.values.set(key, value);
35
- return value;
36
- }
37
-
38
- get<T>(key: string): T | undefined {
39
- return this.values.get(key) as T | undefined;
40
- }
41
-
42
- require<T>(key: string): T {
43
- const value = this.get<T>(key);
44
- if (value === undefined) {
45
- throw new Error(`Missing required config value "${key}".`);
46
- }
47
- return value;
48
- }
49
-
50
- has(key: string): boolean {
51
- return this.values.has(key);
52
- }
53
- }
54
-
55
- function createAppContext(): AppContext {
56
- const container = new ServiceContainer();
57
- const config = new AppConfigStore() as unknown as ConfigStore;
58
- const dependencies: MutableAppDependencies = { container };
59
- const context: ProviderContext = { container, config, dependencies };
60
-
61
- runProviderPhase(starterProviders, "register", context);
62
- runProviderPhase(starterProviders, "boot", context);
63
-
64
- assertAppDependenciesComplete(dependencies);
65
-
66
- const appContext = { container, config, dependencies: dependencies as AppDependencies };
67
- setActiveApplicationContext(appContext as never);
68
- return appContext;
69
- }
70
-
71
- export async function bootstrapApp(options: BootstrapOptions = {}): Promise<BootstrappedApp> {
72
- const isProduction = isProductionEnv();
73
- const { migrate: runMigrate = !isProduction } = options;
74
-
75
- const appConfig = loadConfig();
76
- const context = createAppContext();
77
-
78
- if (runMigrate) {
79
- await migrate();
80
- }
81
-
82
- const routes = buildRoutes(context.dependencies);
83
-
84
- return { context, routes, config: appConfig };
85
- }
86
-
87
- export function createAppServer(routes: AppRouteMap, port = 0) {
88
- return createWebServer({
89
- port,
90
- publicDir: "./public",
91
- routes,
92
- });
93
- }
94
-
95
- export { createAppContext };