@webiny/project 6.4.4-beta.2 → 6.4.4-beta.4

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 (29) hide show
  1. package/abstractions/features/DestroyApp.d.ts +2 -2
  2. package/abstractions/features/DestroyApp.js.map +1 -1
  3. package/abstractions/services/StackOutputCacheService.d.ts +10 -0
  4. package/abstractions/services/StackOutputCacheService.js +5 -0
  5. package/abstractions/services/StackOutputCacheService.js.map +1 -0
  6. package/abstractions/services/index.d.ts +1 -0
  7. package/abstractions/services/index.js +1 -0
  8. package/createProjectSdkContainer.js +2 -1
  9. package/createProjectSdkContainer.js.map +1 -1
  10. package/decorators/DestroyAppClearStackOutputCache.d.ts +25 -0
  11. package/decorators/DestroyAppClearStackOutputCache.js +29 -0
  12. package/decorators/DestroyAppClearStackOutputCache.js.map +1 -0
  13. package/decorators/index.d.ts +1 -0
  14. package/decorators/index.js +1 -0
  15. package/package.json +11 -11
  16. package/services/GetProjectConfigService/renderConfigWorker.js +8 -2
  17. package/services/GetProjectConfigService/renderConfigWorker.js.map +1 -1
  18. package/services/InitProjectSdkService/InitProjectSdkService.js +2 -1
  19. package/services/InitProjectSdkService/InitProjectSdkService.js.map +1 -1
  20. package/services/PulumiGetStackOutputService/PulumiGetStackOutputService.d.ts +3 -11
  21. package/services/PulumiGetStackOutputService/PulumiGetStackOutputService.js +7 -64
  22. package/services/PulumiGetStackOutputService/PulumiGetStackOutputService.js.map +1 -1
  23. package/services/StackOutputCacheService/StackOutputCacheService.d.ts +18 -0
  24. package/services/StackOutputCacheService/StackOutputCacheService.js +89 -0
  25. package/services/StackOutputCacheService/StackOutputCacheService.js.map +1 -0
  26. package/services/StackOutputCacheService/index.d.ts +1 -0
  27. package/services/StackOutputCacheService/index.js +1 -0
  28. package/services/index.d.ts +1 -0
  29. package/services/index.js +1 -0
@@ -1,10 +1,10 @@
1
1
  import { type AppName } from "../../abstractions/types.js";
2
2
  import { type ExecaChildProcess } from "execa";
3
3
  type IPulumiProcess = ExecaChildProcess<string>;
