threadforge 0.1.1 → 0.2.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/README.md +52 -20
- package/bin/forge.js +2 -1058
- package/bin/host-commands.d.ts +2 -0
- package/bin/host-commands.d.ts.map +1 -0
- package/bin/host-commands.js +7 -8
- package/bin/platform-commands.d.ts +2 -0
- package/bin/platform-commands.d.ts.map +1 -0
- package/bin/platform-commands.js +118 -36
- package/dist/cli/base-command.d.ts +12 -0
- package/dist/cli/base-command.d.ts.map +1 -0
- package/dist/cli/base-command.js +25 -0
- package/dist/cli/base-command.js.map +1 -0
- package/dist/cli/commands/build.d.ts +10 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +110 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/deploy.d.ts +12 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -0
- package/dist/cli/commands/deploy.js +143 -0
- package/dist/cli/commands/deploy.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +10 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +138 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +10 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +76 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/host.d.ts +8 -0
- package/dist/cli/commands/host.d.ts.map +1 -0
- package/dist/cli/commands/host.js +20 -0
- package/dist/cli/commands/host.js.map +1 -0
- package/dist/cli/commands/init.d.ts +16 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +246 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/platform.d.ts +8 -0
- package/dist/cli/commands/platform.d.ts.map +1 -0
- package/dist/cli/commands/platform.js +20 -0
- package/dist/cli/commands/platform.js.map +1 -0
- package/dist/cli/commands/restart.d.ts +8 -0
- package/dist/cli/commands/restart.d.ts.map +1 -0
- package/dist/cli/commands/restart.js +13 -0
- package/dist/cli/commands/restart.js.map +1 -0
- package/dist/cli/commands/scaffold/frontend.d.ts +10 -0
- package/dist/cli/commands/scaffold/frontend.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/frontend.js +130 -0
- package/dist/cli/commands/scaffold/frontend.js.map +1 -0
- package/dist/cli/commands/scaffold/react.d.ts +7 -0
- package/dist/cli/commands/scaffold/react.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/react.js +12 -0
- package/dist/cli/commands/scaffold/react.js.map +1 -0
- package/dist/cli/commands/scale.d.ts +8 -0
- package/dist/cli/commands/scale.d.ts.map +1 -0
- package/dist/cli/commands/scale.js +13 -0
- package/dist/cli/commands/scale.js.map +1 -0
- package/dist/cli/commands/start.d.ts +10 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +71 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +11 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +60 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +10 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +89 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/util/config-discovery.d.ts +8 -0
- package/dist/cli/util/config-discovery.d.ts.map +1 -0
- package/dist/cli/util/config-discovery.js +70 -0
- package/dist/cli/util/config-discovery.js.map +1 -0
- package/dist/cli/util/config-patcher.d.ts +17 -0
- package/dist/cli/util/config-patcher.d.ts.map +1 -0
- package/dist/cli/util/config-patcher.js +439 -0
- package/dist/cli/util/config-patcher.js.map +1 -0
- package/dist/cli/util/frontend-dev.d.ts +8 -0
- package/dist/cli/util/frontend-dev.d.ts.map +1 -0
- package/dist/cli/util/frontend-dev.js +117 -0
- package/dist/cli/util/frontend-dev.js.map +1 -0
- package/dist/cli/util/process.d.ts +5 -0
- package/dist/cli/util/process.d.ts.map +1 -0
- package/dist/cli/util/process.js +17 -0
- package/dist/cli/util/process.js.map +1 -0
- package/dist/cli/util/templates.d.ts +10 -0
- package/dist/cli/util/templates.d.ts.map +1 -0
- package/dist/cli/util/templates.js +157 -0
- package/dist/cli/util/templates.js.map +1 -0
- package/dist/core/AlertSink.d.ts +83 -0
- package/dist/core/AlertSink.d.ts.map +1 -0
- package/dist/core/AlertSink.js +126 -0
- package/dist/core/AlertSink.js.map +1 -0
- package/dist/core/DirectMessageBus.d.ts +88 -0
- package/dist/core/DirectMessageBus.d.ts.map +1 -0
- package/dist/core/DirectMessageBus.js +352 -0
- package/dist/core/DirectMessageBus.js.map +1 -0
- package/dist/core/EndpointResolver.d.ts +111 -0
- package/dist/core/EndpointResolver.d.ts.map +1 -0
- package/dist/core/EndpointResolver.js +336 -0
- package/dist/core/EndpointResolver.js.map +1 -0
- package/dist/core/ForgeContext.d.ts +221 -0
- package/dist/core/ForgeContext.d.ts.map +1 -0
- package/dist/core/ForgeContext.js +1169 -0
- package/dist/core/ForgeContext.js.map +1 -0
- package/dist/core/ForgeEndpoints.d.ts +71 -0
- package/dist/core/ForgeEndpoints.d.ts.map +1 -0
- package/dist/core/ForgeEndpoints.js +442 -0
- package/dist/core/ForgeEndpoints.js.map +1 -0
- package/dist/core/ForgeHost.d.ts +82 -0
- package/dist/core/ForgeHost.d.ts.map +1 -0
- package/dist/core/ForgeHost.js +107 -0
- package/dist/core/ForgeHost.js.map +1 -0
- package/dist/core/ForgePlatform.d.ts +96 -0
- package/dist/core/ForgePlatform.d.ts.map +1 -0
- package/dist/core/ForgePlatform.js +136 -0
- package/dist/core/ForgePlatform.js.map +1 -0
- package/dist/core/ForgeWebSocket.d.ts +56 -0
- package/dist/core/ForgeWebSocket.d.ts.map +1 -0
- package/dist/core/ForgeWebSocket.js +415 -0
- package/dist/core/ForgeWebSocket.js.map +1 -0
- package/dist/core/Ingress.d.ts +329 -0
- package/dist/core/Ingress.d.ts.map +1 -0
- package/dist/core/Ingress.js +694 -0
- package/dist/core/Ingress.js.map +1 -0
- package/dist/core/Interceptors.d.ts +134 -0
- package/dist/core/Interceptors.d.ts.map +1 -0
- package/dist/core/Interceptors.js +416 -0
- package/dist/core/Interceptors.js.map +1 -0
- package/dist/core/Logger.d.ts +20 -0
- package/dist/core/Logger.d.ts.map +1 -0
- package/dist/core/Logger.js +77 -0
- package/dist/core/Logger.js.map +1 -0
- package/dist/core/MessageBus.d.ts +15 -0
- package/dist/core/MessageBus.d.ts.map +1 -0
- package/dist/core/MessageBus.js +18 -0
- package/dist/core/MessageBus.js.map +1 -0
- package/dist/core/Prometheus.d.ts +80 -0
- package/dist/core/Prometheus.d.ts.map +1 -0
- package/dist/core/Prometheus.js +332 -0
- package/dist/core/Prometheus.js.map +1 -0
- package/dist/core/RequestContext.d.ts +214 -0
- package/dist/core/RequestContext.d.ts.map +1 -0
- package/dist/core/RequestContext.js +556 -0
- package/dist/core/RequestContext.js.map +1 -0
- package/dist/core/Router.d.ts +45 -0
- package/dist/core/Router.d.ts.map +1 -0
- package/dist/core/Router.js +285 -0
- package/dist/core/Router.js.map +1 -0
- package/dist/core/RoutingStrategy.d.ts +116 -0
- package/dist/core/RoutingStrategy.d.ts.map +1 -0
- package/dist/core/RoutingStrategy.js +306 -0
- package/dist/core/RoutingStrategy.js.map +1 -0
- package/dist/core/RpcConfig.d.ts +72 -0
- package/dist/core/RpcConfig.d.ts.map +1 -0
- package/dist/core/RpcConfig.js +127 -0
- package/dist/core/RpcConfig.js.map +1 -0
- package/dist/core/SignatureCache.d.ts +81 -0
- package/dist/core/SignatureCache.d.ts.map +1 -0
- package/dist/core/SignatureCache.js +172 -0
- package/dist/core/SignatureCache.js.map +1 -0
- package/dist/core/StaticFileServer.d.ts +34 -0
- package/dist/core/StaticFileServer.d.ts.map +1 -0
- package/dist/core/StaticFileServer.js +497 -0
- package/dist/core/StaticFileServer.js.map +1 -0
- package/dist/core/Supervisor.d.ts +198 -0
- package/dist/core/Supervisor.d.ts.map +1 -0
- package/dist/core/Supervisor.js +1418 -0
- package/dist/core/Supervisor.js.map +1 -0
- package/dist/core/ThreadAllocator.d.ts +52 -0
- package/dist/core/ThreadAllocator.d.ts.map +1 -0
- package/dist/core/ThreadAllocator.js +174 -0
- package/dist/core/ThreadAllocator.js.map +1 -0
- package/dist/core/WorkerChannelManager.d.ts +130 -0
- package/dist/core/WorkerChannelManager.d.ts.map +1 -0
- package/dist/core/WorkerChannelManager.js +956 -0
- package/dist/core/WorkerChannelManager.js.map +1 -0
- package/dist/core/config-enums.d.ts +41 -0
- package/dist/core/config-enums.d.ts.map +1 -0
- package/dist/core/config-enums.js +59 -0
- package/dist/core/config-enums.js.map +1 -0
- package/dist/core/config.d.ts +159 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +694 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/host-config.d.ts +146 -0
- package/dist/core/host-config.d.ts.map +1 -0
- package/dist/core/host-config.js +312 -0
- package/dist/core/host-config.js.map +1 -0
- package/dist/core/ipc-errors.d.ts +27 -0
- package/dist/core/ipc-errors.d.ts.map +1 -0
- package/dist/core/ipc-errors.js +36 -0
- package/dist/core/ipc-errors.js.map +1 -0
- package/dist/core/network-utils.d.ts +35 -0
- package/dist/core/network-utils.d.ts.map +1 -0
- package/dist/core/network-utils.js +145 -0
- package/dist/core/network-utils.js.map +1 -0
- package/dist/core/platform-config.d.ts +142 -0
- package/dist/core/platform-config.d.ts.map +1 -0
- package/dist/core/platform-config.js +299 -0
- package/dist/core/platform-config.js.map +1 -0
- package/dist/decorators/ServiceProxy.d.ts +175 -0
- package/dist/decorators/ServiceProxy.d.ts.map +1 -0
- package/dist/decorators/ServiceProxy.js +969 -0
- package/dist/decorators/ServiceProxy.js.map +1 -0
- package/dist/decorators/index.d.ts +146 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +545 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/deploy/NginxGenerator.d.ts +165 -0
- package/dist/deploy/NginxGenerator.d.ts.map +1 -0
- package/dist/deploy/NginxGenerator.js +781 -0
- package/dist/deploy/NginxGenerator.js.map +1 -0
- package/dist/deploy/PlatformManifestGenerator.d.ts +43 -0
- package/dist/deploy/PlatformManifestGenerator.d.ts.map +1 -0
- package/dist/deploy/PlatformManifestGenerator.js +80 -0
- package/dist/deploy/PlatformManifestGenerator.js.map +1 -0
- package/dist/deploy/RouteManifestGenerator.d.ts +42 -0
- package/dist/deploy/RouteManifestGenerator.d.ts.map +1 -0
- package/dist/deploy/RouteManifestGenerator.js +105 -0
- package/dist/deploy/RouteManifestGenerator.js.map +1 -0
- package/dist/deploy/index.d.ts +210 -0
- package/dist/deploy/index.d.ts.map +1 -0
- package/dist/deploy/index.js +918 -0
- package/dist/deploy/index.js.map +1 -0
- package/dist/frontend/FrontendDevLifecycle.d.ts +26 -0
- package/dist/frontend/FrontendDevLifecycle.d.ts.map +1 -0
- package/dist/frontend/FrontendDevLifecycle.js +60 -0
- package/dist/frontend/FrontendDevLifecycle.js.map +1 -0
- package/dist/frontend/FrontendPluginOrchestrator.d.ts +64 -0
- package/dist/frontend/FrontendPluginOrchestrator.d.ts.map +1 -0
- package/dist/frontend/FrontendPluginOrchestrator.js +167 -0
- package/dist/frontend/FrontendPluginOrchestrator.js.map +1 -0
- package/dist/frontend/SiteResolver.d.ts +33 -0
- package/dist/frontend/SiteResolver.d.ts.map +1 -0
- package/dist/frontend/SiteResolver.js +53 -0
- package/dist/frontend/SiteResolver.js.map +1 -0
- package/dist/frontend/StaticMountRegistry.d.ts +36 -0
- package/dist/frontend/StaticMountRegistry.d.ts.map +1 -0
- package/dist/frontend/StaticMountRegistry.js +94 -0
- package/dist/frontend/StaticMountRegistry.js.map +1 -0
- package/dist/frontend/index.d.ts +7 -0
- package/dist/frontend/index.d.ts.map +1 -0
- package/{src → dist}/frontend/index.js +4 -2
- package/dist/frontend/index.js.map +1 -0
- package/dist/frontend/pathUtils.d.ts +8 -0
- package/dist/frontend/pathUtils.d.ts.map +1 -0
- package/dist/frontend/pathUtils.js +17 -0
- package/dist/frontend/pathUtils.js.map +1 -0
- package/dist/frontend/plugins/index.d.ts +2 -0
- package/dist/frontend/plugins/index.d.ts.map +1 -0
- package/{src → dist}/frontend/plugins/index.js +1 -1
- package/dist/frontend/plugins/index.js.map +1 -0
- package/dist/frontend/plugins/viteFrontend.d.ts +51 -0
- package/dist/frontend/plugins/viteFrontend.d.ts.map +1 -0
- package/dist/frontend/plugins/viteFrontend.js +134 -0
- package/dist/frontend/plugins/viteFrontend.js.map +1 -0
- package/dist/frontend/types.d.ts +25 -0
- package/dist/frontend/types.d.ts.map +1 -0
- package/dist/frontend/types.js +2 -0
- package/dist/frontend/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/internals.d.ts +21 -0
- package/dist/internals.d.ts.map +1 -0
- package/{src → dist}/internals.js +12 -14
- package/dist/internals.js.map +1 -0
- package/dist/plugins/PluginManager.d.ts +209 -0
- package/dist/plugins/PluginManager.d.ts.map +1 -0
- package/dist/plugins/PluginManager.js +365 -0
- package/dist/plugins/PluginManager.js.map +1 -0
- package/dist/plugins/ScopedPostgres.d.ts +78 -0
- package/dist/plugins/ScopedPostgres.d.ts.map +1 -0
- package/dist/plugins/ScopedPostgres.js +190 -0
- package/dist/plugins/ScopedPostgres.js.map +1 -0
- package/dist/plugins/ScopedRedis.d.ts +88 -0
- package/dist/plugins/ScopedRedis.d.ts.map +1 -0
- package/dist/plugins/ScopedRedis.js +169 -0
- package/dist/plugins/ScopedRedis.js.map +1 -0
- package/dist/plugins/index.d.ts +289 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +1942 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/types.d.ts +59 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/registry/ServiceRegistry.d.ts +305 -0
- package/dist/registry/ServiceRegistry.d.ts.map +1 -0
- package/dist/registry/ServiceRegistry.js +735 -0
- package/dist/registry/ServiceRegistry.js.map +1 -0
- package/dist/scaling/ScaleAdvisor.d.ts +214 -0
- package/dist/scaling/ScaleAdvisor.d.ts.map +1 -0
- package/dist/scaling/ScaleAdvisor.js +526 -0
- package/dist/scaling/ScaleAdvisor.js.map +1 -0
- package/dist/services/Service.d.ts +164 -0
- package/dist/services/Service.d.ts.map +1 -0
- package/dist/services/Service.js +106 -0
- package/dist/services/Service.js.map +1 -0
- package/dist/services/worker-bootstrap.d.ts +15 -0
- package/dist/services/worker-bootstrap.d.ts.map +1 -0
- package/dist/services/worker-bootstrap.js +744 -0
- package/dist/services/worker-bootstrap.js.map +1 -0
- package/dist/templates/auth-service.d.ts +42 -0
- package/dist/templates/auth-service.d.ts.map +1 -0
- package/dist/templates/auth-service.js +54 -0
- package/dist/templates/auth-service.js.map +1 -0
- package/dist/templates/identity-service.d.ts +50 -0
- package/dist/templates/identity-service.d.ts.map +1 -0
- package/dist/templates/identity-service.js +62 -0
- package/dist/templates/identity-service.js.map +1 -0
- package/dist/types/contract.d.ts +120 -0
- package/dist/types/contract.d.ts.map +1 -0
- package/dist/types/contract.js +69 -0
- package/dist/types/contract.js.map +1 -0
- package/package.json +78 -20
- package/src/core/DirectMessageBus.js +0 -364
- package/src/core/EndpointResolver.js +0 -259
- package/src/core/ForgeContext.js +0 -2236
- package/src/core/ForgeHost.js +0 -122
- package/src/core/ForgePlatform.js +0 -145
- package/src/core/Ingress.js +0 -768
- package/src/core/Interceptors.js +0 -420
- package/src/core/MessageBus.js +0 -321
- package/src/core/Prometheus.js +0 -305
- package/src/core/RequestContext.js +0 -413
- package/src/core/RoutingStrategy.js +0 -330
- package/src/core/Supervisor.js +0 -1349
- package/src/core/ThreadAllocator.js +0 -196
- package/src/core/WorkerChannelManager.js +0 -879
- package/src/core/config.js +0 -637
- package/src/core/host-config.js +0 -311
- package/src/core/network-utils.js +0 -166
- package/src/core/platform-config.js +0 -308
- package/src/decorators/ServiceProxy.js +0 -904
- package/src/decorators/index.js +0 -571
- package/src/deploy/NginxGenerator.js +0 -865
- package/src/deploy/PlatformManifestGenerator.js +0 -96
- package/src/deploy/RouteManifestGenerator.js +0 -112
- package/src/deploy/index.js +0 -984
- package/src/frontend/FrontendDevLifecycle.js +0 -65
- package/src/frontend/FrontendPluginOrchestrator.js +0 -187
- package/src/frontend/SiteResolver.js +0 -63
- package/src/frontend/StaticMountRegistry.js +0 -90
- package/src/frontend/plugins/viteFrontend.js +0 -79
- package/src/frontend/types.js +0 -35
- package/src/index.js +0 -58
- package/src/plugins/PluginManager.js +0 -537
- package/src/plugins/ScopedPostgres.js +0 -192
- package/src/plugins/ScopedRedis.js +0 -142
- package/src/plugins/index.js +0 -1756
- package/src/registry/ServiceRegistry.js +0 -797
- package/src/scaling/ScaleAdvisor.js +0 -442
- package/src/services/Service.js +0 -195
- package/src/services/worker-bootstrap.js +0 -679
- package/src/templates/auth-service.js +0 -65
- package/src/templates/identity-service.js +0 -75
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-commands.d.ts","sourceRoot":"","sources":["host-commands.js"],"names":[],"mappings":"AAsTA,kDAgCC"}
|
package/bin/host-commands.js
CHANGED
|
@@ -58,7 +58,7 @@ async function cmdHostInit() {
|
|
|
58
58
|
// Write host config
|
|
59
59
|
fs.writeFileSync(
|
|
60
60
|
configPath,
|
|
61
|
-
`import { defineHost, postgres, redis } from 'threadforge';
|
|
61
|
+
`import { defineHost, postgres, redis, ServiceType } from 'threadforge';
|
|
62
62
|
|
|
63
63
|
export default defineHost({
|
|
64
64
|
domain: 'myhost.dev',
|
|
@@ -67,7 +67,7 @@ export default defineHost({
|
|
|
67
67
|
shared: {
|
|
68
68
|
auth: {
|
|
69
69
|
entry: './shared/auth.js',
|
|
70
|
-
type:
|
|
70
|
+
type: ServiceType.EDGE,
|
|
71
71
|
port: 3100,
|
|
72
72
|
prefix: '/auth',
|
|
73
73
|
},
|
|
@@ -141,7 +141,7 @@ export default class AuthService extends Service {
|
|
|
141
141
|
|
|
142
142
|
async function cmdHostStart() {
|
|
143
143
|
const hostConfig = await loadHostConfig();
|
|
144
|
-
const { ForgeHost } = await import("../
|
|
144
|
+
const { ForgeHost } = await import("../dist/core/ForgeHost.js");
|
|
145
145
|
|
|
146
146
|
const host = new ForgeHost(hostConfig);
|
|
147
147
|
await host.start();
|
|
@@ -155,9 +155,7 @@ async function cmdHostAdd(args) {
|
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
const absPath = path.resolve(process.cwd(), projectPath);
|
|
158
|
-
const configFile = ["forge.config.js", "forge.config.mjs"].find((name) =>
|
|
159
|
-
fs.existsSync(path.join(absPath, name)),
|
|
160
|
-
);
|
|
158
|
+
const configFile = ["forge.config.js", "forge.config.mjs"].find((name) => fs.existsSync(path.join(absPath, name)));
|
|
161
159
|
|
|
162
160
|
if (!configFile) {
|
|
163
161
|
console.error(` No forge.config.js found at ${absPath}`);
|
|
@@ -252,8 +250,8 @@ async function cmdHostRestart(args) {
|
|
|
252
250
|
|
|
253
251
|
async function cmdHostGenerate() {
|
|
254
252
|
const hostConfig = await loadHostConfig();
|
|
255
|
-
const { resolveHostConfig } = await import("../
|
|
256
|
-
const { generateHostNginxConfig } = await import("../
|
|
253
|
+
const { resolveHostConfig } = await import("../dist/core/host-config.js");
|
|
254
|
+
const { generateHostNginxConfig } = await import("../dist/deploy/NginxGenerator.js");
|
|
257
255
|
|
|
258
256
|
const raw = hostConfig._isHostConfig ? hostConfig._raw : hostConfig;
|
|
259
257
|
const resolved = await resolveHostConfig(raw);
|
|
@@ -277,6 +275,7 @@ async function cmdHostGenerate() {
|
|
|
277
275
|
const nginxConfig = generateHostNginxConfig({
|
|
278
276
|
hostMeta: resolved.hostMeta,
|
|
279
277
|
services: resolved.services,
|
|
278
|
+
forgeProxy: raw.forgeProxy,
|
|
280
279
|
});
|
|
281
280
|
const deployDir = path.join(process.cwd(), "deploy");
|
|
282
281
|
fs.mkdirSync(deployDir, { recursive: true });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-commands.d.ts","sourceRoot":"","sources":["platform-commands.js"],"names":[],"mappings":"AA2oBA,sDA6BC"}
|
package/bin/platform-commands.js
CHANGED
|
@@ -41,6 +41,25 @@ function computeImportPath(fromDir) {
|
|
|
41
41
|
return "threadforge";
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
function detectLocalThreadforgeDependency(cwd) {
|
|
45
|
+
const linkedPackagePath = path.join(cwd, "node_modules", "threadforge");
|
|
46
|
+
try {
|
|
47
|
+
const stat = fs.lstatSync(linkedPackagePath);
|
|
48
|
+
if (!stat.isSymbolicLink()) return null;
|
|
49
|
+
|
|
50
|
+
const realPath = fs.realpathSync(linkedPackagePath);
|
|
51
|
+
const relativePath = path.relative(cwd, realPath) || ".";
|
|
52
|
+
const normalized = (relativePath.startsWith(".") ? relativePath : `./${relativePath}`).split(path.sep).join("/");
|
|
53
|
+
return `file:${normalized}`;
|
|
54
|
+
} catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function resolvePlatformInitDependency(cwd) {
|
|
60
|
+
return detectLocalThreadforgeDependency(cwd) ?? "github:ChrisBland/threadforge";
|
|
61
|
+
}
|
|
62
|
+
|
|
44
63
|
function ensurePlatformPackageJson(cwd) {
|
|
45
64
|
const pkgPath = path.join(cwd, "package.json");
|
|
46
65
|
const defaultName = path.basename(cwd);
|
|
@@ -49,6 +68,7 @@ function ensurePlatformPackageJson(cwd) {
|
|
|
49
68
|
build: "forge build",
|
|
50
69
|
generate: "forge platform generate",
|
|
51
70
|
};
|
|
71
|
+
const defaultThreadforgeDependency = resolvePlatformInitDependency(cwd);
|
|
52
72
|
|
|
53
73
|
let pkg = {};
|
|
54
74
|
if (fs.existsSync(pkgPath)) {
|
|
@@ -78,7 +98,16 @@ function ensurePlatformPackageJson(cwd) {
|
|
|
78
98
|
}
|
|
79
99
|
}
|
|
80
100
|
|
|
101
|
+
if (!pkg.dependencies || typeof pkg.dependencies !== "object" || Array.isArray(pkg.dependencies)) {
|
|
102
|
+
pkg.dependencies = {};
|
|
103
|
+
}
|
|
104
|
+
if (!pkg.dependencies.threadforge) {
|
|
105
|
+
pkg.dependencies.threadforge = defaultThreadforgeDependency;
|
|
106
|
+
}
|
|
107
|
+
|
|
81
108
|
fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
|
|
109
|
+
|
|
110
|
+
return pkg.dependencies.threadforge;
|
|
82
111
|
}
|
|
83
112
|
|
|
84
113
|
async function loadPlatformConfig() {
|
|
@@ -93,6 +122,50 @@ async function loadPlatformConfig() {
|
|
|
93
122
|
return mod.default ?? mod;
|
|
94
123
|
}
|
|
95
124
|
|
|
125
|
+
async function suggestNextPlatformEdgePort(cwd = process.cwd()) {
|
|
126
|
+
const DEFAULT_PORT = 4001;
|
|
127
|
+
let platformConfig;
|
|
128
|
+
try {
|
|
129
|
+
platformConfig = await loadPlatformConfig();
|
|
130
|
+
} catch {
|
|
131
|
+
platformConfig = null;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const usedPorts = new Set();
|
|
135
|
+
if (platformConfig) {
|
|
136
|
+
const raw = platformConfig._isPlatformConfig ? platformConfig._raw : platformConfig;
|
|
137
|
+
for (const [key, value] of Object.entries(raw ?? {})) {
|
|
138
|
+
if (key === "platform" || key === "plugins" || key === "frontendPlugins") continue;
|
|
139
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) continue;
|
|
140
|
+
if (value.type !== "edge") continue;
|
|
141
|
+
if (Number.isInteger(value.port) && value.port > 0) {
|
|
142
|
+
usedPorts.add(value.port);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// If users scaffold multiple apps before editing forge.platform.js,
|
|
148
|
+
// infer likely app ports from existing app api stubs to avoid duplicate suggestions.
|
|
149
|
+
const appsDir = path.join(cwd, "apps");
|
|
150
|
+
let inferredAppCount = 0;
|
|
151
|
+
if (fs.existsSync(appsDir)) {
|
|
152
|
+
try {
|
|
153
|
+
const entries = fs.readdirSync(appsDir, { withFileTypes: true });
|
|
154
|
+
inferredAppCount = entries.filter((entry) => {
|
|
155
|
+
if (!entry.isDirectory()) return false;
|
|
156
|
+
const apiPath = path.join(appsDir, entry.name, "api.js");
|
|
157
|
+
return fs.existsSync(apiPath);
|
|
158
|
+
}).length;
|
|
159
|
+
} catch {
|
|
160
|
+
inferredAppCount = 0;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
let candidate = DEFAULT_PORT + inferredAppCount;
|
|
165
|
+
while (usedPorts.has(candidate)) candidate += 1;
|
|
166
|
+
return candidate;
|
|
167
|
+
}
|
|
168
|
+
|
|
96
169
|
function loadFrontendBuildManifest(cwd) {
|
|
97
170
|
const manifestPath = path.join(cwd, ".threadforge", "frontend-manifest.json");
|
|
98
171
|
if (!fs.existsSync(manifestPath)) return null;
|
|
@@ -119,7 +192,7 @@ async function cmdPlatformInit() {
|
|
|
119
192
|
const importPath = computeImportPath(cwd);
|
|
120
193
|
const serviceImportPath = computeImportPath(path.join(cwd, "shared"));
|
|
121
194
|
|
|
122
|
-
ensurePlatformPackageJson(cwd);
|
|
195
|
+
const dependency = ensurePlatformPackageJson(cwd);
|
|
123
196
|
|
|
124
197
|
// Create directories
|
|
125
198
|
for (const dir of ["shared", "apps"]) {
|
|
@@ -129,7 +202,7 @@ async function cmdPlatformInit() {
|
|
|
129
202
|
// Write platform config
|
|
130
203
|
fs.writeFileSync(
|
|
131
204
|
configPath,
|
|
132
|
-
`import { definePlatform } from '${importPath}';
|
|
205
|
+
`import { definePlatform, ServiceType } from '${importPath}';
|
|
133
206
|
|
|
134
207
|
export default definePlatform({
|
|
135
208
|
platform: {
|
|
@@ -152,23 +225,23 @@ export default definePlatform({
|
|
|
152
225
|
// Shared services (run once, serve all apps)
|
|
153
226
|
identity: {
|
|
154
227
|
entry: './shared/identity.js',
|
|
155
|
-
type:
|
|
228
|
+
type: ServiceType.EDGE,
|
|
156
229
|
port: 3001,
|
|
157
230
|
},
|
|
158
231
|
auth: {
|
|
159
232
|
entry: './shared/auth.js',
|
|
160
|
-
type:
|
|
233
|
+
type: ServiceType.EDGE,
|
|
161
234
|
port: 3002,
|
|
162
235
|
prefix: '/auth',
|
|
163
236
|
},
|
|
164
237
|
|
|
165
238
|
// Per-app services go here:
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
239
|
+
// 'myapp-api': {
|
|
240
|
+
// entry: './apps/myapp/api.js',
|
|
241
|
+
// type: ServiceType.EDGE,
|
|
242
|
+
// port: 4001,
|
|
243
|
+
// connects: ['auth'],
|
|
244
|
+
// },
|
|
172
245
|
});
|
|
173
246
|
`,
|
|
174
247
|
);
|
|
@@ -250,6 +323,7 @@ export default class AuthService extends Service {
|
|
|
250
323
|
shared/identity.js - Identity service (stub)
|
|
251
324
|
shared/auth.js - Auth service (stub)
|
|
252
325
|
apps/ - App directory
|
|
326
|
+
package.json - Includes threadforge dependency (${dependency})
|
|
253
327
|
|
|
254
328
|
Next steps:
|
|
255
329
|
1. Edit forge.platform.js to configure your apps
|
|
@@ -262,7 +336,7 @@ export default class AuthService extends Service {
|
|
|
262
336
|
|
|
263
337
|
async function cmdPlatformStart() {
|
|
264
338
|
const platformConfig = await loadPlatformConfig();
|
|
265
|
-
const { ForgePlatform } = await import("../
|
|
339
|
+
const { ForgePlatform } = await import("../dist/core/ForgePlatform.js");
|
|
266
340
|
|
|
267
341
|
const platform = new ForgePlatform(platformConfig);
|
|
268
342
|
await platform.start();
|
|
@@ -278,7 +352,9 @@ async function cmdPlatformAdd(args) {
|
|
|
278
352
|
}
|
|
279
353
|
|
|
280
354
|
if (!/^[a-z][a-z0-9_-]*$/.test(appName)) {
|
|
281
|
-
console.error(
|
|
355
|
+
console.error(
|
|
356
|
+
` Invalid app name "${appName}": must start with a lowercase letter and contain only lowercase letters, digits, hyphens, and underscores.`,
|
|
357
|
+
);
|
|
282
358
|
process.exit(1);
|
|
283
359
|
}
|
|
284
360
|
|
|
@@ -291,6 +367,7 @@ async function cmdPlatformAdd(args) {
|
|
|
291
367
|
}
|
|
292
368
|
|
|
293
369
|
const serviceImportPath = computeImportPath(path.join(cwd, "apps", appName));
|
|
370
|
+
const suggestedPort = await suggestNextPlatformEdgePort();
|
|
294
371
|
|
|
295
372
|
// Create app directory + migrations
|
|
296
373
|
fs.mkdirSync(path.join(appDir, "migrations"), { recursive: true });
|
|
@@ -366,8 +443,8 @@ CREATE INDEX IF NOT EXISTS "idx_${safeName}_items_created"
|
|
|
366
443
|
// As a top-level service:
|
|
367
444
|
'${appName}-api': {
|
|
368
445
|
entry: './apps/${appName}/api.js',
|
|
369
|
-
type:
|
|
370
|
-
port:
|
|
446
|
+
type: ServiceType.EDGE,
|
|
447
|
+
port: ${suggestedPort},
|
|
371
448
|
connects: ['auth'],
|
|
372
449
|
},
|
|
373
450
|
`);
|
|
@@ -401,7 +478,7 @@ async function cmdPlatformRemove(args) {
|
|
|
401
478
|
// ── forge platform status ────────────────────────────────────────────────
|
|
402
479
|
|
|
403
480
|
async function cmdPlatformStatus() {
|
|
404
|
-
const metricsPort = parseInt(process.env.FORGE_METRICS_PORT ||
|
|
481
|
+
const metricsPort = parseInt(process.env.FORGE_METRICS_PORT || "9090", 10);
|
|
405
482
|
try {
|
|
406
483
|
const res = await fetch(`http://localhost:${metricsPort}/status`);
|
|
407
484
|
const data = await res.json();
|
|
@@ -443,10 +520,10 @@ async function cmdPlatformStatus() {
|
|
|
443
520
|
|
|
444
521
|
async function cmdPlatformGenerate() {
|
|
445
522
|
const platformConfig = await loadPlatformConfig();
|
|
446
|
-
const { resolveAppDomains, transformToHostConfig } = await import("../
|
|
447
|
-
const { resolveHostConfig } = await import("../
|
|
448
|
-
const { generatePlatformNginxConfig } = await import("../
|
|
449
|
-
const { generatePlatformManifest } = await import("../
|
|
523
|
+
const { resolveAppDomains, transformToHostConfig } = await import("../dist/core/platform-config.js");
|
|
524
|
+
const { resolveHostConfig } = await import("../dist/core/host-config.js");
|
|
525
|
+
const { generatePlatformNginxConfig } = await import("../dist/deploy/NginxGenerator.js");
|
|
526
|
+
const { generatePlatformManifest } = await import("../dist/deploy/PlatformManifestGenerator.js");
|
|
450
527
|
|
|
451
528
|
const raw = platformConfig._isPlatformConfig ? platformConfig._raw : platformConfig;
|
|
452
529
|
const hostConfig = transformToHostConfig(raw);
|
|
@@ -480,7 +557,7 @@ async function cmdPlatformGenerate() {
|
|
|
480
557
|
const apps = {};
|
|
481
558
|
for (const [appId, app] of Object.entries(raw.platform.apps)) {
|
|
482
559
|
const site = resolved.sites?.[appId];
|
|
483
|
-
const frontend = site?.frontend ? { ...site.frontend } :
|
|
560
|
+
const frontend = site?.frontend ? { ...site.frontend } : app.frontend ? { ...app.frontend } : null;
|
|
484
561
|
if (frontend && builtOutDirBySite[appId]) {
|
|
485
562
|
frontend.outDir = builtOutDirBySite[appId];
|
|
486
563
|
}
|
|
@@ -489,25 +566,29 @@ async function cmdPlatformGenerate() {
|
|
|
489
566
|
? mountsFromManifest[appId]
|
|
490
567
|
: (() => {
|
|
491
568
|
if (frontend) {
|
|
492
|
-
return [
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
569
|
+
return [
|
|
570
|
+
{
|
|
571
|
+
siteId: appId,
|
|
572
|
+
domains: site?.domains ?? resolveAppDomains(app),
|
|
573
|
+
basePath: frontend.basePath ?? "/",
|
|
574
|
+
dir: frontend.outDir,
|
|
575
|
+
spaFallback: frontend.spaFallback ?? true,
|
|
576
|
+
cachePolicy: "short",
|
|
577
|
+
},
|
|
578
|
+
];
|
|
500
579
|
}
|
|
501
580
|
const legacyStatic = site?.staticDir ?? app.static ?? null;
|
|
502
581
|
if (!legacyStatic) return [];
|
|
503
|
-
return [
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
582
|
+
return [
|
|
583
|
+
{
|
|
584
|
+
siteId: appId,
|
|
585
|
+
domains: site?.domains ?? resolveAppDomains(app),
|
|
586
|
+
basePath: "/static",
|
|
587
|
+
dir: legacyStatic,
|
|
588
|
+
spaFallback: false,
|
|
589
|
+
cachePolicy: "short",
|
|
590
|
+
},
|
|
591
|
+
];
|
|
511
592
|
})();
|
|
512
593
|
|
|
513
594
|
apps[appId] = {
|
|
@@ -527,6 +608,7 @@ async function cmdPlatformGenerate() {
|
|
|
527
608
|
hostMeta: resolved.hostMeta,
|
|
528
609
|
defaultSsl: raw.platform.ssl ?? null,
|
|
529
610
|
maxBodySize: raw.platform.maxBodySize ?? 10,
|
|
611
|
+
forgeProxy: raw.platform.forgeProxy,
|
|
530
612
|
});
|
|
531
613
|
fs.writeFileSync(path.join(deployDir, "nginx.conf"), nginxConfig);
|
|
532
614
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base command class for all ThreadForge CLI commands.
|
|
3
|
+
* Provides shared flags and config discovery.
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from "@oclif/core";
|
|
6
|
+
export declare abstract class ForgeCommand extends Command {
|
|
7
|
+
static baseFlags: {
|
|
8
|
+
config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
protected resolveConfig(commandName: string): Promise<string>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=base-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../../src/cli/base-command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAG7C,8BAAsB,YAAa,SAAQ,OAAO;IAChD,MAAM,CAAC,SAAS;;MAKd;cAEc,aAAa,CAC3B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;CAcnB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base command class for all ThreadForge CLI commands.
|
|
3
|
+
* Provides shared flags and config discovery.
|
|
4
|
+
*/
|
|
5
|
+
import { Command, Flags } from "@oclif/core";
|
|
6
|
+
import { findConfig, printNoConfigError } from "./util/config-discovery.js";
|
|
7
|
+
export class ForgeCommand extends Command {
|
|
8
|
+
static baseFlags = {
|
|
9
|
+
config: Flags.string({
|
|
10
|
+
description: "Path to config file",
|
|
11
|
+
required: false,
|
|
12
|
+
}),
|
|
13
|
+
};
|
|
14
|
+
async resolveConfig(commandName) {
|
|
15
|
+
const parsed = await this.parse(this.constructor);
|
|
16
|
+
const configFlag = parsed.flags?.config;
|
|
17
|
+
const configPath = await findConfig(commandName, configFlag);
|
|
18
|
+
if (!configPath) {
|
|
19
|
+
printNoConfigError(commandName);
|
|
20
|
+
this.exit(1);
|
|
21
|
+
}
|
|
22
|
+
return configPath;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=base-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.js","sourceRoot":"","sources":["../../src/cli/base-command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAE5E,MAAM,OAAgB,YAAa,SAAQ,OAAO;IAChD,MAAM,CAAC,SAAS,GAAG;QACjB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,qBAAqB;YAClC,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAC;IAEQ,KAAK,CAAC,aAAa,CAC3B,WAAmB;QAEnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,IAAI,CAAC,WAAkC,CACxC,CAAC;QACF,MAAM,UAAU,GAAI,MAAM,CAAC,KAAa,EAAE,MAE7B,CAAC;QACd,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;QACD,OAAO,UAAW,CAAC;IACrB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from "@oclif/core";
|
|
2
|
+
export default class Build extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAG7C,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,OAAgB,WAAW,SAA+C;IAE1E,OAAgB,QAAQ,WAAmB;IAE3C,OAAgB,KAAK;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAyI3B"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { Command, Flags } from "@oclif/core";
|
|
5
|
+
import { findConfig, printNoConfigError } from "../util/config-discovery.js";
|
|
6
|
+
export default class Build extends Command {
|
|
7
|
+
static description = "Build frontend sites via frontend plugins";
|
|
8
|
+
static examples = ["forge build"];
|
|
9
|
+
static flags = {
|
|
10
|
+
config: Flags.string({ description: "Path to config file" }),
|
|
11
|
+
};
|
|
12
|
+
async run() {
|
|
13
|
+
const { flags } = await this.parse(Build);
|
|
14
|
+
const configPath = await findConfig("build", flags.config);
|
|
15
|
+
if (!configPath) {
|
|
16
|
+
printNoConfigError("build");
|
|
17
|
+
this.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const { loadConfig } = await import("../../core/config.js");
|
|
20
|
+
const { resolveSitesMap } = await import("../../frontend/SiteResolver.js");
|
|
21
|
+
let config;
|
|
22
|
+
try {
|
|
23
|
+
const configUrl = pathToFileURL(configPath).href;
|
|
24
|
+
config = await loadConfig(configUrl);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
console.error(`\n \u2717 Error loading ${path.basename(configPath)}:`);
|
|
28
|
+
console.error(` ${err.message}`);
|
|
29
|
+
this.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const sitesMap = resolveSitesMap(config);
|
|
32
|
+
const frontendSites = Object.values(sitesMap).filter((site) => site?.frontend);
|
|
33
|
+
if (frontendSites.length === 0) {
|
|
34
|
+
console.log(" No frontend sites configured. Nothing to build.");
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const { FrontendPluginOrchestrator } = await import("../../frontend/FrontendPluginOrchestrator.js");
|
|
38
|
+
const orchestrator = new FrontendPluginOrchestrator();
|
|
39
|
+
const frontendPlugins = config.frontendPlugins ?? [];
|
|
40
|
+
try {
|
|
41
|
+
orchestrator.register(frontendPlugins);
|
|
42
|
+
await orchestrator.validateAll({ logger: console });
|
|
43
|
+
await orchestrator.registerAll({ logger: console });
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
console.error(` Frontend plugin setup failed: ${err.message}`);
|
|
47
|
+
this.exit(1);
|
|
48
|
+
}
|
|
49
|
+
const sitesNeedingPlugin = frontendSites.filter((site) => site.frontend.plugin);
|
|
50
|
+
if (orchestrator.plugins.size === 0 && sitesNeedingPlugin.length > 0) {
|
|
51
|
+
console.error(" Frontend sites are configured, but no frontendPlugins are registered in config.");
|
|
52
|
+
this.exit(1);
|
|
53
|
+
}
|
|
54
|
+
const results = [];
|
|
55
|
+
const mountsBySite = {};
|
|
56
|
+
let failures = 0;
|
|
57
|
+
try {
|
|
58
|
+
console.log(`\n \u26A1 Building frontend sites (${frontendSites.length})\n`);
|
|
59
|
+
for (const site of frontendSites) {
|
|
60
|
+
const pluginName = site.frontend.plugin;
|
|
61
|
+
if (!pluginName) {
|
|
62
|
+
console.log(` \u2022 ${site.siteId} (static \u2014 no build needed)`);
|
|
63
|
+
results.push({
|
|
64
|
+
siteId: site.siteId,
|
|
65
|
+
plugin: null,
|
|
66
|
+
outDir: site.frontend.outDir,
|
|
67
|
+
});
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
console.log(` \u2022 ${site.siteId} (${pluginName})`);
|
|
72
|
+
const result = await orchestrator.buildSite(site, {
|
|
73
|
+
logger: console,
|
|
74
|
+
});
|
|
75
|
+
const mounts = await orchestrator.staticMounts(site, {
|
|
76
|
+
logger: console,
|
|
77
|
+
});
|
|
78
|
+
mountsBySite[site.siteId] = mounts;
|
|
79
|
+
results.push({
|
|
80
|
+
siteId: site.siteId,
|
|
81
|
+
plugin: pluginName,
|
|
82
|
+
outDir: result?.outDir ?? site.frontend.outDir,
|
|
83
|
+
});
|
|
84
|
+
console.log(` \u2713 ${result?.outDir ?? site.frontend.outDir}`);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
failures++;
|
|
88
|
+
console.error(` \u2717 ${err.message}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
await orchestrator.disposeAll({ logger: console });
|
|
94
|
+
}
|
|
95
|
+
const outputDir = path.join(process.cwd(), ".threadforge");
|
|
96
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
97
|
+
const manifestPath = path.join(outputDir, "frontend-manifest.json");
|
|
98
|
+
fs.writeFileSync(manifestPath, JSON.stringify({
|
|
99
|
+
generatedAt: new Date().toISOString(),
|
|
100
|
+
sites: results,
|
|
101
|
+
mounts: mountsBySite,
|
|
102
|
+
}, null, 2));
|
|
103
|
+
console.log(`\n Wrote frontend manifest: ${manifestPath}`);
|
|
104
|
+
if (failures > 0) {
|
|
105
|
+
console.error(` Frontend build completed with ${failures} failure(s).`);
|
|
106
|
+
this.exit(1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Command } from "@oclif/core";
|
|
2
|
+
export default class Deploy extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
"dry-run": import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
"check-secrets": import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
};
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=deploy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deploy.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAI7C,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,OAAgB,WAAW,SACqB;IAEhD,OAAgB,QAAQ,WAItB;IAEF,OAAgB,KAAK;;;;MAUnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAyJ3B"}
|