@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.
|
|
2860
|
-
"@getstrata/cli": "^1.1.
|
|
2861
|
-
"@getstrata/core": "^1.1.
|
|
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
|
|
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(
|
|
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
|
|
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.
|
|
15
|
-
"@getstrata/cli": "^1.1.
|
|
16
|
-
"@getstrata/core": "^1.1.
|
|
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,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 };
|