4
- interface IDestroyAppParams {
4
+ export interface IDestroyAppParams {
5
5
  app: AppName;
6
6
  }
7
- interface IDestroyApp {
7
+ export interface IDestroyApp {
8
8
  execute(params: IDestroyAppParams): Promise<{
9
9
  pulumiProcess: IPulumiProcess;
10
10
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"abstractions/features/DestroyApp.js","sources":["../../../src/abstractions/features/DestroyApp.ts"],"sourcesContent":["import { createAbstraction } from \"~/abstractions/createAbstraction.js\";\nimport { type AppName } from \"~/abstractions/types.js\";\nimport { type ExecaChildProcess } from \"execa\";\n\ntype IPulumiProcess = ExecaChildProcess<string>;\n\ninterface IDestroyAppParams {\n app: AppName;\n}\n\ninterface IDestroyApp {\n execute(params: IDestroyAppParams): Promise<{ pulumiProcess: IPulumiProcess }>;\n}\n\nexport const DestroyApp = createAbstraction<IDestroyApp>(\"DestroyApp\");\n\nexport namespace DestroyApp {\n export type Interface = IDestroyApp;\n\n export type Params = IDestroyAppParams;\n\n export type PulumiProcess = IPulumiProcess;\n}\n"],"names":["DestroyApp","createAbstraction"],"mappings":";AAcO,MAAMA,aAAaC,kBAA+B"}
1
+ {"version":3,"file":"abstractions/features/DestroyApp.js","sources":["../../../src/abstractions/features/DestroyApp.ts"],"sourcesContent":["import { createAbstraction } from \"~/abstractions/createAbstraction.js\";\nimport { type AppName } from \"~/abstractions/types.js\";\nimport { type ExecaChildProcess } from \"execa\";\n\ntype IPulumiProcess = ExecaChildProcess<string>;\n\nexport interface IDestroyAppParams {\n app: AppName;\n}\n\nexport interface IDestroyApp {\n execute(params: IDestroyAppParams): Promise<{ pulumiProcess: IPulumiProcess }>;\n}\n\nexport const DestroyApp = createAbstraction<IDestroyApp>(\"DestroyApp\");\n\nexport namespace DestroyApp {\n export type Interface = IDestroyApp;\n\n export type Params = IDestroyAppParams;\n\n export type PulumiProcess = IPulumiProcess;\n}\n"],"names":["DestroyApp","createAbstraction"],"mappings":";AAcO,MAAMA,aAAaC,kBAA+B"}
@@ -0,0 +1,10 @@
1
+ import { type IAppModel } from "../../abstractions/models/IAppModel.js";
2
+ export interface IStackOutputCacheService {
3
+ read(app: IAppModel): Promise<Record<string, any> | null>;
4
+ write(app: IAppModel, data: Record<string, any>): Promise<void>;
5
+ delete(app: IAppModel): Promise<void>;
6
+ }
7
+ export declare const StackOutputCacheService: import("@webiny/di").Abstraction<IStackOutputCacheService>;
8
+ export declare namespace StackOutputCacheService {
9
+ type Interface = IStackOutputCacheService;
10
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "../createAbstraction.js";
2
+ const StackOutputCacheService = createAbstraction("StackOutputCacheService");
3
+ export { StackOutputCacheService };
4
+
5
+ //# sourceMappingURL=StackOutputCacheService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstractions/services/StackOutputCacheService.js","sources":["../../../src/abstractions/services/StackOutputCacheService.ts"],"sourcesContent":["import { createAbstraction } from \"~/abstractions/createAbstraction.js\";\nimport { type IAppModel } from \"~/abstractions/models/IAppModel.js\";\n\nexport interface IStackOutputCacheService {\n read(app: IAppModel): Promise<Record<string, any> | null>;\n write(app: IAppModel, data: Record<string, any>): Promise<void>;\n delete(app: IAppModel): Promise<void>;\n}\n\nexport const StackOutputCacheService =\n createAbstraction<IStackOutputCacheService>(\"StackOutputCacheService\");\n\nexport namespace StackOutputCacheService {\n export type Interface = IStackOutputCacheService;\n}\n"],"names":["StackOutputCacheService","createAbstraction"],"mappings":";AASO,MAAMA,0BACTC,kBAA4C"}
@@ -29,6 +29,7 @@ export { PulumiGetStackOutputService } from "./PulumiGetStackOutputService.js";
29
29
  export { PulumiLoginService } from "./PulumiLoginService.js";
30
30
  export { PulumiSelectStackService } from "./PulumiSelectStackService.js";
31
31
  export { SetProjectIdService } from "./SetProjectIdService.js";
32
+ export { StackOutputCacheService } from "./StackOutputCacheService.js";
32
33
  export { StdioService } from "./StdioService.js";
33
34
  export { UiService } from "./UiService.js";
34
35
  export { ValidateProjectConfigService } from "./ValidateProjectConfigService.js";
@@ -29,6 +29,7 @@ export { PulumiGetStackOutputService } from "./PulumiGetStackOutputService.js";
29
29
  export { PulumiLoginService } from "./PulumiLoginService.js";
30
30
  export { PulumiSelectStackService } from "./PulumiSelectStackService.js";
31
31
  export { SetProjectIdService } from "./SetProjectIdService.js";
32
+ export { StackOutputCacheService } from "./StackOutputCacheService.js";
32
33
  export { StdioService } from "./StdioService.js";
33
34
  export { UiService } from "./UiService.js";
34
35
  export { ValidateProjectConfigService } from "./ValidateProjectConfigService.js";
@@ -1,6 +1,6 @@
1
1
  import { Container } from "@webiny/di";
2
2
  import { adminAfterBuild, adminAfterDeploy, adminBeforeBuild, adminBeforeDeploy, adminBeforeWatch, afterBuild, afterDeploy, apiAfterBuild, apiAfterDeploy, apiBeforeBuild, apiBeforeDeploy, apiBeforeWatch, beforeBuild, beforeDeploy, beforeWatch, buildApp, coreAfterBuild, coreAfterDeploy, coreBeforeBuild, coreBeforeDeploy, coreBeforeWatch, deployApp, destroyApp, exportStack, getApp, getAppOutput, getAppStackOutput, getFeatureFlags, getLogger, getProductionEnvironments, getProject, getProjectConfig, getProjectInfo, getPulumiResourceNamePrefix, installExtension, isCi, isTelemetryEnabled, isWcpEnabled, isWebinyJsRepo, refreshApp, runPulumiCommand, validateProjectConfig, watch } from "./features/index.js";
3
- import { buildAppWorkspaceService, buildProjectWorkspaceService, getAppPackagesService, getAppService, getCwdService, getIsCiService, getNpmVersionService, getNpxVersionService, getProjectConfigService, getProjectIdService, getProjectInstallationIdService, getProjectService, getProjectVersionService, getPulumiService, getPulumiVersionService, getYarnVersionService, initProjectSdkService, installExtensionService, isRemotePulumiBackendService, listAppLambdaFunctionsService, listDeployedEnvironmentsService, listPackagesInAppWorkspaceService, listPackagesService, loadEnvVarsService, localStorageService, loggerService, projectInfoService, projectSdkParamsService, pulumiExportService, pulumiGetConfigPassphraseService, pulumiGetSecretsProviderService, pulumiGetStackOutputService, pulumiImportService, pulumiLoginService, pulumiSelectStackService, setProjectIdService, stdioService, uiService, validateProjectConfigService, watchedLambdaFunctionsService, wcpService } from "./services/index.js";
3
+ import { buildAppWorkspaceService, buildProjectWorkspaceService, getAppPackagesService, getAppService, getCwdService, getIsCiService, getNpmVersionService, getNpxVersionService, getProjectConfigService, getProjectIdService, getProjectInstallationIdService, getProjectService, getProjectVersionService, getPulumiService, getPulumiVersionService, getYarnVersionService, initProjectSdkService, installExtensionService, isRemotePulumiBackendService, listAppLambdaFunctionsService, listDeployedEnvironmentsService, listPackagesInAppWorkspaceService, listPackagesService, loadEnvVarsService, localStorageService, loggerService, projectInfoService, projectSdkParamsService, pulumiExportService, pulumiGetConfigPassphraseService, pulumiGetSecretsProviderService, pulumiGetStackOutputService, pulumiImportService, pulumiLoginService, pulumiSelectStackService, setProjectIdService, stackOutputCacheService, stdioService, uiService, validateProjectConfigService, watchedLambdaFunctionsService, wcpService } from "./services/index.js";
4
4
  import { BuildProjectWorkspaceService, GetProjectConfig, InitProjectSdkService, LoadEnvVarsService, LoggerService, ProjectSdkParamsService, ValidateProjectConfig } from "./abstractions/index.js";
5
5
  import { getFeatureFlagsWithLicense } from "./decorators/index.js";
6
6
  const createProjectSdkContainer = async (params)=>{
@@ -42,6 +42,7 @@ const createProjectSdkContainer = async (params)=>{
42
42
  container.register(pulumiLoginService).inSingletonScope();
43
43
  container.register(pulumiSelectStackService).inSingletonScope();
44
44
  container.register(setProjectIdService).inSingletonScope();
45
+ container.register(stackOutputCacheService).inSingletonScope();
45
46
  container.register(stdioService).inSingletonScope();
46
47
  container.register(uiService).inSingletonScope();
47
48
  container.register(validateProjectConfigService).inSingletonScope();
@@ -1 +1 @@
1
- {"version":3,"file":"createProjectSdkContainer.js","sources":["../src/createProjectSdkContainer.ts"],"sourcesContent":["import { Container } from \"@webiny/di\";\nimport {\n beforeBuild,\n afterBuild,\n beforeWatch,\n beforeDeploy,\n afterDeploy,\n adminAfterBuild,\n adminAfterDeploy,\n adminBeforeBuild,\n adminBeforeDeploy,\n adminBeforeWatch,\n apiAfterBuild,\n apiAfterDeploy,\n apiBeforeBuild,\n apiBeforeDeploy,\n apiBeforeWatch,\n buildApp,\n coreAfterBuild,\n coreAfterDeploy,\n coreBeforeBuild,\n coreBeforeDeploy,\n coreBeforeWatch,\n deployApp,\n destroyApp,\n exportStack,\n getApp,\n getAppOutput,\n getAppStackOutput,\n getLogger,\n getProductionEnvironments,\n getProject,\n getProjectConfig,\n getProjectInfo,\n getPulumiResourceNamePrefix,\n getFeatureFlags,\n installExtension,\n isCi,\n isTelemetryEnabled,\n isWcpEnabled,\n isWebinyJsRepo,\n refreshApp,\n runPulumiCommand,\n validateProjectConfig,\n watch\n} from \"./features/index.js\";\n\nimport {\n getAppService,\n buildAppWorkspaceService,\n buildProjectWorkspaceService,\n watchedLambdaFunctionsService,\n getAppPackagesService,\n getCwdService,\n getIsCiService,\n getNpmVersionService,\n getNpxVersionService,\n getProjectConfigService,\n getProjectIdService,\n getProjectInstallationIdService,\n getProjectService,\n getProjectVersionService,\n getPulumiService,\n getPulumiVersionService,\n getYarnVersionService,\n initProjectSdkService,\n installExtensionService,\n isRemotePulumiBackendService,\n listAppLambdaFunctionsService,\n listDeployedEnvironmentsService,\n listPackagesInAppWorkspaceService,\n listPackagesService,\n loadEnvVarsService,\n localStorageService,\n loggerService,\n projectInfoService,\n projectSdkParamsService,\n pulumiGetConfigPassphraseService,\n pulumiGetSecretsProviderService,\n pulumiExportService,\n pulumiImportService,\n pulumiGetStackOutputService,\n pulumiLoginService,\n pulumiSelectStackService,\n setProjectIdService,\n stdioService,\n uiService,\n validateProjectConfigService,\n wcpService\n} from \"./services/index.js\";\n\nimport {\n GetProjectConfig,\n BuildProjectWorkspaceService,\n ProjectSdkParamsService,\n LoadEnvVarsService,\n ValidateProjectConfig,\n LoggerService,\n InitProjectSdkService\n} from \"~/abstractions/index.js\";\nimport { getFeatureFlagsWithLicense } from \"./decorators/index.js\";\n\nexport const createProjectSdkContainer = async (\n params: Partial<ProjectSdkParamsService.Params>\n) => {\n const container = new Container();\n\n // Services.\n container.register(getAppService).inSingletonScope();\n container.register(buildAppWorkspaceService).inSingletonScope();\n container.register(buildProjectWorkspaceService).inSingletonScope();\n container.register(watchedLambdaFunctionsService).inSingletonScope();\n container.register(getAppPackagesService).inSingletonScope();\n container.register(getCwdService).inSingletonScope();\n container.register(getIsCiService).inSingletonScope();\n container.register(getNpmVersionService).inSingletonScope();\n container.register(getNpxVersionService).inSingletonScope();\n container.register(getProjectConfigService).inSingletonScope();\n container.register(getProjectIdService).inSingletonScope();\n container.register(getProjectInstallationIdService).inSingletonScope();\n container.register(getProjectService).inSingletonScope();\n container.register(getProjectVersionService).inSingletonScope();\n container.register(getPulumiService).inSingletonScope();\n container.register(getPulumiVersionService).inSingletonScope();\n container.register(getYarnVersionService).inSingletonScope();\n container.register(initProjectSdkService).inSingletonScope();\n container.register(installExtensionService).inSingletonScope();\n container.register(isRemotePulumiBackendService).inSingletonScope();\n container.register(listAppLambdaFunctionsService).inSingletonScope();\n container.register(listDeployedEnvironmentsService).inSingletonScope();\n container.register(listPackagesInAppWorkspaceService).inSingletonScope();\n container.register(listPackagesService).inSingletonScope();\n container.register(loadEnvVarsService).inSingletonScope();\n container.register(localStorageService).inSingletonScope();\n container.register(loggerService).inSingletonScope();\n container.register(projectInfoService).inSingletonScope();\n container.register(projectSdkParamsService).inSingletonScope();\n container.register(pulumiGetConfigPassphraseService).inSingletonScope();\n container.register(pulumiGetSecretsProviderService).inSingletonScope();\n container.register(pulumiExportService).inSingletonScope();\n container.register(pulumiImportService).inSingletonScope();\n container.register(pulumiGetStackOutputService).inSingletonScope();\n container.register(pulumiLoginService).inSingletonScope();\n container.register(pulumiSelectStackService).inSingletonScope();\n container.register(setProjectIdService).inSingletonScope();\n container.register(stdioService).inSingletonScope();\n container.register(uiService).inSingletonScope();\n container.register(validateProjectConfigService).inSingletonScope();\n container.register(wcpService).inSingletonScope();\n\n // Features.\n container.register(buildApp).inSingletonScope();\n container.register(deployApp).inSingletonScope();\n container.register(destroyApp).inSingletonScope();\n container.register(exportStack).inSingletonScope();\n container.register(getApp).inSingletonScope();\n container.register(getAppOutput).inSingletonScope();\n container.register(getAppStackOutput).inSingletonScope();\n container.register(getLogger).inSingletonScope();\n container.register(getProductionEnvironments).inSingletonScope();\n container.register(getProject).inSingletonScope();\n container.register(getProjectConfig).inSingletonScope();\n container.register(getProjectInfo).inSingletonScope();\n container.register(getPulumiResourceNamePrefix).inSingletonScope();\n container.register(installExtension).inSingletonScope();\n container.register(isCi).inSingletonScope();\n container.register(isTelemetryEnabled).inSingletonScope();\n container.register(isWcpEnabled).inSingletonScope();\n container.register(isWebinyJsRepo).inSingletonScope();\n container.register(refreshApp).inSingletonScope();\n container.register(runPulumiCommand).inSingletonScope();\n container.register(getFeatureFlags).inSingletonScope();\n container.register(validateProjectConfig).inSingletonScope();\n container.register(watch).inSingletonScope();\n container.registerDecorator(getFeatureFlagsWithLicense);\n\n // Hooks.\n container.registerComposite(beforeBuild);\n container.registerComposite(afterBuild);\n container.registerComposite(beforeWatch);\n container.registerComposite(beforeDeploy);\n container.registerComposite(afterDeploy);\n container.registerComposite(apiBeforeBuild);\n container.registerComposite(apiBeforeDeploy);\n container.registerComposite(apiBeforeWatch);\n container.registerComposite(apiAfterBuild);\n container.registerComposite(apiAfterDeploy);\n container.registerComposite(adminBeforeBuild);\n container.registerComposite(adminBeforeDeploy);\n container.registerComposite(adminBeforeWatch);\n container.registerComposite(adminAfterBuild);\n container.registerComposite(adminAfterDeploy);\n container.registerComposite(coreBeforeBuild);\n container.registerComposite(coreBeforeDeploy);\n container.registerComposite(coreBeforeWatch);\n container.registerComposite(coreAfterBuild);\n container.registerComposite(coreAfterDeploy);\n\n // Initialize project SDK.\n container.resolve(ProjectSdkParamsService).set(params);\n await container.resolve(LoadEnvVarsService).execute();\n await container.resolve(BuildProjectWorkspaceService).execute();\n\n const logger = container.resolve(LoggerService);\n logger.log(\"Initializing Project SDK container...\");\n\n const projectExtensions = await container.resolve(GetProjectConfig).execute({\n tags: { runtimeContext: \"project\" }\n });\n\n await container.resolve(ValidateProjectConfig).execute(projectExtensions);\n\n // Initialize project SDK extensions (env vars, hooks, pulumi, implementations, decorators).\n await container.resolve(InitProjectSdkService).execute(container);\n\n return container;\n};\n"],"names":["createProjectSdkContainer","params","container","Container","getAppService","buildAppWorkspaceService","buildProjectWorkspaceService","watchedLambdaFunctionsService","getAppPackagesService","getCwdService","getIsCiService","getNpmVersionService","getNpxVersionService","getProjectConfigService","getProjectIdService","getProjectInstallationIdService","getProjectService","getProjectVersionService","getPulumiService","getPulumiVersionService","getYarnVersionService","initProjectSdkService","installExtensionService","isRemotePulumiBackendService","listAppLambdaFunctionsService","listDeployedEnvironmentsService","listPackagesInAppWorkspaceService","listPackagesService","loadEnvVarsService","localStorageService","loggerService","projectInfoService","projectSdkParamsService","pulumiGetConfigPassphraseService","pulumiGetSecretsProviderService","pulumiExportService","pulumiImportService","pulumiGetStackOutputService","pulumiLoginService","pulumiSelectStackService","setProjectIdService","stdioService","uiService","validateProjectConfigService","wcpService","buildApp","deployApp","destroyApp","exportStack","getApp","getAppOutput","getAppStackOutput","getLogger","getProductionEnvironments","getProject","getProjectConfig","getProjectInfo","getPulumiResourceNamePrefix","installExtension","isCi","isTelemetryEnabled","isWcpEnabled","isWebinyJsRepo","refreshApp","runPulumiCommand","getFeatureFlags","validateProjectConfig","watch","getFeatureFlagsWithLicense","beforeBuild","afterBuild","beforeWatch","beforeDeploy","afterDeploy","apiBeforeBuild","apiBeforeDeploy","apiBeforeWatch","apiAfterBuild","apiAfterDeploy","adminBeforeBuild","adminBeforeDeploy","adminBeforeWatch","adminAfterBuild","adminAfterDeploy","coreBeforeBuild","coreBeforeDeploy","coreBeforeWatch","coreAfterBuild","coreAfterDeploy","ProjectSdkParamsService","LoadEnvVarsService","BuildProjectWorkspaceService","logger","LoggerService","projectExtensions","GetProjectConfig","ValidateProjectConfig","InitProjectSdkService"],"mappings":"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"}
1
+ {"version":3,"file":"createProjectSdkContainer.js","sources":["../src/createProjectSdkContainer.ts"],"sourcesContent":["import { Container } from \"@webiny/di\";\nimport {\n beforeBuild,\n afterBuild,\n beforeWatch,\n beforeDeploy,\n afterDeploy,\n adminAfterBuild,\n adminAfterDeploy,\n adminBeforeBuild,\n adminBeforeDeploy,\n adminBeforeWatch,\n apiAfterBuild,\n apiAfterDeploy,\n apiBeforeBuild,\n apiBeforeDeploy,\n apiBeforeWatch,\n buildApp,\n coreAfterBuild,\n coreAfterDeploy,\n coreBeforeBuild,\n coreBeforeDeploy,\n coreBeforeWatch,\n deployApp,\n destroyApp,\n exportStack,\n getApp,\n getAppOutput,\n getAppStackOutput,\n getLogger,\n getProductionEnvironments,\n getProject,\n getProjectConfig,\n getProjectInfo,\n getPulumiResourceNamePrefix,\n getFeatureFlags,\n installExtension,\n isCi,\n isTelemetryEnabled,\n isWcpEnabled,\n isWebinyJsRepo,\n refreshApp,\n runPulumiCommand,\n validateProjectConfig,\n watch\n} from \"./features/index.js\";\n\nimport {\n getAppService,\n buildAppWorkspaceService,\n buildProjectWorkspaceService,\n watchedLambdaFunctionsService,\n getAppPackagesService,\n getCwdService,\n getIsCiService,\n getNpmVersionService,\n getNpxVersionService,\n getProjectConfigService,\n getProjectIdService,\n getProjectInstallationIdService,\n getProjectService,\n getProjectVersionService,\n getPulumiService,\n getPulumiVersionService,\n getYarnVersionService,\n initProjectSdkService,\n installExtensionService,\n isRemotePulumiBackendService,\n listAppLambdaFunctionsService,\n listDeployedEnvironmentsService,\n listPackagesInAppWorkspaceService,\n listPackagesService,\n loadEnvVarsService,\n localStorageService,\n loggerService,\n projectInfoService,\n projectSdkParamsService,\n pulumiGetConfigPassphraseService,\n pulumiGetSecretsProviderService,\n pulumiExportService,\n pulumiImportService,\n pulumiGetStackOutputService,\n pulumiLoginService,\n pulumiSelectStackService,\n setProjectIdService,\n stackOutputCacheService,\n stdioService,\n uiService,\n validateProjectConfigService,\n wcpService\n} from \"./services/index.js\";\n\nimport {\n GetProjectConfig,\n BuildProjectWorkspaceService,\n ProjectSdkParamsService,\n LoadEnvVarsService,\n ValidateProjectConfig,\n LoggerService,\n InitProjectSdkService\n} from \"~/abstractions/index.js\";\nimport { getFeatureFlagsWithLicense } from \"./decorators/index.js\";\n\nexport const createProjectSdkContainer = async (\n params: Partial<ProjectSdkParamsService.Params>\n) => {\n const container = new Container();\n\n // Services.\n container.register(getAppService).inSingletonScope();\n container.register(buildAppWorkspaceService).inSingletonScope();\n container.register(buildProjectWorkspaceService).inSingletonScope();\n container.register(watchedLambdaFunctionsService).inSingletonScope();\n container.register(getAppPackagesService).inSingletonScope();\n container.register(getCwdService).inSingletonScope();\n container.register(getIsCiService).inSingletonScope();\n container.register(getNpmVersionService).inSingletonScope();\n container.register(getNpxVersionService).inSingletonScope();\n container.register(getProjectConfigService).inSingletonScope();\n container.register(getProjectIdService).inSingletonScope();\n container.register(getProjectInstallationIdService).inSingletonScope();\n container.register(getProjectService).inSingletonScope();\n container.register(getProjectVersionService).inSingletonScope();\n container.register(getPulumiService).inSingletonScope();\n container.register(getPulumiVersionService).inSingletonScope();\n container.register(getYarnVersionService).inSingletonScope();\n container.register(initProjectSdkService).inSingletonScope();\n container.register(installExtensionService).inSingletonScope();\n container.register(isRemotePulumiBackendService).inSingletonScope();\n container.register(listAppLambdaFunctionsService).inSingletonScope();\n container.register(listDeployedEnvironmentsService).inSingletonScope();\n container.register(listPackagesInAppWorkspaceService).inSingletonScope();\n container.register(listPackagesService).inSingletonScope();\n container.register(loadEnvVarsService).inSingletonScope();\n container.register(localStorageService).inSingletonScope();\n container.register(loggerService).inSingletonScope();\n container.register(projectInfoService).inSingletonScope();\n container.register(projectSdkParamsService).inSingletonScope();\n container.register(pulumiGetConfigPassphraseService).inSingletonScope();\n container.register(pulumiGetSecretsProviderService).inSingletonScope();\n container.register(pulumiExportService).inSingletonScope();\n container.register(pulumiImportService).inSingletonScope();\n container.register(pulumiGetStackOutputService).inSingletonScope();\n container.register(pulumiLoginService).inSingletonScope();\n container.register(pulumiSelectStackService).inSingletonScope();\n container.register(setProjectIdService).inSingletonScope();\n container.register(stackOutputCacheService).inSingletonScope();\n container.register(stdioService).inSingletonScope();\n container.register(uiService).inSingletonScope();\n container.register(validateProjectConfigService).inSingletonScope();\n container.register(wcpService).inSingletonScope();\n\n // Features.\n container.register(buildApp).inSingletonScope();\n container.register(deployApp).inSingletonScope();\n container.register(destroyApp).inSingletonScope();\n container.register(exportStack).inSingletonScope();\n container.register(getApp).inSingletonScope();\n container.register(getAppOutput).inSingletonScope();\n container.register(getAppStackOutput).inSingletonScope();\n container.register(getLogger).inSingletonScope();\n container.register(getProductionEnvironments).inSingletonScope();\n container.register(getProject).inSingletonScope();\n container.register(getProjectConfig).inSingletonScope();\n container.register(getProjectInfo).inSingletonScope();\n container.register(getPulumiResourceNamePrefix).inSingletonScope();\n container.register(installExtension).inSingletonScope();\n container.register(isCi).inSingletonScope();\n container.register(isTelemetryEnabled).inSingletonScope();\n container.register(isWcpEnabled).inSingletonScope();\n container.register(isWebinyJsRepo).inSingletonScope();\n container.register(refreshApp).inSingletonScope();\n container.register(runPulumiCommand).inSingletonScope();\n container.register(getFeatureFlags).inSingletonScope();\n container.register(validateProjectConfig).inSingletonScope();\n container.register(watch).inSingletonScope();\n container.registerDecorator(getFeatureFlagsWithLicense);\n\n // Hooks.\n container.registerComposite(beforeBuild);\n container.registerComposite(afterBuild);\n container.registerComposite(beforeWatch);\n container.registerComposite(beforeDeploy);\n container.registerComposite(afterDeploy);\n container.registerComposite(apiBeforeBuild);\n container.registerComposite(apiBeforeDeploy);\n container.registerComposite(apiBeforeWatch);\n container.registerComposite(apiAfterBuild);\n container.registerComposite(apiAfterDeploy);\n container.registerComposite(adminBeforeBuild);\n container.registerComposite(adminBeforeDeploy);\n container.registerComposite(adminBeforeWatch);\n container.registerComposite(adminAfterBuild);\n container.registerComposite(adminAfterDeploy);\n container.registerComposite(coreBeforeBuild);\n container.registerComposite(coreBeforeDeploy);\n container.registerComposite(coreBeforeWatch);\n container.registerComposite(coreAfterBuild);\n container.registerComposite(coreAfterDeploy);\n\n // Initialize project SDK.\n container.resolve(ProjectSdkParamsService).set(params);\n await container.resolve(LoadEnvVarsService).execute();\n await container.resolve(BuildProjectWorkspaceService).execute();\n\n const logger = container.resolve(LoggerService);\n logger.log(\"Initializing Project SDK container...\");\n\n const projectExtensions = await container.resolve(GetProjectConfig).execute({\n tags: { runtimeContext: \"project\" }\n });\n\n await container.resolve(ValidateProjectConfig).execute(projectExtensions);\n\n // Initialize project SDK extensions (env vars, hooks, pulumi, implementations, decorators).\n await container.resolve(InitProjectSdkService).execute(container);\n\n return container;\n};\n"],"names":["createProjectSdkContainer","params","container","Container","getAppService","buildAppWorkspaceService","buildProjectWorkspaceService","watchedLambdaFunctionsService","getAppPackagesService","getCwdService","getIsCiService","getNpmVersionService","getNpxVersionService","getProjectConfigService","getProjectIdService","getProjectInstallationIdService","getProjectService","getProjectVersionService","getPulumiService","getPulumiVersionService","getYarnVersionService","initProjectSdkService","installExtensionService","isRemotePulumiBackendService","listAppLambdaFunctionsService","listDeployedEnvironmentsService","listPackagesInAppWorkspaceService","listPackagesService","loadEnvVarsService","localStorageService","loggerService","projectInfoService","projectSdkParamsService","pulumiGetConfigPassphraseService","pulumiGetSecretsProviderService","pulumiExportService","pulumiImportService","pulumiGetStackOutputService","pulumiLoginService","pulumiSelectStackService","setProjectIdService","stackOutputCacheService","stdioService","uiService","validateProjectConfigService","wcpService","buildApp","deployApp","destroyApp","exportStack","getApp","getAppOutput","getAppStackOutput","getLogger","getProductionEnvironments","getProject","getProjectConfig","getProjectInfo","getPulumiResourceNamePrefix","installExtension","isCi","isTelemetryEnabled","isWcpEnabled","isWebinyJsRepo","refreshApp","runPulumiCommand","getFeatureFlags","validateProjectConfig","watch","getFeatureFlagsWithLicense","beforeBuild","afterBuild","beforeWatch","beforeDeploy","afterDeploy","apiBeforeBuild","apiBeforeDeploy","apiBeforeWatch","apiAfterBuild","apiAfterDeploy","adminBeforeBuild","adminBeforeDeploy","adminBeforeWatch","adminAfterBuild","adminAfterDeploy","coreBeforeBuild","coreBeforeDeploy","coreBeforeWatch","coreAfterBuild","coreAfterDeploy","ProjectSdkParamsService","LoadEnvVarsService","BuildProjectWorkspaceService","logger","LoggerService","projectExtensions","GetProjectConfig","ValidateProjectConfig","InitProjectSdkService"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { DestroyApp, GetApp, LoggerService, StackOutputCacheService } from "../abstractions/index.js";
2
+ /**
3
+ * Decorator that clears the stack output cache when an app is destroyed.
4
+ *
5
+ * Without this, the cache file written during deploy would remain on disk after a
6
+ * destroy, and a subsequent deploy (or any stack output read) would use it and behave
7
+ * as if the stack were still deployed.
8
+ *
9
+ * The cache is cleared before the destroy runs. Since the cache is only a performance
10
+ * optimization, this is safe even if the destroy fails and the stack remains: the next
11
+ * read simply fetches fresh output from Pulumi again.
12
+ */
13
+ export declare class DestroyAppClearStackOutputCache implements DestroyApp.Interface {
14
+ private getApp;
15
+ private logger;
16
+ private stackOutputCacheService;
17
+ private decoratee;
18
+ constructor(getApp: GetApp.Interface, logger: LoggerService.Interface, stackOutputCacheService: StackOutputCacheService.Interface, decoratee: DestroyApp.Interface);
19
+ execute(params: DestroyApp.Params): Promise<{
20
+ pulumiProcess: import("child_process").ChildProcess & import("execa").ExecaChildPromise<string> & Promise<import("execa").ExecaReturnValue<string>>;
21
+ }>;
22
+ }
23
+ export declare const destroyAppClearStackOutputCache: typeof DestroyAppClearStackOutputCache & {
24
+ __abstraction: import("@webiny/di").Abstraction<import("../abstractions/features/DestroyApp").IDestroyApp>;
25
+ };
@@ -0,0 +1,29 @@
1
+ import { DestroyApp, GetApp, LoggerService, StackOutputCacheService } from "../abstractions/index.js";
2
+ class DestroyAppClearStackOutputCache {
3
+ constructor(getApp, logger, stackOutputCacheService, decoratee){
4
+ this.getApp = getApp;
5
+ this.logger = logger;
6
+ this.stackOutputCacheService = stackOutputCacheService;
7
+ this.decoratee = decoratee;
8
+ }
9
+ async execute(params) {
10
+ try {
11
+ const app = this.getApp.execute(params.app);
12
+ await this.stackOutputCacheService.delete(app);
13
+ } catch (error) {
14
+ this.logger.error("Failed to clear stack output cache before destroy.", error);
15
+ }
16
+ return this.decoratee.execute(params);
17
+ }
18
+ }
19
+ const destroyAppClearStackOutputCache = DestroyApp.createDecorator({
20
+ decorator: DestroyAppClearStackOutputCache,
21
+ dependencies: [
22
+ GetApp,
23
+ LoggerService,
24
+ StackOutputCacheService
25
+ ]
26
+ });
27
+ export { DestroyAppClearStackOutputCache, destroyAppClearStackOutputCache };
28
+
29
+ //# sourceMappingURL=DestroyAppClearStackOutputCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators/DestroyAppClearStackOutputCache.js","sources":["../../src/decorators/DestroyAppClearStackOutputCache.ts"],"sourcesContent":["import {\n DestroyApp,\n GetApp,\n LoggerService,\n StackOutputCacheService\n} from \"~/abstractions/index.js\";\n\n/**\n * Decorator that clears the stack output cache when an app is destroyed.\n *\n * Without this, the cache file written during deploy would remain on disk after a\n * destroy, and a subsequent deploy (or any stack output read) would use it and behave\n * as if the stack were still deployed.\n *\n * The cache is cleared before the destroy runs. Since the cache is only a performance\n * optimization, this is safe even if the destroy fails and the stack remains: the next\n * read simply fetches fresh output from Pulumi again.\n */\nexport class DestroyAppClearStackOutputCache implements DestroyApp.Interface {\n constructor(\n private getApp: GetApp.Interface,\n private logger: LoggerService.Interface,\n private stackOutputCacheService: StackOutputCacheService.Interface,\n private decoratee: DestroyApp.Interface\n ) {}\n\n async execute(params: DestroyApp.Params) {\n try {\n const app = this.getApp.execute(params.app);\n await this.stackOutputCacheService.delete(app);\n } catch (error) {\n // Cache clearing failure shouldn't prevent the destroy from running.\n this.logger.error(\"Failed to clear stack output cache before destroy.\", error);\n }\n\n return this.decoratee.execute(params);\n }\n}\n\nexport const destroyAppClearStackOutputCache = DestroyApp.createDecorator({\n decorator: DestroyAppClearStackOutputCache,\n dependencies: [GetApp, LoggerService, StackOutputCacheService]\n});\n"],"names":["DestroyAppClearStackOutputCache","getApp","logger","stackOutputCacheService","decoratee","params","app","error","destroyAppClearStackOutputCache","DestroyApp","GetApp","LoggerService","StackOutputCacheService"],"mappings":";AAkBO,MAAMA;IACT,YACYC,MAAwB,EACxBC,MAA+B,EAC/BC,uBAA0D,EAC1DC,SAA+B,CACzC;aAJUH,MAAM,GAANA;aACAC,MAAM,GAANA;aACAC,uBAAuB,GAAvBA;aACAC,SAAS,GAATA;IACT;IAEH,MAAM,QAAQC,MAAyB,EAAE;QACrC,IAAI;YACA,MAAMC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAACD,OAAO,GAAG;YAC1C,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAACC;QAC9C,EAAE,OAAOC,OAAO;YAEZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sDAAsDA;QAC5E;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAACF;IAClC;AACJ;AAEO,MAAMG,kCAAkCC,WAAW,eAAe,CAAC;IACtE,WAAWT;IACX,cAAc;QAACU;QAAQC;QAAeC;KAAwB;AAClE"}
@@ -3,6 +3,7 @@ export * from "./DeployAppClearWatchedLambdaFunctions.js";
3
3
  export * from "./DeployAppRefreshStackOutputCache.js";
4
4
  export * from "./DeployAppWithHooks.js";
5
5
  export * from "./DeployAppWithWatchedLambdaReplacement.js";
6
+ export * from "./DestroyAppClearStackOutputCache.js";
6
7
  export * from "./WatchWithHooks.js";
7
8
  export * from "./GetPulumiServiceWithDownloadInfo.js";
8
9
  export * from "./GetFeatureFlagsWithLicense.js";
@@ -3,6 +3,7 @@ export * from "./DeployAppClearWatchedLambdaFunctions.js";
3
3
  export * from "./DeployAppRefreshStackOutputCache.js";
4
4
  export * from "./DeployAppWithHooks.js";
5
5
  export * from "./DeployAppWithWatchedLambdaReplacement.js";
6
+ export * from "./DestroyAppClearStackOutputCache.js";
6
7
  export * from "./WatchWithHooks.js";
7
8
  export * from "./GetPulumiServiceWithDownloadInfo.js";
8
9
  export * from "./GetFeatureFlagsWithLicense.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/project",
3
- "version": "6.4.4-beta.2",
3
+ "version": "6.4.4-beta.4",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -13,17 +13,17 @@
13
13
  "description": "An SDK for managing Webiny projects.",
14
14
  "license": "MIT",
15
15
  "dependencies": {
16
- "@webiny/aws-sdk": "6.4.4-beta.2",
17
- "@webiny/build-tools": "6.4.4-beta.2",
16
+ "@webiny/aws-sdk": "6.4.4-beta.4",
17
+ "@webiny/build-tools": "6.4.4-beta.4",
18
18
  "@webiny/di": "1.0.1",
19
- "@webiny/feature-flags": "6.4.4-beta.2",
20
- "@webiny/global-config": "6.4.4-beta.2",
21
- "@webiny/pulumi-sdk": "6.4.4-beta.2",
22
- "@webiny/react-properties": "6.4.4-beta.2",
23
- "@webiny/system-requirements": "6.4.4-beta.2",
24
- "@webiny/telemetry": "6.4.4-beta.2",
25
- "@webiny/utils": "6.4.4-beta.2",
26
- "@webiny/wcp": "6.4.4-beta.2",
19
+ "@webiny/feature-flags": "6.4.4-beta.4",
20
+ "@webiny/global-config": "6.4.4-beta.4",
21
+ "@webiny/pulumi-sdk": "6.4.4-beta.4",
22
+ "@webiny/react-properties": "6.4.4-beta.4",
23
+ "@webiny/system-requirements": "6.4.4-beta.4",
24
+ "@webiny/telemetry": "6.4.4-beta.4",
25
+ "@webiny/utils": "6.4.4-beta.4",
26
+ "@webiny/wcp": "6.4.4-beta.4",
27
27
  "chalk": "5.6.2",
28
28
  "chokidar": "5.0.0",
29
29
  "ci-info": "4.4.0",
@@ -1,5 +1,5 @@
1
1
  import "tsx/esm";
2
- import { Properties, toObject } from "@webiny/react-properties";
2
+ import { AsyncProperties, toObject } from "@webiny/react-properties";
3
3
  import debounce from "debounce";
4
4
  import react from "react";
5
5
  import { createRoot } from "react-dom/client";
@@ -41,7 +41,13 @@ process.on("unhandledRejection", (reason)=>{
41
41
  const { project: projectModelDto } = JSON.parse(process.argv[2]);
42
42
  const project = ProjectModel.fromDto(projectModelDto);
43
43
  const { Extensions: Extensions } = await import(toImportSpecifier(project.paths.webinyConfigBaseFile.toString()));
44
+ const RENDER_TIMEOUT_MS = 30000;
45
+ const timeout = setTimeout(()=>{
46
+ sendError(new Error(`Config rendering timed out after ${RENDER_TIMEOUT_MS}ms. This usually means an <Await> promise never settled.`));
47
+ process.exit(1);
48
+ }, RENDER_TIMEOUT_MS);
44
49
  const onChange = debounce((value)=>{
50
+ clearTimeout(timeout);
45
51
  sendSuccess(toObject(value));
46
52
  process.exit(0);
47
53
  });
@@ -50,7 +56,7 @@ __webpack_require__.g.window = renderConfigWorker_window;
50
56
  __webpack_require__.g.document = renderConfigWorker_window.document;
51
57
  const root = renderConfigWorker_window.document.getElementById("root");
52
58
  const reactRoot = createRoot(root);
53
- reactRoot.render(/*#__PURE__*/ react.createElement(WcpProjectLicenseProvider, null, /*#__PURE__*/ react.createElement(EnvProvider, null, /*#__PURE__*/ react.createElement(ProductionEnvironmentsCollector, null, /*#__PURE__*/ react.createElement(Properties, {
59
+ reactRoot.render(/*#__PURE__*/ react.createElement(WcpProjectLicenseProvider, null, /*#__PURE__*/ react.createElement(EnvProvider, null, /*#__PURE__*/ react.createElement(ProductionEnvironmentsCollector, null, /*#__PURE__*/ react.createElement(AsyncProperties, {
54
60
  onChange: onChange
55
61
  }, /*#__PURE__*/ react.createElement(Extensions, null))))));
56
62
 
@@ -1 +1 @@
1
- {"version":3,"file":"services/GetProjectConfigService/renderConfigWorker.js","sources":["../../../src/services/GetProjectConfigService/renderConfigWorker.tsx"],"sourcesContent":["import \"tsx/esm\";\nimport { Properties, toObject } from \"@webiny/react-properties\";\nimport debounce from \"debounce\";\nimport React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { JSDOM } from \"jsdom\";\nimport { serializeError } from \"serialize-error\";\nimport type { RenderConfigParamsDto, RenderConfigWorkerMessageDto } from \"./renderConfig.js\";\nimport { ProjectModel } from \"~/models/ProjectModel.js\";\nimport { toImportSpecifier } from \"~/utils/index.js\";\nimport { EnvProvider } from \"./EnvContext.js\";\nimport { WcpProjectLicenseProvider } from \"./WcpProjectLicenseContext.js\";\nimport { ProductionEnvironmentsCollector } from \"./ProductionEnvironmentsContext.js\";\n\nconst sendError = (err: Error) => {\n const message: RenderConfigWorkerMessageDto = {\n type: \"error\",\n error: serializeError(err),\n data: null\n };\n\n if (process.send) {\n process.send!(message);\n } else {\n console.error(message);\n }\n};\n\nconst sendSuccess = (data: Record<string, any> = {}) => {\n const message: RenderConfigWorkerMessageDto = {\n type: \"success\",\n error: null,\n data\n };\n\n if (process.send) {\n process.send!(message);\n } else {\n console.log(message);\n }\n};\n\nprocess.on(\"uncaughtException\", err => {\n sendError(err);\n process.exit(1);\n});\n\nprocess.on(\"unhandledRejection\", reason => {\n const err = reason instanceof Error ? reason : new Error(String(reason));\n sendError(err);\n process.exit(1);\n});\n\nconst { project: projectModelDto } = JSON.parse(process.argv[2]) as RenderConfigParamsDto;\nconst project = ProjectModel.fromDto(projectModelDto);\n\nconst { Extensions } = await import(\n toImportSpecifier(project.paths.webinyConfigBaseFile.toString())\n);\n\nconst onChange = debounce((value: any) => {\n sendSuccess(toObject(value));\n process.exit(0);\n});\n\nconst { window } = new JSDOM(`<div id=\"root\"/>`);\n\n(global as any).window = window;\n\n(global as any).document = window.document;\n\nconst root = window.document.getElementById(\"root\")!;\n\nconst reactRoot = createRoot(root);\n\nreactRoot.render(\n <WcpProjectLicenseProvider>\n <EnvProvider>\n <ProductionEnvironmentsCollector>\n <Properties onChange={onChange}>\n <Extensions />\n </Properties>\n </ProductionEnvironmentsCollector>\n </EnvProvider>\n </WcpProjectLicenseProvider>\n);\n"],"names":["sendError","err","message","serializeError","process","console","sendSuccess","data","reason","Error","String","projectModelDto","JSON","project","ProjectModel","Extensions","toImportSpecifier","onChange","debounce","value","toObject","window","JSDOM","global","root","reactRoot","createRoot","WcpProjectLicenseProvider","EnvProvider","ProductionEnvironmentsCollector","Properties"],"mappings":";;;;;;;;;;;;;AAcA,MAAMA,YAAY,CAACC;IACf,MAAMC,UAAwC;QAC1C,MAAM;QACN,OAAOC,eAAeF;QACtB,MAAM;IACV;IAEA,IAAIG,QAAQ,IAAI,EACZA,QAAQ,IAAI,CAAEF;SAEdG,QAAQ,KAAK,CAACH;AAEtB;AAEA,MAAMI,cAAc,CAACC,OAA4B,CAAC,CAAC;IAC/C,MAAML,UAAwC;QAC1C,MAAM;QACN,OAAO;QACPK;IACJ;IAEA,IAAIH,QAAQ,IAAI,EACZA,QAAQ,IAAI,CAAEF;SAEdG,QAAQ,GAAG,CAACH;AAEpB;AAEAE,QAAQ,EAAE,CAAC,qBAAqBH,CAAAA;IAC5BD,UAAUC;IACVG,QAAQ,IAAI,CAAC;AACjB;AAEAA,QAAQ,EAAE,CAAC,sBAAsBI,CAAAA;IAC7B,MAAMP,MAAMO,kBAAkBC,QAAQD,SAAS,IAAIC,MAAMC,OAAOF;IAChER,UAAUC;IACVG,QAAQ,IAAI,CAAC;AACjB;AAEA,MAAM,EAAE,SAASO,eAAe,EAAE,GAAGC,KAAK,KAAK,CAACR,QAAQ,IAAI,CAAC,EAAE;AAC/D,MAAMS,UAAUC,aAAa,OAAO,CAACH;AAErC,MAAM,EAAEI,YAAAA,UAAU,EAAE,GAAG,MAAM,MAAM,CAC/BC,kBAAkBH,QAAQ,KAAK,CAAC,oBAAoB,CAAC,QAAQ;AAGjE,MAAMI,WAAWC,SAAS,CAACC;IACvBb,YAAYc,SAASD;IACrBf,QAAQ,IAAI,CAAC;AACjB;AAEA,MAAM,EAAEiB,QAAAA,yBAAM,EAAE,GAAG,IAAIC,MAAM;AAE5BC,oBAAAA,CAAMA,CAAS,MAAM,GAAGF;AAExBE,oBAAAA,CAAMA,CAAS,QAAQ,GAAGF,0BAAO,QAAQ;AAE1C,MAAMG,OAAOH,0BAAO,QAAQ,CAAC,cAAc,CAAC;AAE5C,MAAMI,YAAYC,WAAWF;AAE7BC,UAAU,MAAM,CAAC,WAAD,GACZ,oBAACE,2BAAyBA,MAAAA,WAAAA,GACtB,oBAACC,aAAWA,MAAAA,WAAAA,GACR,oBAACC,iCAA+BA,MAAAA,WAAAA,GAC5B,oBAACC,YAAUA;IAAC,UAAUb;iBAClB,oBAACF,YAAUA"}
1
+ {"version":3,"file":"services/GetProjectConfigService/renderConfigWorker.js","sources":["../../../src/services/GetProjectConfigService/renderConfigWorker.tsx"],"sourcesContent":["import \"tsx/esm\";\nimport { AsyncProperties, toObject } from \"@webiny/react-properties\";\nimport debounce from \"debounce\";\nimport React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { JSDOM } from \"jsdom\";\nimport { serializeError } from \"serialize-error\";\nimport type { RenderConfigParamsDto, RenderConfigWorkerMessageDto } from \"./renderConfig.js\";\nimport { ProjectModel } from \"~/models/ProjectModel.js\";\nimport { toImportSpecifier } from \"~/utils/index.js\";\nimport { EnvProvider } from \"./EnvContext.js\";\nimport { WcpProjectLicenseProvider } from \"./WcpProjectLicenseContext.js\";\nimport { ProductionEnvironmentsCollector } from \"./ProductionEnvironmentsContext.js\";\n\nconst sendError = (err: Error) => {\n const message: RenderConfigWorkerMessageDto = {\n type: \"error\",\n error: serializeError(err),\n data: null\n };\n\n if (process.send) {\n process.send!(message);\n } else {\n console.error(message);\n }\n};\n\nconst sendSuccess = (data: Record<string, any> = {}) => {\n const message: RenderConfigWorkerMessageDto = {\n type: \"success\",\n error: null,\n data\n };\n\n if (process.send) {\n process.send!(message);\n } else {\n console.log(message);\n }\n};\n\nprocess.on(\"uncaughtException\", err => {\n sendError(err);\n process.exit(1);\n});\n\nprocess.on(\"unhandledRejection\", reason => {\n const err = reason instanceof Error ? reason : new Error(String(reason));\n sendError(err);\n process.exit(1);\n});\n\nconst { project: projectModelDto } = JSON.parse(process.argv[2]) as RenderConfigParamsDto;\nconst project = ProjectModel.fromDto(projectModelDto);\n\nconst { Extensions } = await import(\n toImportSpecifier(project.paths.webinyConfigBaseFile.toString())\n);\n\nconst RENDER_TIMEOUT_MS = 30_000;\n\nconst timeout = setTimeout(() => {\n sendError(\n new Error(\n `Config rendering timed out after ${RENDER_TIMEOUT_MS}ms. ` +\n `This usually means an <Await> promise never settled.`\n )\n );\n process.exit(1);\n}, RENDER_TIMEOUT_MS);\n\nconst onChange = debounce((value: any) => {\n clearTimeout(timeout);\n sendSuccess(toObject(value));\n process.exit(0);\n});\n\nconst { window } = new JSDOM(`<div id=\"root\"/>`);\n\n(global as any).window = window;\n\n(global as any).document = window.document;\n\nconst root = window.document.getElementById(\"root\")!;\n\nconst reactRoot = createRoot(root);\n\nreactRoot.render(\n <WcpProjectLicenseProvider>\n <EnvProvider>\n <ProductionEnvironmentsCollector>\n <AsyncProperties onChange={onChange}>\n <Extensions />\n </AsyncProperties>\n </ProductionEnvironmentsCollector>\n </EnvProvider>\n </WcpProjectLicenseProvider>\n);\n"],"names":["sendError","err","message","serializeError","process","console","sendSuccess","data","reason","Error","String","projectModelDto","JSON","project","ProjectModel","Extensions","toImportSpecifier","RENDER_TIMEOUT_MS","timeout","setTimeout","onChange","debounce","value","clearTimeout","toObject","window","JSDOM","global","root","reactRoot","createRoot","WcpProjectLicenseProvider","EnvProvider","ProductionEnvironmentsCollector","AsyncProperties"],"mappings":";;;;;;;;;;;;;AAcA,MAAMA,YAAY,CAACC;IACf,MAAMC,UAAwC;QAC1C,MAAM;QACN,OAAOC,eAAeF;QACtB,MAAM;IACV;IAEA,IAAIG,QAAQ,IAAI,EACZA,QAAQ,IAAI,CAAEF;SAEdG,QAAQ,KAAK,CAACH;AAEtB;AAEA,MAAMI,cAAc,CAACC,OAA4B,CAAC,CAAC;IAC/C,MAAML,UAAwC;QAC1C,MAAM;QACN,OAAO;QACPK;IACJ;IAEA,IAAIH,QAAQ,IAAI,EACZA,QAAQ,IAAI,CAAEF;SAEdG,QAAQ,GAAG,CAACH;AAEpB;AAEAE,QAAQ,EAAE,CAAC,qBAAqBH,CAAAA;IAC5BD,UAAUC;IACVG,QAAQ,IAAI,CAAC;AACjB;AAEAA,QAAQ,EAAE,CAAC,sBAAsBI,CAAAA;IAC7B,MAAMP,MAAMO,kBAAkBC,QAAQD,SAAS,IAAIC,MAAMC,OAAOF;IAChER,UAAUC;IACVG,QAAQ,IAAI,CAAC;AACjB;AAEA,MAAM,EAAE,SAASO,eAAe,EAAE,GAAGC,KAAK,KAAK,CAACR,QAAQ,IAAI,CAAC,EAAE;AAC/D,MAAMS,UAAUC,aAAa,OAAO,CAACH;AAErC,MAAM,EAAEI,YAAAA,UAAU,EAAE,GAAG,MAAM,MAAM,CAC/BC,kBAAkBH,QAAQ,KAAK,CAAC,oBAAoB,CAAC,QAAQ;AAGjE,MAAMI,oBAAoB;AAE1B,MAAMC,UAAUC,WAAW;IACvBnB,UACI,IAAIS,MACA,CAAC,iCAAiC,EAAEQ,kBAAkB,wDAAI,CAAC;IAInEb,QAAQ,IAAI,CAAC;AACjB,GAAGa;AAEH,MAAMG,WAAWC,SAAS,CAACC;IACvBC,aAAaL;IACbZ,YAAYkB,SAASF;IACrBlB,QAAQ,IAAI,CAAC;AACjB;AAEA,MAAM,EAAEqB,QAAAA,yBAAM,EAAE,GAAG,IAAIC,MAAM;AAE5BC,oBAAAA,CAAMA,CAAS,MAAM,GAAGF;AAExBE,oBAAAA,CAAMA,CAAS,QAAQ,GAAGF,0BAAO,QAAQ;AAE1C,MAAMG,OAAOH,0BAAO,QAAQ,CAAC,cAAc,CAAC;AAE5C,MAAMI,YAAYC,WAAWF;AAE7BC,UAAU,MAAM,CAAC,WAAD,GACZ,oBAACE,2BAAyBA,MAAAA,WAAAA,GACtB,oBAACC,aAAWA,MAAAA,WAAAA,GACR,oBAACC,iCAA+BA,MAAAA,WAAAA,GAC5B,oBAACC,iBAAeA;IAAC,UAAUd;iBACvB,oBAACL,YAAUA"}
@@ -1,6 +1,6 @@
1
1
  import { createImplementation } from "@webiny/di";
2
2
  import { GetProjectConfig, GetProjectService, InitProjectSdkService } from "../../abstractions/index.js";
3
- import { buildAppWithHooks, deployAppClearWatchedLambdaFunctions, deployAppRefreshStackOutputCache, deployAppWithHooks, deployAppWithWatchedLambdaReplacement, getPulumiServiceWithDownloadInfo, watchWithHooks } from "../../decorators/index.js";
3
+ import { buildAppWithHooks, deployAppClearWatchedLambdaFunctions, deployAppRefreshStackOutputCache, deployAppWithHooks, deployAppWithWatchedLambdaReplacement, destroyAppClearStackOutputCache, getPulumiServiceWithDownloadInfo, watchWithHooks } from "../../decorators/index.js";
4
4
  import { applyEnvVars } from "./applyEnvVars.js";
5
5
  import { applyWcpEnvVars } from "./applyWcpEnvVars.js";
6
6
  import { registerHooks } from "./registerHooks.js";
@@ -27,6 +27,7 @@ class DefaultInitProjectSdkService {
27
27
  container.registerDecorator(deployAppWithWatchedLambdaReplacement);
28
28
  container.registerDecorator(deployAppClearWatchedLambdaFunctions);
29
29
  container.registerDecorator(deployAppRefreshStackOutputCache);
30
+ container.registerDecorator(destroyAppClearStackOutputCache);
30
31
  container.registerDecorator(deployAppWithHooks);
31
32
  container.registerDecorator(watchWithHooks);
32
33
  container.registerDecorator(getPulumiServiceWithDownloadInfo);
@@ -1 +1 @@
1
- {"version":3,"file":"services/InitProjectSdkService/InitProjectSdkService.js","sources":["../../../src/services/InitProjectSdkService/InitProjectSdkService.ts"],"sourcesContent":["import { createImplementation, Container } from \"@webiny/di\";\nimport {\n GetProjectService,\n GetProjectConfig,\n InitProjectSdkService\n} from \"~/abstractions/index.js\";\nimport {\n buildAppWithHooks,\n deployAppClearWatchedLambdaFunctions,\n deployAppRefreshStackOutputCache,\n deployAppWithHooks,\n deployAppWithWatchedLambdaReplacement,\n watchWithHooks,\n getPulumiServiceWithDownloadInfo\n} from \"~/decorators/index.js\";\nimport { applyEnvVars } from \"./applyEnvVars.js\";\nimport { applyWcpEnvVars } from \"./applyWcpEnvVars.js\";\nimport { registerHooks } from \"./registerHooks.js\";\nimport { registerPulumiExtensions } from \"./registerPulumiExtensions.js\";\nimport { registerImplementations } from \"./registerImplementations.js\";\nimport { registerDecorators } from \"./registerDecorators.js\";\n\nexport class DefaultInitProjectSdkService implements InitProjectSdkService.Interface {\n constructor(\n private getProjectService: GetProjectService.Interface,\n private getProjectConfig: GetProjectConfig.Interface\n ) {}\n\n async execute(container: Container) {\n const project = this.getProjectService.execute();\n const projectExtensions = await this.getProjectConfig.execute({\n tags: { runtimeContext: \"project\" }\n });\n\n // Apply environment variables from extensions.\n applyEnvVars(projectExtensions);\n\n // Set WCP environment variables if project ID exists.\n await applyWcpEnvVars(container);\n\n // Register hooks from extensions.\n await registerHooks(container, projectExtensions, project);\n\n // Register Pulumi extensions.\n await registerPulumiExtensions(container, projectExtensions, project);\n\n // Decorators that must be applied last on top of potentially custom ones.\n container.registerDecorator(buildAppWithHooks);\n container.registerDecorator(deployAppWithWatchedLambdaReplacement);\n container.registerDecorator(deployAppClearWatchedLambdaFunctions);\n container.registerDecorator(deployAppRefreshStackOutputCache);\n container.registerDecorator(deployAppWithHooks);\n container.registerDecorator(watchWithHooks);\n container.registerDecorator(getPulumiServiceWithDownloadInfo);\n\n // Register custom implementations first (they replace existing implementations).\n await registerImplementations(container, projectExtensions, project);\n\n // Register decorators after implementations (they enhance existing implementations).\n await registerDecorators(container, projectExtensions, project);\n }\n}\n\nexport const initProjectSdkService = createImplementation({\n abstraction: InitProjectSdkService,\n implementation: DefaultInitProjectSdkService,\n dependencies: [GetProjectService, GetProjectConfig]\n});\n"],"names":["DefaultInitProjectSdkService","getProjectService","getProjectConfig","container","project","projectExtensions","applyEnvVars","applyWcpEnvVars","registerHooks","registerPulumiExtensions","buildAppWithHooks","deployAppWithWatchedLambdaReplacement","deployAppClearWatchedLambdaFunctions","deployAppRefreshStackOutputCache","deployAppWithHooks","watchWithHooks","getPulumiServiceWithDownloadInfo","registerImplementations","registerDecorators","initProjectSdkService","createImplementation","InitProjectSdkService","GetProjectService","GetProjectConfig"],"mappings":";;;;;;;;;AAsBO,MAAMA;IACT,YACYC,iBAA8C,EAC9CC,gBAA4C,CACtD;aAFUD,iBAAiB,GAAjBA;aACAC,gBAAgB,GAAhBA;IACT;IAEH,MAAM,QAAQC,SAAoB,EAAE;QAChC,MAAMC,UAAU,IAAI,CAAC,iBAAiB,CAAC,OAAO;QAC9C,MAAMC,oBAAoB,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAC1D,MAAM;gBAAE,gBAAgB;YAAU;QACtC;QAGAC,aAAaD;QAGb,MAAME,gBAAgBJ;QAGtB,MAAMK,cAAcL,WAAWE,mBAAmBD;QAGlD,MAAMK,yBAAyBN,WAAWE,mBAAmBD;QAG7DD,UAAU,iBAAiB,CAACO;QAC5BP,UAAU,iBAAiB,CAACQ;QAC5BR,UAAU,iBAAiB,CAACS;QAC5BT,UAAU,iBAAiB,CAACU;QAC5BV,UAAU,iBAAiB,CAACW;QAC5BX,UAAU,iBAAiB,CAACY;QAC5BZ,UAAU,iBAAiB,CAACa;QAG5B,MAAMC,wBAAwBd,WAAWE,mBAAmBD;QAG5D,MAAMc,mBAAmBf,WAAWE,mBAAmBD;IAC3D;AACJ;AAEO,MAAMe,wBAAwBC,qBAAqB;IACtD,aAAaC;IACb,gBAAgBrB;IAChB,cAAc;QAACsB;QAAmBC;KAAiB;AACvD"}
1
+ {"version":3,"file":"services/InitProjectSdkService/InitProjectSdkService.js","sources":["../../../src/services/InitProjectSdkService/InitProjectSdkService.ts"],"sourcesContent":["import { createImplementation, Container } from \"@webiny/di\";\nimport {\n GetProjectService,\n GetProjectConfig,\n InitProjectSdkService\n} from \"~/abstractions/index.js\";\nimport {\n buildAppWithHooks,\n deployAppClearWatchedLambdaFunctions,\n deployAppRefreshStackOutputCache,\n deployAppWithHooks,\n deployAppWithWatchedLambdaReplacement,\n destroyAppClearStackOutputCache,\n watchWithHooks,\n getPulumiServiceWithDownloadInfo\n} from \"~/decorators/index.js\";\nimport { applyEnvVars } from \"./applyEnvVars.js\";\nimport { applyWcpEnvVars } from \"./applyWcpEnvVars.js\";\nimport { registerHooks } from \"./registerHooks.js\";\nimport { registerPulumiExtensions } from \"./registerPulumiExtensions.js\";\nimport { registerImplementations } from \"./registerImplementations.js\";\nimport { registerDecorators } from \"./registerDecorators.js\";\n\nexport class DefaultInitProjectSdkService implements InitProjectSdkService.Interface {\n constructor(\n private getProjectService: GetProjectService.Interface,\n private getProjectConfig: GetProjectConfig.Interface\n ) {}\n\n async execute(container: Container) {\n const project = this.getProjectService.execute();\n const projectExtensions = await this.getProjectConfig.execute({\n tags: { runtimeContext: \"project\" }\n });\n\n // Apply environment variables from extensions.\n applyEnvVars(projectExtensions);\n\n // Set WCP environment variables if project ID exists.\n await applyWcpEnvVars(container);\n\n // Register hooks from extensions.\n await registerHooks(container, projectExtensions, project);\n\n // Register Pulumi extensions.\n await registerPulumiExtensions(container, projectExtensions, project);\n\n // Decorators that must be applied last on top of potentially custom ones.\n container.registerDecorator(buildAppWithHooks);\n container.registerDecorator(deployAppWithWatchedLambdaReplacement);\n container.registerDecorator(deployAppClearWatchedLambdaFunctions);\n container.registerDecorator(deployAppRefreshStackOutputCache);\n container.registerDecorator(destroyAppClearStackOutputCache);\n container.registerDecorator(deployAppWithHooks);\n container.registerDecorator(watchWithHooks);\n container.registerDecorator(getPulumiServiceWithDownloadInfo);\n\n // Register custom implementations first (they replace existing implementations).\n await registerImplementations(container, projectExtensions, project);\n\n // Register decorators after implementations (they enhance existing implementations).\n await registerDecorators(container, projectExtensions, project);\n }\n}\n\nexport const initProjectSdkService = createImplementation({\n abstraction: InitProjectSdkService,\n implementation: DefaultInitProjectSdkService,\n dependencies: [GetProjectService, GetProjectConfig]\n});\n"],"names":["DefaultInitProjectSdkService","getProjectService","getProjectConfig","container","project","projectExtensions","applyEnvVars","applyWcpEnvVars","registerHooks","registerPulumiExtensions","buildAppWithHooks","deployAppWithWatchedLambdaReplacement","deployAppClearWatchedLambdaFunctions","deployAppRefreshStackOutputCache","destroyAppClearStackOutputCache","deployAppWithHooks","watchWithHooks","getPulumiServiceWithDownloadInfo","registerImplementations","registerDecorators","initProjectSdkService","createImplementation","InitProjectSdkService","GetProjectService","GetProjectConfig"],"mappings":";;;;;;;;;AAuBO,MAAMA;IACT,YACYC,iBAA8C,EAC9CC,gBAA4C,CACtD;aAFUD,iBAAiB,GAAjBA;aACAC,gBAAgB,GAAhBA;IACT;IAEH,MAAM,QAAQC,SAAoB,EAAE;QAChC,MAAMC,UAAU,IAAI,CAAC,iBAAiB,CAAC,OAAO;QAC9C,MAAMC,oBAAoB,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAC1D,MAAM;gBAAE,gBAAgB;YAAU;QACtC;QAGAC,aAAaD;QAGb,MAAME,gBAAgBJ;QAGtB,MAAMK,cAAcL,WAAWE,mBAAmBD;QAGlD,MAAMK,yBAAyBN,WAAWE,mBAAmBD;QAG7DD,UAAU,iBAAiB,CAACO;QAC5BP,UAAU,iBAAiB,CAACQ;QAC5BR,UAAU,iBAAiB,CAACS;QAC5BT,UAAU,iBAAiB,CAACU;QAC5BV,UAAU,iBAAiB,CAACW;QAC5BX,UAAU,iBAAiB,CAACY;QAC5BZ,UAAU,iBAAiB,CAACa;QAC5Bb,UAAU,iBAAiB,CAACc;QAG5B,MAAMC,wBAAwBf,WAAWE,mBAAmBD;QAG5D,MAAMe,mBAAmBhB,WAAWE,mBAAmBD;IAC3D;AACJ;AAEO,MAAMgB,wBAAwBC,qBAAqB;IACtD,aAAaC;IACb,gBAAgBtB;IAChB,cAAc;QAACuB;QAAmBC;KAAiB;AACvD"}
@@ -1,20 +1,12 @@
1
- import { GetPulumiService, GetProjectService, LoggerService, PulumiGetStackOutputService, PulumiSelectStackService, ProjectSdkParamsService } from "../../abstractions/index.js";
1
+ import { GetPulumiService, LoggerService, PulumiGetStackOutputService, PulumiSelectStackService, StackOutputCacheService } from "../../abstractions/index.js";
2
2
  import { type AppModel } from "../../models/index.js";
3
3
  export declare class DefaultPulumiGetStackOutputService implements PulumiGetStackOutputService.Interface {
4
4
  private getPulumiService;
5
5
  private pulumiSelectStackService;
6
6
  private loggerService;
7
- private getProjectService;
8
- private projectSdkParamsService;
9
- private static readonly DEFAULT_ENV;
10
- private static readonly DEFAULT_REGION;
11
- private static readonly DEFAULT_VARIANT;
12
- constructor(getPulumiService: GetPulumiService.Interface, pulumiSelectStackService: PulumiSelectStackService.Interface, loggerService: LoggerService.Interface, getProjectService: GetProjectService.Interface, projectSdkParamsService: ProjectSdkParamsService.Interface);
7
+ private stackOutputCacheService;
8
+ constructor(getPulumiService: GetPulumiService.Interface, pulumiSelectStackService: PulumiSelectStackService.Interface, loggerService: LoggerService.Interface, stackOutputCacheService: StackOutputCacheService.Interface);
13
9
  execute<TOutput extends Record<string, any> = Record<string, any>>(app: AppModel, params?: PulumiGetStackOutputService.Params): Promise<TOutput | null>;
14
10
  private applyMapping;
15
- private getCacheKey;
16
- private getCachePath;
17
- private readFromCache;
18
- private writeToCache;
19
11
  }
20
12
  export declare const pulumiGetStackOutputService: import("@webiny/di").Implementation<typeof DefaultPulumiGetStackOutputService>;
@@ -1,36 +1,18 @@
1
1
  import { createImplementation } from "@webiny/di";
2
- import { GetProjectService, GetPulumiService, LoggerService, ProjectSdkParamsService, PulumiGetStackOutputService, PulumiSelectStackService } from "../../abstractions/index.js";
2
+ import { GetPulumiService, LoggerService, PulumiGetStackOutputService, PulumiSelectStackService, StackOutputCacheService } from "../../abstractions/index.js";
3
3
  import { createEnvConfiguration, withPulumiConfigPassphrase } from "../../utils/env/index.js";
4
4
  import { mapStackOutput } from "./mapStackOutput.js";
5
- import promises from "fs/promises";
6
- import path from "path";
7
5
  class DefaultPulumiGetStackOutputService {
8
- static{
9
- this.DEFAULT_ENV = "dev";
10
- }
11
- static{
12
- this.DEFAULT_REGION = "default";
13
- }
14
- static{
15
- this.DEFAULT_VARIANT = "default";
16
- }
17
- constructor(getPulumiService, pulumiSelectStackService, loggerService, getProjectService, projectSdkParamsService){
6
+ constructor(getPulumiService, pulumiSelectStackService, loggerService, stackOutputCacheService){
18
7
  this.getPulumiService = getPulumiService;
19
8
  this.pulumiSelectStackService = pulumiSelectStackService;
20
9
  this.loggerService = loggerService;
21
- this.getProjectService = getProjectService;
22
- this.projectSdkParamsService = projectSdkParamsService;
10
+ this.stackOutputCacheService = stackOutputCacheService;
23
11
  }
24
12
  async execute(app, params) {
25
13
  if (!params?.skipCache) {
26
- const cachedOutput = await this.readFromCache(app);
27
- if (null !== cachedOutput) {
28
- this.loggerService.debug({
29
- app: app.name,
30
- cacheKey: this.getCacheKey(app)
31
- }, "Stack output read from cache");
32
- return this.applyMapping(cachedOutput, params?.map);
33
- }
14
+ const cachedOutput = await this.stackOutputCacheService.read(app);
15
+ if (null !== cachedOutput) return this.applyMapping(cachedOutput, params?.map);
34
16
  }
35
17
  const pulumi = await this.getPulumiService.execute({
36
18
  app
@@ -55,11 +37,7 @@ class DefaultPulumiGetStackOutputService {
55
37
  try {
56
38
  const stackOutputJson = JSON.parse(stackOutputString.stdout);
57
39
  if (!stackOutputJson) return null;
58
- await this.writeToCache(app, stackOutputJson);
59
- this.loggerService.debug("Stack output stored to cache", {
60
- app: app.name,
61
- cacheKey: this.getCacheKey(app)
62
- });
40
+ await this.stackOutputCacheService.write(app, stackOutputJson);
63
41
  return this.applyMapping(stackOutputJson, params?.map);
64
42
  } catch {
65
43
  this.loggerService.error("Could not parse stack output as JSON.", stackOutputString.stdout, app, params);
@@ -70,40 +48,6 @@ class DefaultPulumiGetStackOutputService {
70
48
  if (!map) return data;
71
49
  return mapStackOutput(data, map);
72
50
  }
73
- getCacheKey(app) {
74
- const sdkParams = this.projectSdkParamsService.get();
75
- const env = sdkParams.env || DefaultPulumiGetStackOutputService.DEFAULT_ENV;
76
- const region = sdkParams.region || DefaultPulumiGetStackOutputService.DEFAULT_REGION;
77
- const variant = sdkParams.variant || DefaultPulumiGetStackOutputService.DEFAULT_VARIANT;
78
- return `${app.name}-${env}-${region}-${variant}.json`;
79
- }
80
- getCachePath(app) {
81
- const project = this.getProjectService.execute();
82
- const cacheDir = project.paths.dotWebinyFolder.join("caches", "stack-output").toString();
83
- const cacheKey = this.getCacheKey(app);
84
- return path.join(cacheDir, cacheKey);
85
- }
86
- async readFromCache(app) {
87
- const cachePath = this.getCachePath(app);
88
- try {
89
- const content = await promises.readFile(cachePath, "utf-8");
90
- return JSON.parse(content);
91
- } catch {
92
- return null;
93
- }
94
- }
95
- async writeToCache(app, data) {
96
- const cachePath = this.getCachePath(app);
97
- const cacheDir = path.dirname(cachePath);
98
- try {
99
- await promises.mkdir(cacheDir, {
100
- recursive: true
101
- });
102
- await promises.writeFile(cachePath, JSON.stringify(data, null, 2), "utf-8");
103
- } catch (error) {
104
- this.loggerService.error("Could not write to cache file.", cachePath, error);
105
- }
106
- }
107
51
  }
108
52
  const pulumiGetStackOutputService = createImplementation({
109
53
  abstraction: PulumiGetStackOutputService,
@@ -112,8 +56,7 @@ const pulumiGetStackOutputService = createImplementation({
112
56
  GetPulumiService,
113
57
  PulumiSelectStackService,
114
58
  LoggerService,
115
- GetProjectService,
116
- ProjectSdkParamsService
59
+ StackOutputCacheService
117
60
  ]
118
61
  });
119
62
  export { DefaultPulumiGetStackOutputService, pulumiGetStackOutputService };
@@ -1 +1 @@
1
- {"version":3,"file":"services/PulumiGetStackOutputService/PulumiGetStackOutputService.js","sources":["../../../src/services/PulumiGetStackOutputService/PulumiGetStackOutputService.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/di\";\nimport {\n GetPulumiService,\n GetProjectService,\n LoggerService,\n PulumiGetStackOutputService,\n PulumiSelectStackService,\n ProjectSdkParamsService\n} from \"~/abstractions/index.js\";\nimport { type AppModel } from \"~/models/index.js\";\nimport { createEnvConfiguration, withPulumiConfigPassphrase } from \"~/utils/env/index.js\";\nimport { mapStackOutput } from \"./mapStackOutput.js\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\n\nexport class DefaultPulumiGetStackOutputService implements PulumiGetStackOutputService.Interface {\n private static readonly DEFAULT_ENV = \"dev\";\n private static readonly DEFAULT_REGION = \"default\";\n private static readonly DEFAULT_VARIANT = \"default\";\n\n constructor(\n private getPulumiService: GetPulumiService.Interface,\n private pulumiSelectStackService: PulumiSelectStackService.Interface,\n private loggerService: LoggerService.Interface,\n private getProjectService: GetProjectService.Interface,\n private projectSdkParamsService: ProjectSdkParamsService.Interface\n ) {}\n\n async execute<TOutput extends Record<string, any> = Record<string, any>>(\n app: AppModel,\n params?: PulumiGetStackOutputService.Params\n ): Promise<TOutput | null> {\n // Try to read from cache if skipCache is not true\n if (!params?.skipCache) {\n const cachedOutput = await this.readFromCache(app);\n if (cachedOutput !== null) {\n this.loggerService.debug(\n { app: app.name, cacheKey: this.getCacheKey(app) },\n \"Stack output read from cache\"\n );\n return this.applyMapping(cachedOutput, params?.map) as TOutput;\n }\n }\n\n const pulumi = await this.getPulumiService.execute({ app });\n\n await this.pulumiSelectStackService.execute(app);\n\n const stackOutputString = await pulumi.run({\n command: [\"stack\", \"output\"],\n args: {\n json: true\n },\n execa: {\n env: createEnvConfiguration({\n configurations: [withPulumiConfigPassphrase()]\n })\n }\n });\n\n try {\n const stackOutputJson = JSON.parse(stackOutputString.stdout);\n if (!stackOutputJson) {\n return null;\n }\n\n // Write to cache\n await this.writeToCache(app, stackOutputJson);\n this.loggerService.debug(\"Stack output stored to cache\", {\n app: app.name,\n cacheKey: this.getCacheKey(app)\n });\n\n return this.applyMapping(stackOutputJson, params?.map) as TOutput;\n } catch {\n this.loggerService.error(\n \"Could not parse stack output as JSON.\",\n stackOutputString.stdout,\n app,\n params\n );\n return null;\n }\n }\n\n private applyMapping(\n data: Record<string, any>,\n map?: Record<string, any>\n ): Record<string, any> {\n if (!map) {\n return data;\n }\n // If a mapping is provided, we map the output to the specified structure.\n return mapStackOutput(data, map);\n }\n\n private getCacheKey(app: AppModel): string {\n const sdkParams = this.projectSdkParamsService.get();\n const env = sdkParams.env || DefaultPulumiGetStackOutputService.DEFAULT_ENV;\n const region = sdkParams.region || DefaultPulumiGetStackOutputService.DEFAULT_REGION;\n const variant = sdkParams.variant || DefaultPulumiGetStackOutputService.DEFAULT_VARIANT;\n return `${app.name}-${env}-${region}-${variant}.json`;\n }\n\n private getCachePath(app: AppModel): string {\n const project = this.getProjectService.execute();\n const cacheDir = project.paths.dotWebinyFolder.join(\"caches\", \"stack-output\").toString();\n const cacheKey = this.getCacheKey(app);\n return path.join(cacheDir, cacheKey);\n }\n\n private async readFromCache(app: AppModel): Promise<Record<string, any> | null> {\n const cachePath = this.getCachePath(app);\n\n try {\n const content = await fs.readFile(cachePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n // File doesn't exist or couldn't be read/parsed - this is expected on first run\n return null;\n }\n }\n\n private async writeToCache(app: AppModel, data: Record<string, any>): Promise<void> {\n const cachePath = this.getCachePath(app);\n const cacheDir = path.dirname(cachePath);\n\n try {\n // Create cache directory if it doesn't exist\n await fs.mkdir(cacheDir, { recursive: true });\n await fs.writeFile(cachePath, JSON.stringify(data, null, 2), \"utf-8\");\n } catch (error) {\n this.loggerService.error(\"Could not write to cache file.\", cachePath, error);\n }\n }\n}\n\nexport const pulumiGetStackOutputService = createImplementation({\n abstraction: PulumiGetStackOutputService,\n implementation: DefaultPulumiGetStackOutputService,\n dependencies: [\n GetPulumiService,\n PulumiSelectStackService,\n LoggerService,\n GetProjectService,\n ProjectSdkParamsService\n ]\n});\n"],"names":["DefaultPulumiGetStackOutputService","getPulumiService","pulumiSelectStackService","loggerService","getProjectService","projectSdkParamsService","app","params","cachedOutput","pulumi","stackOutputString","createEnvConfiguration","withPulumiConfigPassphrase","stackOutputJson","JSON","data","map","mapStackOutput","sdkParams","env","region","variant","project","cacheDir","cacheKey","path","cachePath","content","fs","error","pulumiGetStackOutputService","createImplementation","PulumiGetStackOutputService","GetPulumiService","PulumiSelectStackService","LoggerService","GetProjectService","ProjectSdkParamsService"],"mappings":"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"}
1
+ {"version":3,"file":"services/PulumiGetStackOutputService/PulumiGetStackOutputService.js","sources":["../../../src/services/PulumiGetStackOutputService/PulumiGetStackOutputService.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/di\";\nimport {\n GetPulumiService,\n LoggerService,\n PulumiGetStackOutputService,\n PulumiSelectStackService,\n StackOutputCacheService\n} from \"~/abstractions/index.js\";\nimport { type AppModel } from \"~/models/index.js\";\nimport { createEnvConfiguration, withPulumiConfigPassphrase } from \"~/utils/env/index.js\";\nimport { mapStackOutput } from \"./mapStackOutput.js\";\n\nexport class DefaultPulumiGetStackOutputService implements PulumiGetStackOutputService.Interface {\n constructor(\n private getPulumiService: GetPulumiService.Interface,\n private pulumiSelectStackService: PulumiSelectStackService.Interface,\n private loggerService: LoggerService.Interface,\n private stackOutputCacheService: StackOutputCacheService.Interface\n ) {}\n\n async execute<TOutput extends Record<string, any> = Record<string, any>>(\n app: AppModel,\n params?: PulumiGetStackOutputService.Params\n ): Promise<TOutput | null> {\n // Try to read from cache if skipCache is not true\n if (!params?.skipCache) {\n const cachedOutput = await this.stackOutputCacheService.read(app);\n if (cachedOutput !== null) {\n return this.applyMapping(cachedOutput, params?.map) as TOutput;\n }\n }\n\n const pulumi = await this.getPulumiService.execute({ app });\n\n await this.pulumiSelectStackService.execute(app);\n\n const stackOutputString = await pulumi.run({\n command: [\"stack\", \"output\"],\n args: {\n json: true\n },\n execa: {\n env: createEnvConfiguration({\n configurations: [withPulumiConfigPassphrase()]\n })\n }\n });\n\n try {\n const stackOutputJson = JSON.parse(stackOutputString.stdout);\n if (!stackOutputJson) {\n return null;\n }\n\n await this.stackOutputCacheService.write(app, stackOutputJson);\n\n return this.applyMapping(stackOutputJson, params?.map) as TOutput;\n } catch {\n this.loggerService.error(\n \"Could not parse stack output as JSON.\",\n stackOutputString.stdout,\n app,\n params\n );\n return null;\n }\n }\n\n private applyMapping(\n data: Record<string, any>,\n map?: Record<string, any>\n ): Record<string, any> {\n if (!map) {\n return data;\n }\n // If a mapping is provided, we map the output to the specified structure.\n return mapStackOutput(data, map);\n }\n}\n\nexport const pulumiGetStackOutputService = createImplementation({\n abstraction: PulumiGetStackOutputService,\n implementation: DefaultPulumiGetStackOutputService,\n dependencies: [\n GetPulumiService,\n PulumiSelectStackService,\n LoggerService,\n StackOutputCacheService\n ]\n});\n"],"names":["DefaultPulumiGetStackOutputService","getPulumiService","pulumiSelectStackService","loggerService","stackOutputCacheService","app","params","cachedOutput","pulumi","stackOutputString","createEnvConfiguration","withPulumiConfigPassphrase","stackOutputJson","JSON","data","map","mapStackOutput","pulumiGetStackOutputService","createImplementation","PulumiGetStackOutputService","GetPulumiService","PulumiSelectStackService","LoggerService","StackOutputCacheService"],"mappings":";;;;AAYO,MAAMA;IACT,YACYC,gBAA4C,EAC5CC,wBAA4D,EAC5DC,aAAsC,EACtCC,uBAA0D,CACpE;aAJUH,gBAAgB,GAAhBA;aACAC,wBAAwB,GAAxBA;aACAC,aAAa,GAAbA;aACAC,uBAAuB,GAAvBA;IACT;IAEH,MAAM,QACFC,GAAa,EACbC,MAA2C,EACpB;QAEvB,IAAI,CAACA,QAAQ,WAAW;YACpB,MAAMC,eAAe,MAAM,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAACF;YAC7D,IAAIE,AAAiB,SAAjBA,cACA,OAAO,IAAI,CAAC,YAAY,CAACA,cAAcD,QAAQ;QAEvD;QAEA,MAAME,SAAS,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAAEH;QAAI;QAEzD,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAACA;QAE5C,MAAMI,oBAAoB,MAAMD,OAAO,GAAG,CAAC;YACvC,SAAS;gBAAC;gBAAS;aAAS;YAC5B,MAAM;gBACF,MAAM;YACV;YACA,OAAO;gBACH,KAAKE,uBAAuB;oBACxB,gBAAgB;wBAACC;qBAA6B;gBAClD;YACJ;QACJ;QAEA,IAAI;YACA,MAAMC,kBAAkBC,KAAK,KAAK,CAACJ,kBAAkB,MAAM;YAC3D,IAAI,CAACG,iBACD,OAAO;YAGX,MAAM,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAACP,KAAKO;YAE9C,OAAO,IAAI,CAAC,YAAY,CAACA,iBAAiBN,QAAQ;QACtD,EAAE,OAAM;YACJ,IAAI,CAAC,aAAa,CAAC,KAAK,CACpB,yCACAG,kBAAkB,MAAM,EACxBJ,KACAC;YAEJ,OAAO;QACX;IACJ;IAEQ,aACJQ,IAAyB,EACzBC,GAAyB,EACN;QACnB,IAAI,CAACA,KACD,OAAOD;QAGX,OAAOE,eAAeF,MAAMC;IAChC;AACJ;AAEO,MAAME,8BAA8BC,qBAAqB;IAC5D,aAAaC;IACb,gBAAgBnB;IAChB,cAAc;QACVoB;QACAC;QACAC;QACAC;KACH;AACL"}
@@ -0,0 +1,18 @@
1
+ import { GetProjectService, LoggerService, ProjectSdkParamsService, StackOutputCacheService } from "../../abstractions/index.js";
2
+ import { type AppModel } from "../../models/index.js";
3
+ export declare class DefaultStackOutputCacheService implements StackOutputCacheService.Interface {
4
+ private getProjectService;
5
+ private projectSdkParamsService;
6
+ private loggerService;
7
+ private static readonly DEFAULT_ENV;
8
+ private static readonly DEFAULT_REGION;
9
+ private static readonly DEFAULT_VARIANT;
10
+ constructor(getProjectService: GetProjectService.Interface, projectSdkParamsService: ProjectSdkParamsService.Interface, loggerService: LoggerService.Interface);
11
+ read(app: AppModel): Promise<Record<string, any> | null>;
12
+ write(app: AppModel, data: Record<string, any>): Promise<void>;
13
+ delete(app: AppModel): Promise<void>;
14
+ private getCacheKey;
15
+ private getCacheDir;
16
+ private getCachePath;
17
+ }
18
+ export declare const stackOutputCacheService: import("@webiny/di").Implementation<typeof DefaultStackOutputCacheService>;
@@ -0,0 +1,89 @@
1
+ import { createImplementation } from "@webiny/di";
2
+ import { GetProjectService, LoggerService, ProjectSdkParamsService, StackOutputCacheService } from "../../abstractions/index.js";
3
+ import promises from "fs/promises";
4
+ class DefaultStackOutputCacheService {
5
+ static{
6
+ this.DEFAULT_ENV = "dev";
7
+ }
8
+ static{
9
+ this.DEFAULT_REGION = "default";
10
+ }
11
+ static{
12
+ this.DEFAULT_VARIANT = "default";
13
+ }
14
+ constructor(getProjectService, projectSdkParamsService, loggerService){
15
+ this.getProjectService = getProjectService;
16
+ this.projectSdkParamsService = projectSdkParamsService;
17
+ this.loggerService = loggerService;
18
+ }
19
+ async read(app) {
20
+ const cachePath = this.getCachePath(app);
21
+ try {
22
+ const content = await promises.readFile(cachePath, "utf-8");
23
+ const data = JSON.parse(content);
24
+ this.loggerService.debug({
25
+ app: app.name,
26
+ cacheKey: this.getCacheKey(app)
27
+ }, "Stack output read from cache");
28
+ return data;
29
+ } catch {
30
+ return null;
31
+ }
32
+ }
33
+ async write(app, data) {
34
+ const cachePath = this.getCachePath(app);
35
+ const cacheDir = this.getCacheDir().toString();
36
+ try {
37
+ await promises.mkdir(cacheDir, {
38
+ recursive: true
39
+ });
40
+ await promises.writeFile(cachePath, JSON.stringify(data, null, 2), "utf-8");
41
+ this.loggerService.debug("Stack output stored to cache", {
42
+ app: app.name,
43
+ cacheKey: this.getCacheKey(app)
44
+ });
45
+ } catch (error) {
46
+ this.loggerService.error("Could not write to cache file.", cachePath, error);
47
+ }
48
+ }
49
+ async delete(app) {
50
+ const cachePath = this.getCachePath(app);
51
+ try {
52
+ await promises.rm(cachePath, {
53
+ force: true
54
+ });
55
+ this.loggerService.debug("Stack output cache deleted.", {
56
+ app: app.name,
57
+ cacheKey: this.getCacheKey(app)
58
+ });
59
+ } catch (error) {
60
+ this.loggerService.error("Could not delete stack output cache file.", cachePath, error);
61
+ }
62
+ }
63
+ getCacheKey(app) {
64
+ const sdkParams = this.projectSdkParamsService.get();
65
+ const env = sdkParams.env || DefaultStackOutputCacheService.DEFAULT_ENV;
66
+ const region = sdkParams.region || DefaultStackOutputCacheService.DEFAULT_REGION;
67
+ const variant = sdkParams.variant || DefaultStackOutputCacheService.DEFAULT_VARIANT;
68
+ return `${app.name}-${env}-${region}-${variant}.json`;
69
+ }
70
+ getCacheDir() {
71
+ const project = this.getProjectService.execute();
72
+ return project.paths.dotWebinyFolder.join("caches", "stack-output");
73
+ }
74
+ getCachePath(app) {
75
+ return this.getCacheDir().join(this.getCacheKey(app)).toString();
76
+ }
77
+ }
78
+ const stackOutputCacheService = createImplementation({
79
+ abstraction: StackOutputCacheService,
80
+ implementation: DefaultStackOutputCacheService,
81
+ dependencies: [
82
+ GetProjectService,
83
+ ProjectSdkParamsService,
84
+ LoggerService
85
+ ]
86
+ });
87
+ export { DefaultStackOutputCacheService, stackOutputCacheService };
88
+
89
+ //# sourceMappingURL=StackOutputCacheService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services/StackOutputCacheService/StackOutputCacheService.js","sources":["../../../src/services/StackOutputCacheService/StackOutputCacheService.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/di\";\nimport {\n GetProjectService,\n LoggerService,\n ProjectSdkParamsService,\n StackOutputCacheService\n} from \"~/abstractions/index.js\";\nimport { type AppModel } from \"~/models/index.js\";\nimport fs from \"fs/promises\";\n\nexport class DefaultStackOutputCacheService implements StackOutputCacheService.Interface {\n private static readonly DEFAULT_ENV = \"dev\";\n private static readonly DEFAULT_REGION = \"default\";\n private static readonly DEFAULT_VARIANT = \"default\";\n\n constructor(\n private getProjectService: GetProjectService.Interface,\n private projectSdkParamsService: ProjectSdkParamsService.Interface,\n private loggerService: LoggerService.Interface\n ) {}\n\n async read(app: AppModel): Promise<Record<string, any> | null> {\n const cachePath = this.getCachePath(app);\n\n try {\n const content = await fs.readFile(cachePath, \"utf-8\");\n const data = JSON.parse(content);\n this.loggerService.debug(\n { app: app.name, cacheKey: this.getCacheKey(app) },\n \"Stack output read from cache\"\n );\n return data;\n } catch {\n // File doesn't exist or couldn't be read/parsed - this is expected on first run.\n return null;\n }\n }\n\n async write(app: AppModel, data: Record<string, any>): Promise<void> {\n const cachePath = this.getCachePath(app);\n const cacheDir = this.getCacheDir().toString();\n\n try {\n // Create cache directory if it doesn't exist.\n await fs.mkdir(cacheDir, { recursive: true });\n await fs.writeFile(cachePath, JSON.stringify(data, null, 2), \"utf-8\");\n this.loggerService.debug(\"Stack output stored to cache\", {\n app: app.name,\n cacheKey: this.getCacheKey(app)\n });\n } catch (error) {\n this.loggerService.error(\"Could not write to cache file.\", cachePath, error);\n }\n }\n\n async delete(app: AppModel): Promise<void> {\n const cachePath = this.getCachePath(app);\n\n try {\n // `force: true` makes this a no-op if the cache file doesn't exist.\n await fs.rm(cachePath, { force: true });\n this.loggerService.debug(\"Stack output cache deleted.\", {\n app: app.name,\n cacheKey: this.getCacheKey(app)\n });\n } catch (error) {\n this.loggerService.error(\"Could not delete stack output cache file.\", cachePath, error);\n }\n }\n\n private getCacheKey(app: AppModel): string {\n const sdkParams = this.projectSdkParamsService.get();\n const env = sdkParams.env || DefaultStackOutputCacheService.DEFAULT_ENV;\n const region = sdkParams.region || DefaultStackOutputCacheService.DEFAULT_REGION;\n const variant = sdkParams.variant || DefaultStackOutputCacheService.DEFAULT_VARIANT;\n return `${app.name}-${env}-${region}-${variant}.json`;\n }\n\n private getCacheDir() {\n const project = this.getProjectService.execute();\n return project.paths.dotWebinyFolder.join(\"caches\", \"stack-output\");\n }\n\n private getCachePath(app: AppModel): string {\n return this.getCacheDir().join(this.getCacheKey(app)).toString();\n }\n}\n\nexport const stackOutputCacheService = createImplementation({\n abstraction: StackOutputCacheService,\n implementation: DefaultStackOutputCacheService,\n dependencies: [GetProjectService, ProjectSdkParamsService, LoggerService]\n});\n"],"names":["DefaultStackOutputCacheService","getProjectService","projectSdkParamsService","loggerService","app","cachePath","content","fs","data","JSON","cacheDir","error","sdkParams","env","region","variant","project","stackOutputCacheService","createImplementation","StackOutputCacheService","GetProjectService","ProjectSdkParamsService","LoggerService"],"mappings":";;;AAUO,MAAMA;;aACe,WAAW,GAAG;;;aACd,cAAc,GAAG;;;aACjB,eAAe,GAAG;;IAE1C,YACYC,iBAA8C,EAC9CC,uBAA0D,EAC1DC,aAAsC,CAChD;aAHUF,iBAAiB,GAAjBA;aACAC,uBAAuB,GAAvBA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,KAAKC,GAAa,EAAuC;QAC3D,MAAMC,YAAY,IAAI,CAAC,YAAY,CAACD;QAEpC,IAAI;YACA,MAAME,UAAU,MAAMC,SAAAA,QAAW,CAACF,WAAW;YAC7C,MAAMG,OAAOC,KAAK,KAAK,CAACH;YACxB,IAAI,CAAC,aAAa,CAAC,KAAK,CACpB;gBAAE,KAAKF,IAAI,IAAI;gBAAE,UAAU,IAAI,CAAC,WAAW,CAACA;YAAK,GACjD;YAEJ,OAAOI;QACX,EAAE,OAAM;YAEJ,OAAO;QACX;IACJ;IAEA,MAAM,MAAMJ,GAAa,EAAEI,IAAyB,EAAiB;QACjE,MAAMH,YAAY,IAAI,CAAC,YAAY,CAACD;QACpC,MAAMM,WAAW,IAAI,CAAC,WAAW,GAAG,QAAQ;QAE5C,IAAI;YAEA,MAAMH,SAAAA,KAAQ,CAACG,UAAU;gBAAE,WAAW;YAAK;YAC3C,MAAMH,SAAAA,SAAY,CAACF,WAAWI,KAAK,SAAS,CAACD,MAAM,MAAM,IAAI;YAC7D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,gCAAgC;gBACrD,KAAKJ,IAAI,IAAI;gBACb,UAAU,IAAI,CAAC,WAAW,CAACA;YAC/B;QACJ,EAAE,OAAOO,OAAO;YACZ,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,kCAAkCN,WAAWM;QAC1E;IACJ;IAEA,MAAM,OAAOP,GAAa,EAAiB;QACvC,MAAMC,YAAY,IAAI,CAAC,YAAY,CAACD;QAEpC,IAAI;YAEA,MAAMG,SAAAA,EAAK,CAACF,WAAW;gBAAE,OAAO;YAAK;YACrC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,+BAA+B;gBACpD,KAAKD,IAAI,IAAI;gBACb,UAAU,IAAI,CAAC,WAAW,CAACA;YAC/B;QACJ,EAAE,OAAOO,OAAO;YACZ,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,6CAA6CN,WAAWM;QACrF;IACJ;IAEQ,YAAYP,GAAa,EAAU;QACvC,MAAMQ,YAAY,IAAI,CAAC,uBAAuB,CAAC,GAAG;QAClD,MAAMC,MAAMD,UAAU,GAAG,IAAIZ,+BAA+B,WAAW;QACvE,MAAMc,SAASF,UAAU,MAAM,IAAIZ,+BAA+B,cAAc;QAChF,MAAMe,UAAUH,UAAU,OAAO,IAAIZ,+BAA+B,eAAe;QACnF,OAAO,GAAGI,IAAI,IAAI,CAAC,CAAC,EAAES,IAAI,CAAC,EAAEC,OAAO,CAAC,EAAEC,QAAQ,KAAK,CAAC;IACzD;IAEQ,cAAc;QAClB,MAAMC,UAAU,IAAI,CAAC,iBAAiB,CAAC,OAAO;QAC9C,OAAOA,QAAQ,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU;IACxD;IAEQ,aAAaZ,GAAa,EAAU;QACxC,OAAO,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAACA,MAAM,QAAQ;IAClE;AACJ;AAEO,MAAMa,0BAA0BC,qBAAqB;IACxD,aAAaC;IACb,gBAAgBnB;IAChB,cAAc;QAACoB;QAAmBC;QAAyBC;KAAc;AAC7E"}
@@ -0,0 +1 @@
1
+ export * from "./StackOutputCacheService.js";
@@ -0,0 +1 @@
1
+ export * from "./StackOutputCacheService.js";
@@ -29,6 +29,7 @@ export * from "./PulumiGetStackOutputService/index.js";
29
29
  export * from "./PulumiLoginService/index.js";
30
30
  export * from "./PulumiSelectStackService/index.js";
31
31
  export * from "./SetProjectIdService/index.js";
32
+ export * from "./StackOutputCacheService/index.js";
32
33
  export * from "./StdioService/index.js";
33
34
  export * from "./UiService/index.js";
34
35
  export * from "./ValidateProjectConfigService/index.js";
package/services/index.js CHANGED
@@ -29,6 +29,7 @@ export * from "./PulumiGetStackOutputService/index.js";
29
29
  export * from "./PulumiLoginService/index.js";
30
30
  export * from "./PulumiSelectStackService/index.js";
31
31
  export * from "./SetProjectIdService/index.js";
32
+ export * from "./StackOutputCacheService/index.js";
32
33
  export * from "./StdioService/index.js";
33
34
  export * from "./UiService/index.js";
34
35
  export * from "./ValidateProjectConfigService/index.js";