threadforge 0.1.0 → 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 -1049
- 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 +160 -49
- 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 +84 -22
- package/shared/identity.js +26 -0
- package/src/core/DirectMessageBus.js +0 -364
- package/src/core/EndpointResolver.js +0 -247
- package/src/core/ForgeContext.js +0 -2227
- 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 -310
- package/src/core/Prometheus.js +0 -305
- package/src/core/RequestContext.js +0 -413
- package/src/core/RoutingStrategy.js +0 -316
- package/src/core/Supervisor.js +0 -1306
- package/src/core/ThreadAllocator.js +0 -196
- package/src/core/WorkerChannelManager.js +0 -879
- package/src/core/config.js +0 -624
- 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 -899
- 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 -56
- 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 -1729
- package/src/registry/ServiceRegistry.js +0 -796
- package/src/scaling/ScaleAdvisor.js +0 -442
- package/src/services/Service.js +0 -195
- package/src/services/worker-bootstrap.js +0 -676
- 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
|
@@ -12,11 +12,9 @@
|
|
|
12
12
|
|
|
13
13
|
import fs from "node:fs";
|
|
14
14
|
import path from "node:path";
|
|
15
|
-
import {
|
|
15
|
+
import { pathToFileURL } from "node:url";
|
|
16
16
|
|
|
17
17
|
const PLATFORM_CONFIG_NAMES = ["forge.platform.js", "forge.platform.mjs"];
|
|
18
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
19
|
-
const LOCAL_PKG_PATH = path.resolve(__dirname, "..", "package.json");
|
|
20
18
|
|
|
21
19
|
async function findPlatformConfig() {
|
|
22
20
|
const cwd = process.cwd();
|
|
@@ -39,19 +37,77 @@ async function findPlatformConfig() {
|
|
|
39
37
|
* @returns {string}
|
|
40
38
|
*/
|
|
41
39
|
function computeImportPath(fromDir) {
|
|
40
|
+
void fromDir;
|
|
41
|
+
return "threadforge";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function detectLocalThreadforgeDependency(cwd) {
|
|
45
|
+
const linkedPackagePath = path.join(cwd, "node_modules", "threadforge");
|
|
42
46
|
try {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
+
|
|
63
|
+
function ensurePlatformPackageJson(cwd) {
|
|
64
|
+
const pkgPath = path.join(cwd, "package.json");
|
|
65
|
+
const defaultName = path.basename(cwd);
|
|
66
|
+
const defaultScripts = {
|
|
67
|
+
start: "forge platform start",
|
|
68
|
+
build: "forge build",
|
|
69
|
+
generate: "forge platform generate",
|
|
70
|
+
};
|
|
71
|
+
const defaultThreadforgeDependency = resolvePlatformInitDependency(cwd);
|
|
72
|
+
|
|
73
|
+
let pkg = {};
|
|
74
|
+
if (fs.existsSync(pkgPath)) {
|
|
75
|
+
try {
|
|
76
|
+
pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
77
|
+
} catch (err) {
|
|
78
|
+
throw new Error(`Invalid package.json: ${err.message}`);
|
|
52
79
|
}
|
|
53
|
-
}
|
|
54
|
-
|
|
80
|
+
} else {
|
|
81
|
+
pkg = {
|
|
82
|
+
name: defaultName,
|
|
83
|
+
version: "1.0.0",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (!pkg.type) {
|
|
88
|
+
pkg.type = "module";
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (!pkg.scripts || typeof pkg.scripts !== "object" || Array.isArray(pkg.scripts)) {
|
|
92
|
+
pkg.scripts = {};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
for (const [name, command] of Object.entries(defaultScripts)) {
|
|
96
|
+
if (!pkg.scripts[name]) {
|
|
97
|
+
pkg.scripts[name] = command;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
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
|
+
|
|
108
|
+
fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
|
|
109
|
+
|
|
110
|
+
return pkg.dependencies.threadforge;
|
|
55
111
|
}
|
|
56
112
|
|
|
57
113
|
async function loadPlatformConfig() {
|
|
@@ -66,6 +122,50 @@ async function loadPlatformConfig() {
|
|
|
66
122
|
return mod.default ?? mod;
|
|
67
123
|
}
|
|
68
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
|
+
|
|
69
169
|
function loadFrontendBuildManifest(cwd) {
|
|
70
170
|
const manifestPath = path.join(cwd, ".threadforge", "frontend-manifest.json");
|
|
71
171
|
if (!fs.existsSync(manifestPath)) return null;
|
|
@@ -92,6 +192,8 @@ async function cmdPlatformInit() {
|
|
|
92
192
|
const importPath = computeImportPath(cwd);
|
|
93
193
|
const serviceImportPath = computeImportPath(path.join(cwd, "shared"));
|
|
94
194
|
|
|
195
|
+
const dependency = ensurePlatformPackageJson(cwd);
|
|
196
|
+
|
|
95
197
|
// Create directories
|
|
96
198
|
for (const dir of ["shared", "apps"]) {
|
|
97
199
|
fs.mkdirSync(path.join(cwd, dir), { recursive: true });
|
|
@@ -100,7 +202,7 @@ async function cmdPlatformInit() {
|
|
|
100
202
|
// Write platform config
|
|
101
203
|
fs.writeFileSync(
|
|
102
204
|
configPath,
|
|
103
|
-
`import { definePlatform } from '${importPath}';
|
|
205
|
+
`import { definePlatform, ServiceType } from '${importPath}';
|
|
104
206
|
|
|
105
207
|
export default definePlatform({
|
|
106
208
|
platform: {
|
|
@@ -123,23 +225,23 @@ export default definePlatform({
|
|
|
123
225
|
// Shared services (run once, serve all apps)
|
|
124
226
|
identity: {
|
|
125
227
|
entry: './shared/identity.js',
|
|
126
|
-
type:
|
|
228
|
+
type: ServiceType.EDGE,
|
|
127
229
|
port: 3001,
|
|
128
230
|
},
|
|
129
231
|
auth: {
|
|
130
232
|
entry: './shared/auth.js',
|
|
131
|
-
type:
|
|
233
|
+
type: ServiceType.EDGE,
|
|
132
234
|
port: 3002,
|
|
133
235
|
prefix: '/auth',
|
|
134
236
|
},
|
|
135
237
|
|
|
136
238
|
// Per-app services go here:
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
239
|
+
// 'myapp-api': {
|
|
240
|
+
// entry: './apps/myapp/api.js',
|
|
241
|
+
// type: ServiceType.EDGE,
|
|
242
|
+
// port: 4001,
|
|
243
|
+
// connects: ['auth'],
|
|
244
|
+
// },
|
|
143
245
|
});
|
|
144
246
|
`,
|
|
145
247
|
);
|
|
@@ -221,6 +323,7 @@ export default class AuthService extends Service {
|
|
|
221
323
|
shared/identity.js - Identity service (stub)
|
|
222
324
|
shared/auth.js - Auth service (stub)
|
|
223
325
|
apps/ - App directory
|
|
326
|
+
package.json - Includes threadforge dependency (${dependency})
|
|
224
327
|
|
|
225
328
|
Next steps:
|
|
226
329
|
1. Edit forge.platform.js to configure your apps
|
|
@@ -233,7 +336,7 @@ export default class AuthService extends Service {
|
|
|
233
336
|
|
|
234
337
|
async function cmdPlatformStart() {
|
|
235
338
|
const platformConfig = await loadPlatformConfig();
|
|
236
|
-
const { ForgePlatform } = await import("../
|
|
339
|
+
const { ForgePlatform } = await import("../dist/core/ForgePlatform.js");
|
|
237
340
|
|
|
238
341
|
const platform = new ForgePlatform(platformConfig);
|
|
239
342
|
await platform.start();
|
|
@@ -249,7 +352,9 @@ async function cmdPlatformAdd(args) {
|
|
|
249
352
|
}
|
|
250
353
|
|
|
251
354
|
if (!/^[a-z][a-z0-9_-]*$/.test(appName)) {
|
|
252
|
-
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
|
+
);
|
|
253
358
|
process.exit(1);
|
|
254
359
|
}
|
|
255
360
|
|
|
@@ -262,6 +367,7 @@ async function cmdPlatformAdd(args) {
|
|
|
262
367
|
}
|
|
263
368
|
|
|
264
369
|
const serviceImportPath = computeImportPath(path.join(cwd, "apps", appName));
|
|
370
|
+
const suggestedPort = await suggestNextPlatformEdgePort();
|
|
265
371
|
|
|
266
372
|
// Create app directory + migrations
|
|
267
373
|
fs.mkdirSync(path.join(appDir, "migrations"), { recursive: true });
|
|
@@ -337,8 +443,8 @@ CREATE INDEX IF NOT EXISTS "idx_${safeName}_items_created"
|
|
|
337
443
|
// As a top-level service:
|
|
338
444
|
'${appName}-api': {
|
|
339
445
|
entry: './apps/${appName}/api.js',
|
|
340
|
-
type:
|
|
341
|
-
port:
|
|
446
|
+
type: ServiceType.EDGE,
|
|
447
|
+
port: ${suggestedPort},
|
|
342
448
|
connects: ['auth'],
|
|
343
449
|
},
|
|
344
450
|
`);
|
|
@@ -372,7 +478,7 @@ async function cmdPlatformRemove(args) {
|
|
|
372
478
|
// ── forge platform status ────────────────────────────────────────────────
|
|
373
479
|
|
|
374
480
|
async function cmdPlatformStatus() {
|
|
375
|
-
const metricsPort = parseInt(process.env.FORGE_METRICS_PORT ||
|
|
481
|
+
const metricsPort = parseInt(process.env.FORGE_METRICS_PORT || "9090", 10);
|
|
376
482
|
try {
|
|
377
483
|
const res = await fetch(`http://localhost:${metricsPort}/status`);
|
|
378
484
|
const data = await res.json();
|
|
@@ -414,10 +520,10 @@ async function cmdPlatformStatus() {
|
|
|
414
520
|
|
|
415
521
|
async function cmdPlatformGenerate() {
|
|
416
522
|
const platformConfig = await loadPlatformConfig();
|
|
417
|
-
const { resolveAppDomains, transformToHostConfig } = await import("../
|
|
418
|
-
const { resolveHostConfig } = await import("../
|
|
419
|
-
const { generatePlatformNginxConfig } = await import("../
|
|
420
|
-
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");
|
|
421
527
|
|
|
422
528
|
const raw = platformConfig._isPlatformConfig ? platformConfig._raw : platformConfig;
|
|
423
529
|
const hostConfig = transformToHostConfig(raw);
|
|
@@ -451,7 +557,7 @@ async function cmdPlatformGenerate() {
|
|
|
451
557
|
const apps = {};
|
|
452
558
|
for (const [appId, app] of Object.entries(raw.platform.apps)) {
|
|
453
559
|
const site = resolved.sites?.[appId];
|
|
454
|
-
const frontend = site?.frontend ? { ...site.frontend } :
|
|
560
|
+
const frontend = site?.frontend ? { ...site.frontend } : app.frontend ? { ...app.frontend } : null;
|
|
455
561
|
if (frontend && builtOutDirBySite[appId]) {
|
|
456
562
|
frontend.outDir = builtOutDirBySite[appId];
|
|
457
563
|
}
|
|
@@ -460,25 +566,29 @@ async function cmdPlatformGenerate() {
|
|
|
460
566
|
? mountsFromManifest[appId]
|
|
461
567
|
: (() => {
|
|
462
568
|
if (frontend) {
|
|
463
|
-
return [
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
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
|
+
];
|
|
471
579
|
}
|
|
472
580
|
const legacyStatic = site?.staticDir ?? app.static ?? null;
|
|
473
581
|
if (!legacyStatic) return [];
|
|
474
|
-
return [
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
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
|
+
];
|
|
482
592
|
})();
|
|
483
593
|
|
|
484
594
|
apps[appId] = {
|
|
@@ -498,6 +608,7 @@ async function cmdPlatformGenerate() {
|
|
|
498
608
|
hostMeta: resolved.hostMeta,
|
|
499
609
|
defaultSsl: raw.platform.ssl ?? null,
|
|
500
610
|
maxBodySize: raw.platform.maxBodySize ?? 10,
|
|
611
|
+
forgeProxy: raw.platform.forgeProxy,
|
|
501
612
|
});
|
|
502
613
|
fs.writeFileSync(path.join(deployDir, "nginx.conf"), nginxConfig);
|
|
503
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":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAE7E,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAU,WAAW,GAAG,2CAA2C,CAAC;IAE1E,MAAM,CAAU,QAAQ,GAAG,CAAC,aAAa,CAAC,CAAC;IAE3C,MAAM,CAAU,KAAK,GAAG;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;KAC7D,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC5D,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CACtC,gCAAgC,CACjC,CAAC;QAEF,IAAI,MAAW,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,aAAa,CAAC,UAAW,CAAC,CAAC,IAAI,CAAC;YAClD,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CACX,4BAA4B,IAAI,CAAC,QAAQ,CAAC,UAAW,CAAC,GAAG,CAC1D,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAClD,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,CAC9B,CAAC;QACF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,MAAM,EAAE,0BAA0B,EAAE,GAAG,MAAM,MAAM,CACjD,8CAA8C,CAC/C,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,0BAA0B,EAAE,CAAC;QACtD,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;QAErD,IAAI,CAAC;YACH,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YACvC,MAAM,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,MAAM,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CACX,mCAAmC,GAAG,CAAC,OAAO,EAAE,CACjD,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;QAED,MAAM,kBAAkB,GAAG,aAAa,CAAC,MAAM,CAC7C,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CACpC,CAAC;QACF,IAAI,YAAY,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrE,OAAO,CAAC,KAAK,CACX,mFAAmF,CACpF,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAIR,EAAE,CAAC;QACR,MAAM,YAAY,GAAwB,EAAE,CAAC;QAC7C,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CACT,uCAAuC,aAAa,CAAC,MAAM,KAAK,CACjE,CAAC;YAEF,KAAK,MAAM,IAAI,IAAI,aAAsB,EAAE,CAAC;gBAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACxC,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CACT,YAAY,IAAI,CAAC,MAAM,kCAAkC,CAC1D,CAAC;oBACF,OAAO,CAAC,IAAI,CAAC;wBACX,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,MAAM,EAAE,IAAI;wBACZ,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;qBAC7B,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC;oBACH,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,KAAK,UAAU,GAAG,CAAC,CAAC;oBACvD,MAAM,MAAM,GAAQ,MAAM,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE;wBACrD,MAAM,EAAE,OAAO;qBAChB,CAAC,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE;wBACnD,MAAM,EAAE,OAAO;qBAChB,CAAC,CAAC;oBACH,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;oBACnC,OAAO,CAAC,IAAI,CAAC;wBACX,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,MAAM,EAAE,UAAU;wBAClB,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM;qBAC/C,CAAC,CAAC;oBACH,OAAO,CAAC,GAAG,CACT,cAAc,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CACvD,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,QAAQ,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QAC3D,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;QACpE,EAAE,CAAC,aAAa,CACd,YAAY,EACZ,IAAI,CAAC,SAAS,CACZ;YACE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,YAAY;SACrB,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,gCAAgC,YAAY,EAAE,CAAC,CAAC;QAC5D,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CACX,mCAAmC,QAAQ,cAAc,CAC1D,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;IACH,CAAC"}
|
|
@@ -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"}
|