@codemation/host 0.1.6 → 0.2.0

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.
Files changed (47) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/{AppConfigFactory-BiFHnorf.d.ts → AppConfigFactory-DHdAGOmC.d.ts} +3 -3
  3. package/dist/{AppContainerFactory-BRU02PTm.js → AppContainerFactory-BKaAUIi-.js} +91 -27
  4. package/dist/AppContainerFactory-BKaAUIi-.js.map +1 -0
  5. package/dist/{CodemationConfig-DuGk7uN5.d.ts → CodemationConfig-DBbMU3HB.d.ts} +2 -2
  6. package/dist/{CodemationConfigNormalizer-BP2-0ZDE.d.ts → CodemationConfigNormalizer-C8wC0skq.d.ts} +2 -2
  7. package/dist/{CodemationConsumerConfigLoader-D5CSz3TQ.d.ts → CodemationConsumerConfigLoader-Ceh6sB3X.d.ts} +3 -2
  8. package/dist/{CodemationConsumerConfigLoader-C_ISRrpI.js → CodemationConsumerConfigLoader-D6LFSlp5.js} +20 -7
  9. package/dist/CodemationConsumerConfigLoader-D6LFSlp5.js.map +1 -0
  10. package/dist/{CodemationPluginListMerger-DFzGgfyI.d.ts → CodemationPluginListMerger-Cx9DnyR-.d.ts} +5 -5
  11. package/dist/{CredentialServices-Bhejvys-.d.ts → CredentialServices-CYETzKyb.d.ts} +14 -5
  12. package/dist/{CredentialServices-xVxVA9Tq.js → CredentialServices-D8BBZH1i.js} +40 -6
  13. package/dist/CredentialServices-D8BBZH1i.js.map +1 -0
  14. package/dist/{PublicFrontendBootstrapFactory-CSgWyTra.d.ts → PublicFrontendBootstrapFactory-DeMjp3cs.d.ts} +5 -2
  15. package/dist/consumer.d.ts +4 -4
  16. package/dist/consumer.js +1 -1
  17. package/dist/credentials.d.ts +3 -3
  18. package/dist/credentials.js +1 -1
  19. package/dist/devServerSidecar.d.ts +1 -1
  20. package/dist/{index-BQaZZmOm.d.ts → index-dK05sTQ4.d.ts} +50 -60
  21. package/dist/index.d.ts +97 -12
  22. package/dist/index.js +4 -4
  23. package/dist/nextServer.d.ts +16 -8
  24. package/dist/nextServer.js +2 -2
  25. package/dist/{persistenceServer-fdldtXJH.d.ts → persistenceServer-D9vUTMqc.d.ts} +2 -2
  26. package/dist/persistenceServer.d.ts +5 -5
  27. package/dist/{server-ChTCEc6R.js → server-C-WZcsId.js} +5 -6
  28. package/dist/{server-ChTCEc6R.js.map → server-C-WZcsId.js.map} +1 -1
  29. package/dist/{server-Cpzpy1Ar.d.ts → server-fxqY2WEi.d.ts} +5 -5
  30. package/dist/server.d.ts +8 -8
  31. package/dist/server.js +4 -4
  32. package/package.json +6 -5
  33. package/playwright.config.ts +10 -6
  34. package/src/application/contracts/WorkflowViewContracts.ts +3 -0
  35. package/src/application/mapping/WorkflowDefinitionMapper.ts +117 -19
  36. package/src/bootstrap/AppContainerFactory.ts +2 -0
  37. package/src/domain/credentials/CredentialInstanceService.ts +8 -1
  38. package/src/domain/credentials/CredentialOAuth2ScopeResolver.ts +61 -0
  39. package/src/domain/credentials/CredentialServices.ts +1 -0
  40. package/src/domain/credentials/OAuth2ConnectServiceFactory.ts +9 -2
  41. package/src/presentation/http/routeHandlers/CredentialHttpRouteHandler.ts +2 -1
  42. package/src/presentation/http/routeHandlers/WorkflowHttpRouteHandler.ts +4 -2
  43. package/src/presentation/server/CodemationConsumerConfigLoader.ts +28 -5
  44. package/src/presentation/server/CodemationPluginDiscovery.ts +4 -6
  45. package/dist/AppContainerFactory-BRU02PTm.js.map +0 -1
  46. package/dist/CodemationConsumerConfigLoader-C_ISRrpI.js.map +0 -1
  47. package/dist/CredentialServices-xVxVA9Tq.js.map +0 -1
