@codemation/host 0.0.1 → 0.0.3

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/index.d.ts CHANGED
@@ -8,7 +8,7 @@ import { A as CommandBus, D as ListUserAccountsQuery, E as UpsertLocalBootstrapU
8
8
  import { t as PrismaClient } from "./client-Yh7-CQud.js";
9
9
  import "./WorkflowViewContracts-DCLpTn25.js";
10
10
  import { c as CodemationPackageManifest, l as CodemationPluginPackageManifest, o as CodemationServerGateway, s as ApiPaths } from "./server-BBdsATju.js";
11
- import { n as CodemationPostgresPrismaClientFactory } from "./persistenceServer-K5eqlZm3.js";
11
+ import { n as CodemationPostgresPrismaClientFactory } from "./persistenceServer-DPSj_-oU.js";
12
12
 
13
13
  //#region src/presentation/config/CodemationApplicationFacade.d.ts
14
14
  interface CodemationApplicationFacade {
package/dist/index.js CHANGED
@@ -4,11 +4,11 @@ import { t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigL
4
4
  import "./decorateParam-BTcc3KNk.js";
5
5
  import "./decorate-B-N_5S4p.js";
6
6
  import { u as ApplicationTokens } from "./CredentialServices-BKBGe7l3.js";
7
- import { b as ListUserAccountsQuery, n as CodemationBootstrapRequest, o as ApiPaths, r as CodemationApplication, t as CodemationFrontendBootstrapRequest, y as UpsertLocalBootstrapUserCommand } from "./CodemationFrontendBootstrapRequest-CE6DjOWJ.js";
8
- import "./PrismaMigrationDeployer-B1E_gYz7.js";
7
+ import { b as ListUserAccountsQuery, n as CodemationBootstrapRequest, o as ApiPaths, r as CodemationApplication, t as CodemationFrontendBootstrapRequest, y as UpsertLocalBootstrapUserCommand } from "./CodemationFrontendBootstrapRequest-CNEk-C4D.js";
8
+ import "./PrismaMigrationDeployer-B7cHGrXP.js";
9
9
  import { n as CodemationWorkerBootstrapRequest, t as CodemationPluginListMerger } from "./CodemationPluginListMerger-BNmaoXQL.js";
10
- import { n as CodemationPostgresPrismaClientFactory, t as import_client } from "./persistenceServer-W9uRw0dJ.js";
11
- import { n as CodemationServerGateway } from "./server-BiHSuA13.js";
10
+ import { n as CodemationPostgresPrismaClientFactory, t as import_client } from "./persistenceServer-8tcM2S48.js";
11
+ import { n as CodemationServerGateway } from "./server-Dd65rNm6.js";
12
12
 
13
13
  var PrismaClient = import_client.PrismaClient;
14
14
  export { ApiPaths, ApplicationTokens, CodemationApplication, CodemationBootstrapRequest, CodemationConsumerConfigLoader, CodemationFrontendBootstrapRequest, CodemationPluginListMerger, CodemationPostgresPrismaClientFactory, CodemationServerGateway, CodemationWorkerBootstrapRequest, ListUserAccountsQuery, PrismaClient, UpsertLocalBootstrapUserCommand };
@@ -3,8 +3,8 @@ import { a as FilteringLogger, i as PerformanceLogPolicy, n as PerformanceLogPol
3
3
  import { n as __decorateMetadata, t as __decorateParam } from "./decorateParam-BTcc3KNk.js";
4
4
  import { t as __decorate } from "./decorate-B-N_5S4p.js";
5
5
  import { a as CredentialInstanceService, i as CredentialBindingService, u as ApplicationTokens } from "./CredentialServices-BKBGe7l3.js";
6
- import { a as WorkflowWebsocketServer, c as WorkflowDefinitionMapper, d as RequestToWebhookItemMapper, f as RunHttpRouteHandler, h as BinaryHttpRouteHandler, i as CodemationHonoApiApp, l as WorkflowPolicyUiPresentationFactory, m as CredentialHttpRouteHandler, n as CodemationBootstrapRequest, p as OAuth2HttpRouteHandler, r as CodemationApplication, s as WorkflowHttpRouteHandler, t as CodemationFrontendBootstrapRequest, u as WebhookHttpRouteHandler, v as RunBinaryAttachmentLookupService } from "./CodemationFrontendBootstrapRequest-CE6DjOWJ.js";
7
- import "./PrismaMigrationDeployer-B1E_gYz7.js";
6
+ import { a as WorkflowWebsocketServer, c as WorkflowDefinitionMapper, d as RequestToWebhookItemMapper, f as RunHttpRouteHandler, h as BinaryHttpRouteHandler, i as CodemationHonoApiApp, l as WorkflowPolicyUiPresentationFactory, m as CredentialHttpRouteHandler, n as CodemationBootstrapRequest, p as OAuth2HttpRouteHandler, r as CodemationApplication, s as WorkflowHttpRouteHandler, t as CodemationFrontendBootstrapRequest, u as WebhookHttpRouteHandler, v as RunBinaryAttachmentLookupService } from "./CodemationFrontendBootstrapRequest-CNEk-C4D.js";
7
+ import "./PrismaMigrationDeployer-B7cHGrXP.js";
8
8
  import { n as CodemationWorkerBootstrapRequest, t as CodemationPluginListMerger } from "./CodemationPluginListMerger-BNmaoXQL.js";
9
9
  import { CoreTokens, RunFinishedAtFactory, inject, injectable } from "@codemation/core";
10
10
 
@@ -1,5 +1,5 @@
1
1
  import { i as __toESM } from "./chunk-7V6ThxGB.js";
2
- import { r as require_client } from "./PrismaMigrationDeployer-B1E_gYz7.js";
2
+ import { r as require_client } from "./PrismaMigrationDeployer-B7cHGrXP.js";
3
3
  import { PrismaPg } from "@prisma/adapter-pg";
4
4
 
5
5
  //#region src/infrastructure/persistence/CodemationPostgresPrismaClientFactory.ts
@@ -16,4 +16,4 @@ var import_client = /* @__PURE__ */ __toESM(require_client(), 1);
16
16
 
17
17
  //#endregion
18
18
  export { CodemationPostgresPrismaClientFactory as n, import_client as t };
19
- //# sourceMappingURL=persistenceServer-W9uRw0dJ.js.map
19
+ //# sourceMappingURL=persistenceServer-8tcM2S48.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"persistenceServer-W9uRw0dJ.js","names":["PrismaClient"],"sources":["../src/infrastructure/persistence/CodemationPostgresPrismaClientFactory.ts","../src/persistenceServer.ts"],"sourcesContent":["import { PrismaPg } from \"@prisma/adapter-pg\";\nimport { PrismaClient } from \"./generated/prisma-client/client.js\";\n\nexport class CodemationPostgresPrismaClientFactory {\n static create(databaseUrl: string): PrismaClient {\n const adapter = new PrismaPg({ connectionString: databaseUrl });\n return new PrismaClient({ adapter });\n }\n}\n","export { CodemationPostgresPrismaClientFactory } from \"./infrastructure/persistence/CodemationPostgresPrismaClientFactory\";\nexport { DatabasePersistenceResolver } from \"./infrastructure/persistence/DatabasePersistenceResolver\";\nexport type { ResolvedDatabasePersistence } from \"./infrastructure/persistence/DatabasePersistenceResolver\";\nexport { PrismaMigrationDeployer } from \"./infrastructure/persistence/PrismaMigrationDeployer\";\nexport { PrismaClient } from \"./infrastructure/persistence/generated/prisma-client/client.js\";\n"],"mappings":";;;;;;AAGA,IAAa,wCAAb,MAAmD;CACjD,OAAO,OAAO,aAAmC;AAE/C,SAAO,IAAIA,6BAAa,EAAE,SADV,IAAI,SAAS,EAAE,kBAAkB,aAAa,CAAC,EAC5B,CAAC"}
1
+ {"version":3,"file":"persistenceServer-8tcM2S48.js","names":["PrismaClient"],"sources":["../src/infrastructure/persistence/CodemationPostgresPrismaClientFactory.ts","../src/persistenceServer.ts"],"sourcesContent":["import { PrismaPg } from \"@prisma/adapter-pg\";\nimport { PrismaClient } from \"./generated/prisma-client/client.js\";\n\nexport class CodemationPostgresPrismaClientFactory {\n static create(databaseUrl: string): PrismaClient {\n const adapter = new PrismaPg({ connectionString: databaseUrl });\n return new PrismaClient({ adapter });\n }\n}\n","export { CodemationPostgresPrismaClientFactory } from \"./infrastructure/persistence/CodemationPostgresPrismaClientFactory\";\nexport { DatabasePersistenceResolver } from \"./infrastructure/persistence/DatabasePersistenceResolver\";\nexport type { ResolvedDatabasePersistence } from \"./infrastructure/persistence/DatabasePersistenceResolver\";\nexport { PrismaMigrationDeployer } from \"./infrastructure/persistence/PrismaMigrationDeployer\";\nexport { PrismaClient } from \"./infrastructure/persistence/generated/prisma-client/client.js\";\n"],"mappings":";;;;;;AAGA,IAAa,wCAAb,MAAmD;CACjD,OAAO,OAAO,aAAmC;AAE/C,SAAO,IAAIA,6BAAa,EAAE,SADV,IAAI,SAAS,EAAE,kBAAkB,aAAa,CAAC,EAC5B,CAAC"}
@@ -26,11 +26,12 @@ declare class PrismaMigrationDeployer {
26
26
  private pgliteSocketConnectionToPostgresUrl;
27
27
  private createProcessEnvironment;
28
28
  private resolvePrismaCliPath;
29
- private resolvePrismaConfigPath;
29
+ private resolveAbsolutePrismaConfigPath;
30
30
  resolvePackageRoot(): string;
31
+ private ensurePgliteParentDirectoryExists;
31
32
  private createPgliteOpenFailureError;
32
33
  private createDeployError;
33
34
  }
34
35
  //#endregion
35
36
  export { CodemationPostgresPrismaClientFactory as n, PrismaMigrationDeployer as t };
36
- //# sourceMappingURL=persistenceServer-K5eqlZm3.d.ts.map
37
+ //# sourceMappingURL=persistenceServer-DPSj_-oU.d.ts.map
@@ -2,5 +2,5 @@ import "./CodemationWhitelabelConfig-DgbjgtrR.js";
2
2
  import "./index-Bs4F1IsC.js";
3
3
  import "./CodemationConfig-XCkSV2dj.js";
4
4
  import { n as DatabasePersistenceResolver, r as ResolvedDatabasePersistence, t as PrismaClient } from "./client-Yh7-CQud.js";
5
- import { n as CodemationPostgresPrismaClientFactory, t as PrismaMigrationDeployer } from "./persistenceServer-K5eqlZm3.js";
5
+ import { n as CodemationPostgresPrismaClientFactory, t as PrismaMigrationDeployer } from "./persistenceServer-DPSj_-oU.js";
6
6
  export { CodemationPostgresPrismaClientFactory, DatabasePersistenceResolver, PrismaClient, PrismaMigrationDeployer, ResolvedDatabasePersistence };
@@ -1,6 +1,6 @@
1
1
  import "./decorate-B-N_5S4p.js";
2
- import { n as DatabasePersistenceResolver, t as PrismaMigrationDeployer } from "./PrismaMigrationDeployer-B1E_gYz7.js";
3
- import { n as CodemationPostgresPrismaClientFactory, t as import_client } from "./persistenceServer-W9uRw0dJ.js";
2
+ import { n as DatabasePersistenceResolver, t as PrismaMigrationDeployer } from "./PrismaMigrationDeployer-B7cHGrXP.js";
3
+ import { n as CodemationPostgresPrismaClientFactory, t as import_client } from "./persistenceServer-8tcM2S48.js";
4
4
 
5
5
  var PrismaClient = import_client.PrismaClient;
6
6
  export { CodemationPostgresPrismaClientFactory, DatabasePersistenceResolver, PrismaClient, PrismaMigrationDeployer };
@@ -1,5 +1,5 @@
1
1
  import { u as ApplicationTokens } from "./CredentialServices-BKBGe7l3.js";
2
- import { _ as GetWorkflowDetailQuery, c as WorkflowDefinitionMapper, g as GetWorkflowSummariesQuery, i as CodemationHonoApiApp, n as CodemationBootstrapRequest, r as CodemationApplication, t as CodemationFrontendBootstrapRequest } from "./CodemationFrontendBootstrapRequest-CE6DjOWJ.js";
2
+ import { _ as GetWorkflowDetailQuery, c as WorkflowDefinitionMapper, g as GetWorkflowSummariesQuery, i as CodemationHonoApiApp, n as CodemationBootstrapRequest, r as CodemationApplication, t as CodemationFrontendBootstrapRequest } from "./CodemationFrontendBootstrapRequest-CNEk-C4D.js";
3
3
  import { readFile, readdir } from "node:fs/promises";
4
4
  import path from "node:path";
5
5
  import { pathToFileURL } from "node:url";
@@ -172,4 +172,4 @@ var CodemationPluginDiscovery = class {
172
172
 
173
173
  //#endregion
174
174
  export { CodemationServerGateway as n, CodemationPluginDiscovery as t };
175
- //# sourceMappingURL=server-BiHSuA13.js.map
175
+ //# sourceMappingURL=server-Dd65rNm6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-BiHSuA13.js","names":["config: CodemationConfig","consumerRoot: string","configSource?: string","workflowSources: ReadonlyArray<string>","env?: Readonly<NodeJS.ProcessEnv>","discoveredPackages: CodemationDiscoveredPluginPackage[]","resolvedPackages: CodemationResolvedPluginPackage[]","packageRoots: string[]"],"sources":["../src/presentation/http/CodemationServerGatewayFactory.ts","../src/presentation/server/CodemationPluginDiscovery.ts"],"sourcesContent":["import { accessSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { QueryBus } from \"../../application/bus/QueryBus\";\nimport type { WorkflowDto, WorkflowSummary } from \"../../application/contracts/WorkflowViewContracts\";\nimport { WorkflowDefinitionMapper } from \"../../application/mapping/WorkflowDefinitionMapper\";\nimport { GetWorkflowDetailQuery } from \"../../application/queries/GetWorkflowDetailQuery\";\nimport { GetWorkflowSummariesQuery } from \"../../application/queries/GetWorkflowSummariesQuery\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport { CodemationApplication } from \"../../codemationApplication\";\nimport { CodemationBootstrapRequest } from \"../../bootstrap/CodemationBootstrapRequest\";\nimport { CodemationFrontendBootstrapRequest } from \"../../bootstrap/CodemationFrontendBootstrapRequest\";\nimport type { CodemationConfig } from \"../config/CodemationConfig\";\nimport { CodemationHonoApiApp } from \"./hono/CodemationHonoApiAppFactory\";\n\ntype ServerGatewayContext = Readonly<{\n application: CodemationApplication;\n httpApi: CodemationHonoApiApp;\n queryBus: QueryBus;\n workflowDefinitionMapper: WorkflowDefinitionMapper;\n}>;\n\nexport class CodemationServerGateway {\n private static readonly contextsByConfig = new WeakMap<object, Promise<ServerGatewayContext>>();\n\n constructor(\n private readonly config: CodemationConfig,\n private readonly consumerRoot: string,\n private readonly configSource?: string,\n private readonly workflowSources: ReadonlyArray<string> = [],\n private readonly env?: Readonly<NodeJS.ProcessEnv>,\n ) {}\n\n async dispatch(request: Request): Promise<Response> {\n return await (await this.getContext()).httpApi.fetch(request);\n }\n\n async prepare(): Promise<void> {\n await this.getContext();\n }\n\n async close(): Promise<void> {\n const cachedContext = CodemationServerGateway.contextsByConfig.get(this.config as object);\n if (!cachedContext) {\n return;\n }\n CodemationServerGateway.contextsByConfig.delete(this.config as object);\n await (await cachedContext).application.stop();\n }\n\n async loadWorkflowSummaries(): Promise<ReadonlyArray<WorkflowSummary>> {\n const context = await this.getContext();\n const workflows = await context.queryBus.execute(new GetWorkflowSummariesQuery());\n return workflows.map((workflow) => context.workflowDefinitionMapper.toSummary(workflow));\n }\n\n async loadWorkflowDetail(workflowId: string): Promise<WorkflowDto> {\n const context = await this.getContext();\n const workflow = await context.queryBus.execute(new GetWorkflowDetailQuery(workflowId));\n if (!workflow) {\n throw new Error(`Unknown workflowId: ${workflowId}`);\n }\n return await context.workflowDefinitionMapper.map(workflow);\n }\n\n private getContext(): Promise<ServerGatewayContext> {\n const cachedContext = CodemationServerGateway.contextsByConfig.get(this.config as object);\n if (cachedContext) {\n return cachedContext;\n }\n const nextContext = this.createContext();\n CodemationServerGateway.contextsByConfig.set(this.config as object, nextContext);\n return nextContext;\n }\n\n private async createContext(): Promise<ServerGatewayContext> {\n const repoRoot = this.detectWorkspaceRoot(this.consumerRoot);\n const bootstrapRequest = new CodemationBootstrapRequest({\n repoRoot,\n consumerRoot: this.consumerRoot,\n env: this.env,\n workflowSources: this.resolveWorkflowSources(),\n });\n const application = new CodemationApplication();\n application.useConfig(this.config);\n await application.applyPlugins(bootstrapRequest);\n await application.prepareContainer(bootstrapRequest);\n await application.bootFrontend(new CodemationFrontendBootstrapRequest({ bootstrap: bootstrapRequest }));\n return {\n application,\n httpApi: application.getContainer().resolve(CodemationHonoApiApp),\n queryBus: application.getContainer().resolve(ApplicationTokens.QueryBus),\n workflowDefinitionMapper: application.getContainer().resolve(WorkflowDefinitionMapper),\n };\n }\n\n private resolveWorkflowSources(): ReadonlyArray<string> {\n if (this.workflowSources.length > 0) {\n return [...this.workflowSources];\n }\n if (!this.configSource || !this.config.workflows || this.config.workflows.length === 0) {\n return [];\n }\n return [this.configSource];\n }\n private detectWorkspaceRoot(startDirectory: string): string {\n let currentDirectory = path.resolve(startDirectory);\n while (true) {\n try {\n accessSync(path.resolve(currentDirectory, \"pnpm-workspace.yaml\"));\n return currentDirectory;\n } catch {\n const parentDirectory = path.dirname(currentDirectory);\n if (parentDirectory === currentDirectory) {\n return startDirectory;\n }\n currentDirectory = parentDirectory;\n }\n }\n }\n}\n","import type { CodemationPackageManifest } from \"../config/CodemationPackageManifest\";\nimport type { CodemationPlugin } from \"../config/CodemationPlugin\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nexport type CodemationDiscoveredPluginPackage = Readonly<{\n packageName: string;\n packageRoot: string;\n manifest: NonNullable<CodemationPackageManifest[\"plugin\"]>;\n developmentEntry?: string;\n}>;\n\nexport type CodemationResolvedPluginPackage = Readonly<\n CodemationDiscoveredPluginPackage & {\n plugin: CodemationPlugin;\n }\n>;\n\ntype PackageJsonShape = Readonly<{\n codemation?: CodemationPackageManifest;\n name?: string;\n exports?: Readonly<Record<string, unknown>>;\n}>;\n\nexport class CodemationPluginDiscovery {\n async discover(consumerRoot: string): Promise<ReadonlyArray<CodemationDiscoveredPluginPackage>> {\n const nodeModulesRoot = path.resolve(consumerRoot, \"node_modules\");\n const packageRoots = await this.collectPackageRoots(nodeModulesRoot);\n const discoveredPackages: CodemationDiscoveredPluginPackage[] = [];\n for (const packageRoot of packageRoots) {\n const packageJson = await this.readPackageJson(path.resolve(packageRoot, \"package.json\"));\n const pluginManifest = packageJson.codemation?.plugin;\n if (!packageJson.name || !pluginManifest || pluginManifest.kind !== \"plugin\") {\n continue;\n }\n discoveredPackages.push({\n packageName: packageJson.name,\n packageRoot,\n manifest: pluginManifest,\n developmentEntry: this.resolveDevelopmentPluginEntry(packageJson),\n });\n }\n return discoveredPackages.sort((left, right) => left.packageName.localeCompare(right.packageName));\n }\n\n async resolvePlugins(consumerRoot: string): Promise<ReadonlyArray<CodemationResolvedPluginPackage>> {\n const discoveredPackages = await this.discover(consumerRoot);\n return await this.resolveDiscoveredPackages(discoveredPackages);\n }\n\n async resolveDiscoveredPackages(\n discoveredPackages: ReadonlyArray<CodemationDiscoveredPluginPackage>,\n ): Promise<ReadonlyArray<CodemationResolvedPluginPackage>> {\n const resolvedPackages: CodemationResolvedPluginPackage[] = [];\n for (const discoveredPackage of discoveredPackages) {\n resolvedPackages.push({\n ...discoveredPackage,\n plugin: await this.loadPlugin(discoveredPackage),\n });\n }\n return resolvedPackages;\n }\n\n private async collectPackageRoots(nodeModulesRoot: string): Promise<ReadonlyArray<string>> {\n try {\n const entries = await readdir(nodeModulesRoot, { withFileTypes: true });\n const packageRoots: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) {\n continue;\n }\n if (entry.name.startsWith(\"@\")) {\n const scopedEntries = await readdir(path.resolve(nodeModulesRoot, entry.name), { withFileTypes: true });\n for (const scopedEntry of scopedEntries) {\n if (scopedEntry.isDirectory() || scopedEntry.isSymbolicLink()) {\n packageRoots.push(path.resolve(nodeModulesRoot, entry.name, scopedEntry.name));\n }\n }\n continue;\n }\n packageRoots.push(path.resolve(nodeModulesRoot, entry.name));\n }\n return packageRoots;\n } catch {\n return [];\n }\n }\n\n private async readPackageJson(packageJsonPath: string): Promise<PackageJsonShape> {\n try {\n const rawPackageJson = await readFile(packageJsonPath, \"utf8\");\n return JSON.parse(rawPackageJson) as PackageJsonShape;\n } catch {\n return {};\n }\n }\n\n private async loadPlugin(discoveredPackage: CodemationDiscoveredPluginPackage): Promise<CodemationPlugin> {\n const pluginModulePath = path.resolve(discoveredPackage.packageRoot, this.resolvePluginEntry(discoveredPackage));\n const importedModule = (await import(pathToFileURL(pluginModulePath).href)) as Record<string, unknown>;\n const pluginExportName = discoveredPackage.manifest.exportName;\n const explicitExport = pluginExportName ? importedModule[pluginExportName] : undefined;\n const exportedValue = explicitExport ?? importedModule.default ?? importedModule.codemationPlugin;\n const plugin = this.resolvePluginValue(exportedValue);\n if (!plugin) {\n throw new Error(`Plugin package \"${discoveredPackage.packageName}\" did not export a Codemation plugin instance.`);\n }\n return plugin;\n }\n\n private resolvePluginValue(value: unknown): CodemationPlugin | null {\n if (this.isPlugin(value)) {\n return value;\n }\n if (this.isPluginConstructor(value)) {\n return new value();\n }\n return null;\n }\n\n private isPlugin(value: unknown): value is CodemationPlugin {\n return (\n Boolean(value) && typeof value === \"object\" && typeof (value as { register?: unknown }).register === \"function\"\n );\n }\n\n private isPluginConstructor(value: unknown): value is new () => CodemationPlugin {\n return typeof value === \"function\" && this.isPlugin(value.prototype);\n }\n\n private resolvePluginEntry(discoveredPackage: CodemationDiscoveredPluginPackage): string {\n if (\n process.env.CODEMATION_PREFER_PLUGIN_SOURCE_ENTRY === \"true\" &&\n typeof discoveredPackage.developmentEntry === \"string\" &&\n discoveredPackage.developmentEntry.trim().length > 0\n ) {\n return discoveredPackage.developmentEntry;\n }\n return discoveredPackage.manifest.entry;\n }\n\n private resolveDevelopmentPluginEntry(packageJson: PackageJsonShape): string | undefined {\n const exportRecord = packageJson.exports?.[\"./codemation-plugin\"];\n if (!exportRecord || typeof exportRecord !== \"object\") {\n return undefined;\n }\n const importPath = (exportRecord as { import?: unknown }).import;\n return typeof importPath === \"string\" && importPath.trim().length > 0 ? importPath : undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"server-Dd65rNm6.js","names":["config: CodemationConfig","consumerRoot: string","configSource?: string","workflowSources: ReadonlyArray<string>","env?: Readonly<NodeJS.ProcessEnv>","discoveredPackages: CodemationDiscoveredPluginPackage[]","resolvedPackages: CodemationResolvedPluginPackage[]","packageRoots: string[]"],"sources":["../src/presentation/http/CodemationServerGatewayFactory.ts","../src/presentation/server/CodemationPluginDiscovery.ts"],"sourcesContent":["import { accessSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { QueryBus } from \"../../application/bus/QueryBus\";\nimport type { WorkflowDto, WorkflowSummary } from \"../../application/contracts/WorkflowViewContracts\";\nimport { WorkflowDefinitionMapper } from \"../../application/mapping/WorkflowDefinitionMapper\";\nimport { GetWorkflowDetailQuery } from \"../../application/queries/GetWorkflowDetailQuery\";\nimport { GetWorkflowSummariesQuery } from \"../../application/queries/GetWorkflowSummariesQuery\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport { CodemationApplication } from \"../../codemationApplication\";\nimport { CodemationBootstrapRequest } from \"../../bootstrap/CodemationBootstrapRequest\";\nimport { CodemationFrontendBootstrapRequest } from \"../../bootstrap/CodemationFrontendBootstrapRequest\";\nimport type { CodemationConfig } from \"../config/CodemationConfig\";\nimport { CodemationHonoApiApp } from \"./hono/CodemationHonoApiAppFactory\";\n\ntype ServerGatewayContext = Readonly<{\n application: CodemationApplication;\n httpApi: CodemationHonoApiApp;\n queryBus: QueryBus;\n workflowDefinitionMapper: WorkflowDefinitionMapper;\n}>;\n\nexport class CodemationServerGateway {\n private static readonly contextsByConfig = new WeakMap<object, Promise<ServerGatewayContext>>();\n\n constructor(\n private readonly config: CodemationConfig,\n private readonly consumerRoot: string,\n private readonly configSource?: string,\n private readonly workflowSources: ReadonlyArray<string> = [],\n private readonly env?: Readonly<NodeJS.ProcessEnv>,\n ) {}\n\n async dispatch(request: Request): Promise<Response> {\n return await (await this.getContext()).httpApi.fetch(request);\n }\n\n async prepare(): Promise<void> {\n await this.getContext();\n }\n\n async close(): Promise<void> {\n const cachedContext = CodemationServerGateway.contextsByConfig.get(this.config as object);\n if (!cachedContext) {\n return;\n }\n CodemationServerGateway.contextsByConfig.delete(this.config as object);\n await (await cachedContext).application.stop();\n }\n\n async loadWorkflowSummaries(): Promise<ReadonlyArray<WorkflowSummary>> {\n const context = await this.getContext();\n const workflows = await context.queryBus.execute(new GetWorkflowSummariesQuery());\n return workflows.map((workflow) => context.workflowDefinitionMapper.toSummary(workflow));\n }\n\n async loadWorkflowDetail(workflowId: string): Promise<WorkflowDto> {\n const context = await this.getContext();\n const workflow = await context.queryBus.execute(new GetWorkflowDetailQuery(workflowId));\n if (!workflow) {\n throw new Error(`Unknown workflowId: ${workflowId}`);\n }\n return await context.workflowDefinitionMapper.map(workflow);\n }\n\n private getContext(): Promise<ServerGatewayContext> {\n const cachedContext = CodemationServerGateway.contextsByConfig.get(this.config as object);\n if (cachedContext) {\n return cachedContext;\n }\n const nextContext = this.createContext();\n CodemationServerGateway.contextsByConfig.set(this.config as object, nextContext);\n return nextContext;\n }\n\n private async createContext(): Promise<ServerGatewayContext> {\n const repoRoot = this.detectWorkspaceRoot(this.consumerRoot);\n const bootstrapRequest = new CodemationBootstrapRequest({\n repoRoot,\n consumerRoot: this.consumerRoot,\n env: this.env,\n workflowSources: this.resolveWorkflowSources(),\n });\n const application = new CodemationApplication();\n application.useConfig(this.config);\n await application.applyPlugins(bootstrapRequest);\n await application.prepareContainer(bootstrapRequest);\n await application.bootFrontend(new CodemationFrontendBootstrapRequest({ bootstrap: bootstrapRequest }));\n return {\n application,\n httpApi: application.getContainer().resolve(CodemationHonoApiApp),\n queryBus: application.getContainer().resolve(ApplicationTokens.QueryBus),\n workflowDefinitionMapper: application.getContainer().resolve(WorkflowDefinitionMapper),\n };\n }\n\n private resolveWorkflowSources(): ReadonlyArray<string> {\n if (this.workflowSources.length > 0) {\n return [...this.workflowSources];\n }\n if (!this.configSource || !this.config.workflows || this.config.workflows.length === 0) {\n return [];\n }\n return [this.configSource];\n }\n private detectWorkspaceRoot(startDirectory: string): string {\n let currentDirectory = path.resolve(startDirectory);\n while (true) {\n try {\n accessSync(path.resolve(currentDirectory, \"pnpm-workspace.yaml\"));\n return currentDirectory;\n } catch {\n const parentDirectory = path.dirname(currentDirectory);\n if (parentDirectory === currentDirectory) {\n return startDirectory;\n }\n currentDirectory = parentDirectory;\n }\n }\n }\n}\n","import type { CodemationPackageManifest } from \"../config/CodemationPackageManifest\";\nimport type { CodemationPlugin } from \"../config/CodemationPlugin\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nexport type CodemationDiscoveredPluginPackage = Readonly<{\n packageName: string;\n packageRoot: string;\n manifest: NonNullable<CodemationPackageManifest[\"plugin\"]>;\n developmentEntry?: string;\n}>;\n\nexport type CodemationResolvedPluginPackage = Readonly<\n CodemationDiscoveredPluginPackage & {\n plugin: CodemationPlugin;\n }\n>;\n\ntype PackageJsonShape = Readonly<{\n codemation?: CodemationPackageManifest;\n name?: string;\n exports?: Readonly<Record<string, unknown>>;\n}>;\n\nexport class CodemationPluginDiscovery {\n async discover(consumerRoot: string): Promise<ReadonlyArray<CodemationDiscoveredPluginPackage>> {\n const nodeModulesRoot = path.resolve(consumerRoot, \"node_modules\");\n const packageRoots = await this.collectPackageRoots(nodeModulesRoot);\n const discoveredPackages: CodemationDiscoveredPluginPackage[] = [];\n for (const packageRoot of packageRoots) {\n const packageJson = await this.readPackageJson(path.resolve(packageRoot, \"package.json\"));\n const pluginManifest = packageJson.codemation?.plugin;\n if (!packageJson.name || !pluginManifest || pluginManifest.kind !== \"plugin\") {\n continue;\n }\n discoveredPackages.push({\n packageName: packageJson.name,\n packageRoot,\n manifest: pluginManifest,\n developmentEntry: this.resolveDevelopmentPluginEntry(packageJson),\n });\n }\n return discoveredPackages.sort((left, right) => left.packageName.localeCompare(right.packageName));\n }\n\n async resolvePlugins(consumerRoot: string): Promise<ReadonlyArray<CodemationResolvedPluginPackage>> {\n const discoveredPackages = await this.discover(consumerRoot);\n return await this.resolveDiscoveredPackages(discoveredPackages);\n }\n\n async resolveDiscoveredPackages(\n discoveredPackages: ReadonlyArray<CodemationDiscoveredPluginPackage>,\n ): Promise<ReadonlyArray<CodemationResolvedPluginPackage>> {\n const resolvedPackages: CodemationResolvedPluginPackage[] = [];\n for (const discoveredPackage of discoveredPackages) {\n resolvedPackages.push({\n ...discoveredPackage,\n plugin: await this.loadPlugin(discoveredPackage),\n });\n }\n return resolvedPackages;\n }\n\n private async collectPackageRoots(nodeModulesRoot: string): Promise<ReadonlyArray<string>> {\n try {\n const entries = await readdir(nodeModulesRoot, { withFileTypes: true });\n const packageRoots: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) {\n continue;\n }\n if (entry.name.startsWith(\"@\")) {\n const scopedEntries = await readdir(path.resolve(nodeModulesRoot, entry.name), { withFileTypes: true });\n for (const scopedEntry of scopedEntries) {\n if (scopedEntry.isDirectory() || scopedEntry.isSymbolicLink()) {\n packageRoots.push(path.resolve(nodeModulesRoot, entry.name, scopedEntry.name));\n }\n }\n continue;\n }\n packageRoots.push(path.resolve(nodeModulesRoot, entry.name));\n }\n return packageRoots;\n } catch {\n return [];\n }\n }\n\n private async readPackageJson(packageJsonPath: string): Promise<PackageJsonShape> {\n try {\n const rawPackageJson = await readFile(packageJsonPath, \"utf8\");\n return JSON.parse(rawPackageJson) as PackageJsonShape;\n } catch {\n return {};\n }\n }\n\n private async loadPlugin(discoveredPackage: CodemationDiscoveredPluginPackage): Promise<CodemationPlugin> {\n const pluginModulePath = path.resolve(discoveredPackage.packageRoot, this.resolvePluginEntry(discoveredPackage));\n const importedModule = (await import(pathToFileURL(pluginModulePath).href)) as Record<string, unknown>;\n const pluginExportName = discoveredPackage.manifest.exportName;\n const explicitExport = pluginExportName ? importedModule[pluginExportName] : undefined;\n const exportedValue = explicitExport ?? importedModule.default ?? importedModule.codemationPlugin;\n const plugin = this.resolvePluginValue(exportedValue);\n if (!plugin) {\n throw new Error(`Plugin package \"${discoveredPackage.packageName}\" did not export a Codemation plugin instance.`);\n }\n return plugin;\n }\n\n private resolvePluginValue(value: unknown): CodemationPlugin | null {\n if (this.isPlugin(value)) {\n return value;\n }\n if (this.isPluginConstructor(value)) {\n return new value();\n }\n return null;\n }\n\n private isPlugin(value: unknown): value is CodemationPlugin {\n return (\n Boolean(value) && typeof value === \"object\" && typeof (value as { register?: unknown }).register === \"function\"\n );\n }\n\n private isPluginConstructor(value: unknown): value is new () => CodemationPlugin {\n return typeof value === \"function\" && this.isPlugin(value.prototype);\n }\n\n private resolvePluginEntry(discoveredPackage: CodemationDiscoveredPluginPackage): string {\n if (\n process.env.CODEMATION_PREFER_PLUGIN_SOURCE_ENTRY === \"true\" &&\n typeof discoveredPackage.developmentEntry === \"string\" &&\n discoveredPackage.developmentEntry.trim().length > 0\n ) {\n return discoveredPackage.developmentEntry;\n }\n return discoveredPackage.manifest.entry;\n }\n\n private resolveDevelopmentPluginEntry(packageJson: PackageJsonShape): string | undefined {\n const exportRecord = packageJson.exports?.[\"./codemation-plugin\"];\n if (!exportRecord || typeof exportRecord !== \"object\") {\n return undefined;\n }\n const importPath = (exportRecord as { import?: unknown }).import;\n return typeof importPath === \"string\" && importPath.trim().length > 0 ? importPath : undefined;\n }\n}\n"],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -5,5 +5,5 @@ import { i as CodemationConsumerAppResolver, n as CodemationConsumerConfigResolu
5
5
  import { t as PrismaClient } from "./client-Yh7-CQud.js";
6
6
  import "./WorkflowViewContracts-DCLpTn25.js";
7
7
  import { a as CodemationResolvedPluginPackage, i as CodemationPluginDiscovery, n as WorkflowModulePathFinder, o as CodemationServerGateway, r as CodemationDiscoveredPluginPackage, s as ApiPaths, t as WorkflowDiscoveryPathSegmentsComputer } from "./server-BBdsATju.js";
8
- import { n as CodemationPostgresPrismaClientFactory } from "./persistenceServer-K5eqlZm3.js";
8
+ import { n as CodemationPostgresPrismaClientFactory } from "./persistenceServer-DPSj_-oU.js";
9
9
  export { ApiPaths, CodemationConsumerApp, CodemationConsumerAppResolver, CodemationConsumerConfigLoader, CodemationConsumerConfigResolution, CodemationDiscoveredPluginPackage, CodemationPluginDiscovery, CodemationPostgresPrismaClientFactory, CodemationResolvedPluginPackage, CodemationServerGateway, PrismaClient, WorkflowDiscoveryPathSegmentsComputer, WorkflowModulePathFinder };
package/dist/server.js CHANGED
@@ -4,10 +4,10 @@ import { i as CodemationConsumerAppResolver, n as WorkflowDiscoveryPathSegmentsC
4
4
  import "./decorateParam-BTcc3KNk.js";
5
5
  import "./decorate-B-N_5S4p.js";
6
6
  import "./CredentialServices-BKBGe7l3.js";
7
- import { o as ApiPaths } from "./CodemationFrontendBootstrapRequest-CE6DjOWJ.js";
8
- import "./PrismaMigrationDeployer-B1E_gYz7.js";
9
- import { n as CodemationPostgresPrismaClientFactory, t as import_client } from "./persistenceServer-W9uRw0dJ.js";
10
- import { n as CodemationServerGateway, t as CodemationPluginDiscovery } from "./server-BiHSuA13.js";
7
+ import { o as ApiPaths } from "./CodemationFrontendBootstrapRequest-CNEk-C4D.js";
8
+ import "./PrismaMigrationDeployer-B7cHGrXP.js";
9
+ import { n as CodemationPostgresPrismaClientFactory, t as import_client } from "./persistenceServer-8tcM2S48.js";
10
+ import { n as CodemationServerGateway, t as CodemationPluginDiscovery } from "./server-Dd65rNm6.js";
11
11
 
12
12
  var PrismaClient = import_client.PrismaClient;
13
13
  export { ApiPaths, CodemationConsumerAppResolver, CodemationConsumerConfigLoader, CodemationPluginDiscovery, CodemationPostgresPrismaClientFactory, CodemationServerGateway, PrismaClient, WorkflowDiscoveryPathSegmentsComputer, WorkflowModulePathFinder };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemation/host",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -103,10 +103,10 @@
103
103
  "tsx": "^4.21.0",
104
104
  "ws": "^8.19.0",
105
105
  "zxcvbn": "^4.4.2",
106
- "@codemation/core": "0.0.1",
107
- "@codemation/core-nodes": "0.0.1",
108
- "@codemation/eventbus-redis": "0.0.1",
109
- "@codemation/queue-bullmq": "0.0.1"
106
+ "@codemation/core": "0.0.3",
107
+ "@codemation/core-nodes": "0.0.3",
108
+ "@codemation/eventbus-redis": "0.0.3",
109
+ "@codemation/queue-bullmq": "0.0.3"
110
110
  },
111
111
  "devDependencies": {
112
112
  "@playwright/test": "^1.58.2",
@@ -131,7 +131,7 @@
131
131
  "tsdown": "^0.15.5",
132
132
  "typescript": "^5.9.3",
133
133
  "vitest": "^4.0.18",
134
- "@codemation/core-nodes-gmail": "0.0.1"
134
+ "@codemation/core-nodes-gmail": "0.0.3"
135
135
  },
136
136
  "scripts": {
137
137
  "prisma:generate": "prisma generate && node ./scripts/ensure-prisma-runtime-sourcemaps.mjs",
@@ -3,6 +3,7 @@ import { PGLiteSocketServer } from "@electric-sql/pglite-socket";
3
3
  import { injectable } from "@codemation/core";
4
4
  import { spawn } from "node:child_process";
5
5
  import { existsSync } from "node:fs";
6
+ import { mkdir } from "node:fs/promises";
6
7
  import { createRequire } from "node:module";
7
8
  import path from "node:path";
8
9
  import { fileURLToPath } from "node:url";
@@ -34,6 +35,7 @@ export class PrismaMigrationDeployer {
34
35
  private async deployPgliteViaPrismaCli(
35
36
  args: Readonly<{ dataDir: string; env?: Readonly<NodeJS.ProcessEnv> }>,
36
37
  ): Promise<void> {
38
+ await this.ensurePgliteParentDirectoryExists(args.dataDir);
37
39
  let pglite: PGlite;
38
40
  try {
39
41
  pglite = new PGlite(args.dataDir);
@@ -61,12 +63,13 @@ export class PrismaMigrationDeployer {
61
63
  private async deployPostgres(
62
64
  args: Readonly<{ databaseUrl: string; env?: Readonly<NodeJS.ProcessEnv> }>,
63
65
  ): Promise<void> {
66
+ const prismaConfigPath = this.resolveAbsolutePrismaConfigPath();
64
67
  await new Promise<void>((resolve, reject) => {
65
68
  const command = spawn(
66
69
  process.execPath,
67
- [this.resolvePrismaCliPath(), "migrate", "deploy", "--config", this.resolvePrismaConfigPath()],
70
+ [this.resolvePrismaCliPath(), "migrate", "deploy", "--config", path.basename(prismaConfigPath)],
68
71
  {
69
- cwd: this.resolvePackageRoot(),
72
+ cwd: path.dirname(prismaConfigPath),
70
73
  env: this.createProcessEnvironment(args.databaseUrl, args.env),
71
74
  stdio: ["ignore", "pipe", "pipe"],
72
75
  },
@@ -145,12 +148,12 @@ export class PrismaMigrationDeployer {
145
148
  }
146
149
  }
147
150
 
148
- private resolvePrismaConfigPath(): string {
151
+ private resolveAbsolutePrismaConfigPath(): string {
149
152
  const configuredPath = process.env.CODEMATION_PRISMA_CONFIG_PATH;
150
153
  if (configuredPath) {
151
- return configuredPath;
154
+ return path.isAbsolute(configuredPath) ? configuredPath : path.resolve(this.resolvePackageRoot(), configuredPath);
152
155
  }
153
- return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "..", "prisma.config.ts");
156
+ return path.resolve(this.resolvePackageRoot(), "prisma.config.ts");
154
157
  }
155
158
 
156
159
  resolvePackageRoot(): string {
@@ -158,7 +161,22 @@ export class PrismaMigrationDeployer {
158
161
  if (configuredRoot) {
159
162
  return configuredRoot;
160
163
  }
161
- return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
164
+ let currentDirectory = path.dirname(fileURLToPath(import.meta.url));
165
+ for (let depth = 0; depth < 8; depth += 1) {
166
+ if (existsSync(path.join(currentDirectory, "prisma", "schema.prisma"))) {
167
+ return currentDirectory;
168
+ }
169
+ const parentDirectory = path.dirname(currentDirectory);
170
+ if (parentDirectory === currentDirectory) {
171
+ break;
172
+ }
173
+ currentDirectory = parentDirectory;
174
+ }
175
+ throw new Error(`Could not locate prisma/schema.prisma near ${fileURLToPath(import.meta.url)}.`);
176
+ }
177
+
178
+ private async ensurePgliteParentDirectoryExists(dataDir: string): Promise<void> {
179
+ await mkdir(path.dirname(dataDir), { recursive: true });
162
180
  }
163
181
 
164
182
  private createPgliteOpenFailureError(dataDir: string, cause: unknown): Error {