@@ -66,7 +66,8 @@ export class WorkflowHttpRouteHandler {
66
66
 
67
67
  async getWorkflowRuns(_: Request, params: ServerHttpRouteParams): Promise<Response> {
68
68
  try {
69
- return Response.json(await this.queryBus.execute(new ListWorkflowRunsQuery(params.workflowId!)));
69
+ const runs = await this.queryBus.execute(new ListWorkflowRunsQuery(params.workflowId!));
70
+ return Response.json(runs);
70
71
  } catch (error) {
71
72
  return ServerHttpErrorResponseFactory.fromUnknown(error);
72
73
  }
@@ -74,7 +75,8 @@ export class WorkflowHttpRouteHandler {
74
75
 
75
76
  async getWorkflowDebuggerOverlay(_: Request, params: ServerHttpRouteParams): Promise<Response> {
76
77
  try {
77
- return Response.json(await this.queryBus.execute(new GetWorkflowDebuggerOverlayQuery(params.workflowId!)));
78
+ const overlay = await this.queryBus.execute(new GetWorkflowDebuggerOverlayQuery(params.workflowId!));
79
+ return Response.json(overlay);
78
80
  } catch (error) {
79
81
  return ServerHttpErrorResponseFactory.fromUnknown(error);
80
82
  }
@@ -20,6 +20,11 @@ export type CodemationConsumerConfigResolution = Readonly<{
20
20
  workflowSources: ReadonlyArray<string>;
21
21
  }>;
22
22
 
23
+ type ConsumerImportSession = Readonly<{
24
+ shouldResetImporter: boolean;
25
+ resetCacheKeys: Set<string>;
26
+ }>;
27
+
23
28
  export class CodemationConsumerConfigLoader {
24
29
  private static readonly importerRegistrationsByTsconfig = new Map<string, NamespacedUnregister>();
25
30
  private static readonly importerNamespaceVersionByTsconfig = new Map<string, number>();
@@ -38,10 +43,13 @@ export class CodemationConsumerConfigLoader {
38
43
  ): Promise<CodemationConsumerConfigResolution> {
39
44
  const loadStarted = performance.now();
40
45
  let mark = loadStarted;
46
+ const importSession = this.createImportSession();
47
+ const phaseDurations = new Map<string, number>();
41
48
  const phaseMs = (label: string): void => {
42
49
  const now = performance.now();
43
50
  const delta = now - mark;
44
51
  mark = now;
52
+ phaseDurations.set(label, delta);
45
53
  this.performanceDiagnosticsLogger.info(
46
54
  `load.${label} +${delta.toFixed(1)}ms (cumulative ${(now - loadStarted).toFixed(1)}ms)`,
47
55
  );
@@ -53,7 +61,7 @@ export class CodemationConsumerConfigLoader {
53
61
  'Codemation config not found. Expected "codemation.config.ts" in the consumer project root or "src/".',
54
62
  );
55
63
  }
56
- const moduleExports = await this.importModule(bootstrapSource);
64
+ const moduleExports = await this.importModule(bootstrapSource, importSession);
57
65
  phaseMs("importConfigModule");
58
66
  const rawConfig = this.configExportsResolver.resolveConfig(moduleExports);
59
67
  if (!rawConfig) {
@@ -64,7 +72,7 @@ export class CodemationConsumerConfigLoader {
64
72
  phaseMs("resolveWorkflowSources");
65
73
  const workflows = this.mergeWorkflows(
66
74
  config.workflows ?? [],
67
- await this.loadDiscoveredWorkflows(args.consumerRoot, config, workflowSources),
75
+ await this.loadDiscoveredWorkflows(args.consumerRoot, config, workflowSources, importSession),
68
76
  );
69
77
  phaseMs("loadDiscoveredWorkflows");
70
78
  const resolvedConfig: NormalizedCodemationConfig = {
@@ -125,6 +133,7 @@ export class CodemationConsumerConfigLoader {
125
133
  consumerRoot: string,
126
134
  config: CodemationConfig,
127
135
  workflowSources: ReadonlyArray<string>,
136
+ importSession: ConsumerImportSession,
128
137
  ): Promise<ReadonlyArray<WorkflowDefinition>> {
129
138
  const workflowDiscoveryDirectories = config.workflowDiscovery?.directories ?? [];
130
139
  const workflowsById = new Map<string, WorkflowDefinition>();
@@ -136,7 +145,7 @@ export class CodemationConsumerConfigLoader {
136
145
  workflowDiscoveryDirectories,
137
146
  absoluteWorkflowModulePath: workflowSource,
138
147
  }),
139
- moduleExports: await this.importModule(workflowSource),
148
+ moduleExports: await this.importModule(workflowSource, importSession),
140
149
  })),
141
150
  );
142
151
  for (const loadedWorkflowModule of loadedWorkflowModules) {
@@ -168,13 +177,20 @@ export class CodemationConsumerConfigLoader {
168
177
  return [...workflowsById.values()];
169
178
  }
170
179
 
171
- private async importModule(modulePath: string): Promise<Record<string, unknown>> {
180
+ private async importModule(
181
+ modulePath: string,
182
+ importSession: ConsumerImportSession,
183
+ ): Promise<Record<string, unknown>> {
172
184
  if (this.shouldUseNativeRuntimeImport()) {
173
185
  return await this.importModuleWithNativeRuntime(modulePath);
174
186
  }
175
187
  const tsconfigPath = await this.resolveTsconfigPath(modulePath);
176
- if (this.shouldResetImporterBeforeImport()) {
188
+ const cacheKey = tsconfigPath || "default";
189
+ const shouldResetImporter = importSession.shouldResetImporter;
190
+ const didResetImporterForThisImport = shouldResetImporter && !importSession.resetCacheKeys.has(cacheKey);
191
+ if (didResetImporterForThisImport) {
177
192
  await this.resetImporter(tsconfigPath);
193
+ importSession.resetCacheKeys.add(cacheKey);
178
194
  }
179
195
  const importSpecifier = await this.createImportSpecifier(modulePath);
180
196
  for (let attempt = 0; attempt < 3; attempt += 1) {
@@ -278,6 +294,13 @@ export class CodemationConsumerConfigLoader {
278
294
  return (process.env.CODEMATION_DEV_SERVER_TOKEN?.trim().length ?? 0) > 0;
279
295
  }
280
296
 
297
+ private createImportSession(): ConsumerImportSession {
298
+ return {
299
+ resetCacheKeys: new Set<string>(),
300
+ shouldResetImporter: this.shouldResetImporterBeforeImport(),
301
+ };
302
+ }
303
+
281
304
  private isStoppedTransformServiceError(error: unknown): boolean {
282
305
  return error instanceof Error && error.message.includes("The service is no longer running");
283
306
  }
@@ -142,14 +142,12 @@ export class CodemationPluginDiscovery {
142
142
  }
143
143
 
144
144
  private resolvePluginEntry(discoveredPackage: CodemationDiscoveredPluginPackage): string {
145
- if (
145
+ const preferSource =
146
146
  process.env.CODEMATION_PREFER_PLUGIN_SOURCE_ENTRY === "true" &&
147
147
  typeof discoveredPackage.developmentEntry === "string" &&
148
- discoveredPackage.developmentEntry.trim().length > 0
149
- ) {
150
- return discoveredPackage.developmentEntry;
151
- }
152
- return discoveredPackage.pluginEntry;
148
+ discoveredPackage.developmentEntry.trim().length > 0;
149
+ const selectedEntry = preferSource ? discoveredPackage.developmentEntry : discoveredPackage.pluginEntry;
150
+ return selectedEntry;
153
151
  }
154
152
 
155
153
  private async resolveDevelopmentPluginEntry(packageRoot: string): Promise<string | undefined> {