@geek-fun/serverlessinsight 0.4.0 → 0.5.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 (160) hide show
  1. package/.gitattributes +1 -0
  2. package/README.md +108 -8
  3. package/README.zh-CN.md +52 -8
  4. package/dist/package.json +37 -35
  5. package/dist/src/commands/deploy.js +17 -7
  6. package/dist/src/commands/destroy.js +27 -4
  7. package/dist/src/commands/forceUnlock.js +61 -0
  8. package/dist/src/commands/index.js +86 -14
  9. package/dist/src/commands/local.js +10 -1
  10. package/dist/src/commands/plan.js +33 -0
  11. package/dist/src/commands/template.js +3 -1
  12. package/dist/src/commands/validate.js +2 -1
  13. package/dist/src/common/aliyunClient/apigwOperations.js +652 -0
  14. package/dist/src/common/aliyunClient/dnsOperations.js +90 -0
  15. package/dist/src/common/aliyunClient/ecsOperations.js +141 -0
  16. package/dist/src/common/aliyunClient/esOperations.js +219 -0
  17. package/dist/src/common/aliyunClient/fc3Operations.js +270 -0
  18. package/dist/src/common/aliyunClient/index.js +141 -0
  19. package/dist/src/common/aliyunClient/nasOperations.js +233 -0
  20. package/dist/src/common/aliyunClient/ossOperations.js +237 -0
  21. package/dist/src/common/aliyunClient/ramOperations.js +205 -0
  22. package/dist/src/common/aliyunClient/rdsOperations.js +206 -0
  23. package/dist/src/common/aliyunClient/slsOperations.js +218 -0
  24. package/dist/src/common/aliyunClient/tablestoreOperations.js +199 -0
  25. package/dist/src/common/aliyunClient/types.js +2 -0
  26. package/dist/src/common/constants.js +7 -1
  27. package/dist/src/common/context.js +32 -14
  28. package/dist/src/common/credentials.js +39 -0
  29. package/dist/src/common/dependencyGraph/graph.js +280 -0
  30. package/dist/src/common/dependencyGraph/index.js +18 -0
  31. package/dist/src/common/dependencyGraph/types.js +2 -0
  32. package/dist/src/common/fileUtils.js +16 -0
  33. package/dist/src/common/hashUtils.js +121 -0
  34. package/dist/src/common/iacHelper.js +25 -97
  35. package/dist/src/common/imsClient.js +4 -0
  36. package/dist/src/common/index.js +7 -2
  37. package/dist/src/common/lockManager.js +212 -0
  38. package/dist/src/common/logger.js +89 -6
  39. package/dist/src/common/providerEnum.js +2 -3
  40. package/dist/src/common/runtimeMapper.js +160 -0
  41. package/dist/src/common/scfClient.js +84 -0
  42. package/dist/src/common/stateManager.js +107 -0
  43. package/dist/src/common/tencentClient/cosOperations.js +287 -0
  44. package/dist/src/common/tencentClient/esOperations.js +156 -0
  45. package/dist/src/common/tencentClient/index.js +116 -0
  46. package/dist/src/common/tencentClient/scfOperations.js +141 -0
  47. package/dist/src/common/tencentClient/tdsqlcOperations.js +211 -0
  48. package/dist/src/common/tencentClient/types.js +17 -0
  49. package/dist/src/lang/en.js +254 -0
  50. package/dist/src/lang/index.js +28 -8
  51. package/dist/src/lang/zh-CN.js +229 -0
  52. package/dist/src/parser/bucketParser.js +25 -12
  53. package/dist/src/parser/databaseParser.js +14 -10
  54. package/dist/src/parser/functionParser.js +19 -6
  55. package/dist/src/parser/parseUtils.js +74 -0
  56. package/dist/src/parser/tableParser.js +19 -17
  57. package/dist/src/stack/aliyunStack/apigwExecutor.js +84 -0
  58. package/dist/src/stack/aliyunStack/apigwPlanner.js +118 -0
  59. package/dist/src/stack/aliyunStack/apigwResource.js +339 -0
  60. package/dist/src/stack/aliyunStack/apigwTypes.js +125 -0
  61. package/dist/src/stack/aliyunStack/databaseExecutor.js +112 -0
  62. package/dist/src/stack/aliyunStack/databasePlanner.js +128 -0
  63. package/dist/src/stack/aliyunStack/databaseResource.js +228 -0
  64. package/dist/src/stack/aliyunStack/deployer.js +133 -0
  65. package/dist/src/stack/aliyunStack/destroyer.js +114 -0
  66. package/dist/src/stack/aliyunStack/esServerlessTypes.js +141 -0
  67. package/dist/src/stack/aliyunStack/fc3Executor.js +91 -0
  68. package/dist/src/stack/aliyunStack/fc3Planner.js +77 -0
  69. package/dist/src/stack/aliyunStack/fc3Resource.js +511 -0
  70. package/dist/src/stack/aliyunStack/fc3Types.js +76 -0
  71. package/dist/src/stack/aliyunStack/index.js +40 -0
  72. package/dist/src/stack/aliyunStack/ossExecutor.js +91 -0
  73. package/dist/src/stack/aliyunStack/ossPlanner.js +76 -0
  74. package/dist/src/stack/aliyunStack/ossResource.js +196 -0
  75. package/dist/src/stack/aliyunStack/ossTypes.js +50 -0
  76. package/dist/src/stack/aliyunStack/planner.js +37 -0
  77. package/dist/src/stack/aliyunStack/rdsTypes.js +217 -0
  78. package/dist/src/stack/aliyunStack/tablestoreExecutor.js +92 -0
  79. package/dist/src/stack/aliyunStack/tablestorePlanner.js +94 -0
  80. package/dist/src/stack/aliyunStack/tablestoreResource.js +120 -0
  81. package/dist/src/stack/aliyunStack/tablestoreTypes.js +77 -0
  82. package/dist/src/stack/bucketTypes.js +17 -0
  83. package/dist/src/stack/deploy.js +24 -77
  84. package/dist/src/stack/localStack/bucket.js +11 -6
  85. package/dist/src/stack/localStack/event.js +10 -5
  86. package/dist/src/stack/localStack/function.js +13 -7
  87. package/dist/src/stack/localStack/functionRunner.js +1 -1
  88. package/dist/src/stack/localStack/localServer.js +7 -6
  89. package/dist/src/stack/scfStack/cosExecutor.js +91 -0
  90. package/dist/src/stack/scfStack/cosPlanner.js +76 -0
  91. package/dist/src/stack/scfStack/cosResource.js +126 -0
  92. package/dist/src/stack/scfStack/cosTypes.js +46 -0
  93. package/dist/src/stack/scfStack/deployer.js +91 -0
  94. package/dist/src/stack/scfStack/destroyer.js +88 -0
  95. package/dist/src/stack/scfStack/esServerlessExecutor.js +105 -0
  96. package/dist/src/stack/scfStack/esServerlessPlanner.js +86 -0
  97. package/dist/src/stack/scfStack/esServerlessResource.js +94 -0
  98. package/dist/src/stack/scfStack/esServerlessTypes.js +48 -0
  99. package/dist/src/stack/scfStack/index.js +35 -0
  100. package/dist/src/stack/scfStack/planner.js +91 -0
  101. package/dist/src/stack/scfStack/scfExecutor.js +91 -0
  102. package/dist/src/stack/scfStack/scfPlanner.js +78 -0
  103. package/dist/src/stack/scfStack/scfResource.js +216 -0
  104. package/dist/src/stack/scfStack/scfTypes.js +41 -0
  105. package/dist/src/stack/scfStack/tdsqlcExecutor.js +105 -0
  106. package/dist/src/stack/scfStack/tdsqlcPlanner.js +90 -0
  107. package/dist/src/stack/scfStack/tdsqlcResource.js +146 -0
  108. package/dist/src/stack/scfStack/tdsqlcTypes.js +59 -0
  109. package/dist/src/types/domains/lock.js +2 -0
  110. package/dist/src/types/domains/resolvable.js +2 -0
  111. package/dist/src/types/domains/state.js +19 -0
  112. package/dist/src/types/index.js +4 -0
  113. package/dist/src/validator/bucketSchema.js +4 -10
  114. package/dist/src/validator/databaseSchema.js +36 -36
  115. package/dist/src/validator/eventSchema.js +3 -2
  116. package/dist/src/validator/functionSchema.js +51 -46
  117. package/dist/src/validator/iacSchema.js +52 -3
  118. package/dist/src/validator/rootSchema.js +47 -1
  119. package/dist/src/validator/tableschema.js +9 -8
  120. package/dist/src/validator/templateRefSchema.js +23 -0
  121. package/dist/tsconfig.tsbuildinfo +1 -1
  122. package/package.json +37 -35
  123. package/samples/README_TENCENT_COS.md +486 -0
  124. package/samples/README_TENCENT_SCF.md +272 -0
  125. package/samples/aliyun-poc-api.yml +1 -1
  126. package/samples/aliyun-poc-bucket.yml +0 -1
  127. package/samples/aliyun-poc-domain.yml +0 -1
  128. package/samples/aliyun-poc-es.yml +14 -13
  129. package/samples/aliyun-poc-rds.yml +0 -2
  130. package/samples/aliyun-poc-table.yml +1 -3
  131. package/samples/tencent-poc-cos.yml +20 -0
  132. package/samples/tencent-poc-scf.yml +36 -0
  133. package/dist/src/commands/index.d.ts +0 -2
  134. package/dist/src/common/index.d.ts +0 -11
  135. package/dist/src/common/rosAssets.js +0 -178
  136. package/dist/src/common/rosClient.js +0 -198
  137. package/dist/src/index.d.ts +0 -1
  138. package/dist/src/lang/index.d.ts +0 -3
  139. package/dist/src/parser/index.d.ts +0 -3
  140. package/dist/src/stack/index.d.ts +0 -1
  141. package/dist/src/stack/localStack/index.d.ts +0 -5
  142. package/dist/src/stack/rfsStack/index.d.ts +0 -9
  143. package/dist/src/stack/rosStack/bootstrap.js +0 -187
  144. package/dist/src/stack/rosStack/bucket.js +0 -127
  145. package/dist/src/stack/rosStack/database.js +0 -313
  146. package/dist/src/stack/rosStack/event.js +0 -143
  147. package/dist/src/stack/rosStack/function.js +0 -259
  148. package/dist/src/stack/rosStack/index.d.ts +0 -7
  149. package/dist/src/stack/rosStack/index.js +0 -75
  150. package/dist/src/stack/rosStack/stage.js +0 -46
  151. package/dist/src/stack/rosStack/table.js +0 -95
  152. package/dist/src/stack/rosStack/tag.js +0 -11
  153. package/dist/src/stack/rosStack/vars.js +0 -49
  154. package/dist/src/types/index.d.ts +0 -55
  155. package/dist/src/types/localStack/index.d.ts +0 -81
  156. package/dist/src/validator/index.d.ts +0 -1
  157. package/layers/si-bootstrap-sdk/Dockerfile-aliyuncli +0 -12
  158. package/layers/si-bootstrap-sdk/README.md +0 -1
  159. package/layers/si-bootstrap-sdk/package-lock.json +0 -875
  160. package/layers/si-bootstrap-sdk/package.json +0 -33
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.zhCN = void 0;
4
+ exports.zhCN = {
5
+ // Validation messages
6
+ VALIDATING_YAML: '正在验证 yaml...',
7
+ YAML_VALID: 'Yaml 有效! 🎉',
8
+ INVALID_YAML: '无效的 yaml: {{errors}}',
9
+ LOG_COMMAND_INFO: '记录命令信息',
10
+ // Deploy messages
11
+ DEPLOYING_STACK: '正在部署资源栈...',
12
+ STACK_DEPLOYED: '资源栈部署成功! 🎉',
13
+ DEPLOYING_STACK_PUBLISHING_ASSETS: '正在部署资源栈,发布资源...',
14
+ ASSETS_PUBLISHED: '资源发布成功! 🎉',
15
+ FAILED_TO_DEPLOY_STACK: '部署资源栈失败: {{error}}',
16
+ CLEANING_UP_TEMPORARY_ASSETS: '正在清理临时资源...',
17
+ ASSETS_CLEANED_UP: '资源清理完成!♻️',
18
+ FAILED_TO_CLEANUP_ASSETS: '清理资源失败,这不会影响部署结果,但为了避免潜在成本,您可以删除临时存储桶: {{bucketName}},错误详情:{{error}}',
19
+ // Stack operations
20
+ CREATING_STACK_ID: '创建中,资源栈ID: {{stackId}}',
21
+ UPDATING_STACK_ID: '更新中,资源栈ID: {{stackId}}',
22
+ UPDATE_COMPLETELY_SAME_STACK: '栈完全相同,更新跳过',
23
+ STACK_STATUS: '资源栈状态: {{status}}',
24
+ UPDATE_STACK_DEPLOYING: '更新资源栈: {{stackName}} 部署中... ',
25
+ STACK_UPDATE_SUCCESS: '资源栈更新成功! 栈名称:{{stackName}}, 栈ID:{{stackId}}',
26
+ CREATE_STACK_DEPLOYING: '创建资源栈: {{stackName}} 部署中... ',
27
+ CREATE_STACK_SUCCESS: '资源栈创建成功! 栈名称:{{stackName}}, 栈ID:{{stackId}}',
28
+ STACK_NOT_EXISTS_SKIPPED: '资源栈: {{stackName}} 不存在,已跳过! 🚫',
29
+ STACK_DELETED: '资源栈: {{stackName}} 已删除!🗑 ',
30
+ STACK_DELETE_FAILED: '资源栈: {{stackName}} 删除失败! ❌, 错误: {{error}}',
31
+ DESTROYING_STACK: '正在销毁资源栈: {{stackName}}, 供应商: {{provider}}, 地区: {{region}}...',
32
+ // Asset messages
33
+ FOLDER_COMPRESSED_TO: '文件夹已压缩至: {{zipPath}}',
34
+ FAILED_TO_COMPRESS_FOLDER: '压缩文件夹失败: {{error}}',
35
+ BUCKET_NOT_EXISTS_CREATING: '存储桶: {{bucketName}} 不存在,正在创建...',
36
+ NO_ASSETS_TO_PUBLISH: '没有要发布的资源,已跳过!',
37
+ UPLOAD_FILE_SUCCESS: '上传文件: {{source}} 到存储桶: {{bucketName}} 成功!',
38
+ NO_ASSETS_TO_CLEANUP: '没有要清理的资源,已跳过!',
39
+ CLEANUP_FILE_SUCCESS: '从存储桶: {{bucketName}} 清理文件: {{objectKey}} 成功!',
40
+ CLEANUP_BUCKET_SUCCESS: '清理存储桶: {{bucketName}} 成功!',
41
+ // Variable warnings
42
+ VARIABLE_NOT_FOUND: '变量 "{{key}}" 在 vars 或 parameters 中未找到,使用空字符串',
43
+ STAGE_VARIABLE_NOT_FOUND: '阶段变量 "{{key}}" 在阶段 "{{stage}}" 中未找到,使用空字符串',
44
+ // Local server messages
45
+ LOCAL_SERVER_ALREADY_RUNNING: '本地服务器已在 http://localhost:{{port}} 上运行',
46
+ LOCAL_SERVER_LISTENING: '本地服务器正在监听 http://localhost:{{port}}',
47
+ LOCAL_SERVER_NOT_RUNNING: '本地服务器未运行',
48
+ LOCAL_SERVER_STOPPED: '本地服务器已停止',
49
+ LOCAL_GATEWAY_ERROR: '本地网关错误',
50
+ ERROR_STOPPING_LOCAL_SERVER: '停止本地服务器时出错',
51
+ RUN_LOCAL_STARTING: '启动本地运行: stack={{stackName}} stage={{stage}} port={{port}} debug={{debug}} watch={{watch}}',
52
+ // Function execution
53
+ FUNCTION_REQUEST_RECEIVED: '本地服务器收到函数请求 -> {{method}} {{identifier}} ',
54
+ INVOKING_WORKER_WITH_EVENT_TYPE: '使用事件类型调用工作进程: {{eventType}} 和上下文',
55
+ WORKER_CODE_DIR: '工作进程代码目录: {{codeDir}}, 处理器: {{handler}}',
56
+ FUNCTION_EXECUTION_RESULT: '函数执行结果: {{result}}',
57
+ FUNCTION_EXECUTION_ERROR: '函数执行错误: {{error}}',
58
+ INVOKING_FC_FUNCTION_WITH_ALIYUN_EVENT: '使用阿里云事件格式调用 FC 函数',
59
+ // Event trigger
60
+ EVENT_TRIGGER: '事件触发器 {{triggers}}, 请求方法: {{method}}, 请求 url: {{url}}',
61
+ // Bucket operations
62
+ BUCKET_REQUEST_RECEIVED: '本地服务器收到存储桶请求 -> {{method}} {{identifier}} {{url}}',
63
+ ERROR_LISTING_DIRECTORY: '列出目录时出错: {{error}}',
64
+ ERROR_GETTING_ALL_FILES: '获取所有文件时出错: {{error}}',
65
+ ERROR_LISTING_BUCKET_FILES: '列出存储桶文件时出错: {{error}}',
66
+ ERROR_READING_FILE: '读取文件时出错: {{error}}',
67
+ // Bootstrap messages
68
+ ERROR_GENERAL: '错误: {{error}}',
69
+ FAILED_TO_SEND_ERROR_RESPONSE: '发送错误响应失败: {{error}}',
70
+ RESPONSE_SENT_SUCCESSFULLY: '响应发送成功',
71
+ ERROR_SENDING_RESPONSE: '发送响应时出错: {{error}}',
72
+ // Command errors
73
+ COMMAND_FAILED: '命令 "{{commandName}}" 执行失败:\n{{error}}',
74
+ STACK_TRACE: '堆栈跟踪:\n{{stack}}',
75
+ // Debug/Test messages
76
+ RESULT: '结果: {{result}}',
77
+ // Function runner
78
+ FUNCTION_LOG_FORMAT: '{{timestamp}} {{requestId}} [{{level}}] {{message}}',
79
+ // Plan command messages
80
+ PLAN_COMMAND_TENCENT_ONLY: 'Plan 命令目前仅支持腾讯云提供商',
81
+ GENERATING_PLAN_FOR_SCF: '正在为腾讯云 SCF 资源生成计划...',
82
+ DEPLOYMENT_PLAN: '部署计划',
83
+ NO_CHANGES_INFRASTRUCTURE_UP_TO_DATE: '无变更。基础设施已是最新状态。',
84
+ CREATE: '创建',
85
+ UPDATE: '更新',
86
+ DELETE: '删除',
87
+ NO_CHANGE: '无变更',
88
+ RESOURCES_TO_BE_CREATED: '待创建的资源',
89
+ RESOURCES_TO_BE_UPDATED: '待更新的资源',
90
+ RESOURCES_TO_BE_DELETED: '待删除的资源',
91
+ RESOURCES_UNCHANGED: '未变更的资源',
92
+ DRIFTED: '已漂移',
93
+ REMOTE_CONFIG_DIFFERS: '远程配置与状态不同',
94
+ CHANGES: '变更',
95
+ PLAN: '计划',
96
+ TO_CREATE: '待创建',
97
+ TO_UPDATE: '待更新',
98
+ TO_DELETE: '待删除',
99
+ UNCHANGED: '未变更',
100
+ ACTIONS: '个操作',
101
+ GENERATING_PLAN: '正在生成部署计划...',
102
+ PLAN_GENERATED: '计划已生成,共有',
103
+ EXECUTING_PLAN: '正在执行部署计划...',
104
+ // TDSQL-C 数据库消息
105
+ TDSQL_CLUSTER_CREATION_INITIATED: 'TDSQL-C 集群创建已启动',
106
+ TDSQL_CLUSTER_CREATION_FAILED: '创建 TDSQL-C 集群失败',
107
+ TDSQL_CLUSTER_NO_ID_RETURNED: '创建 TDSQL-C 集群失败:未返回集群 ID',
108
+ TDSQL_CLUSTER_READY: 'TDSQL-C 集群已就绪: {{clusterId}}',
109
+ TDSQL_CLUSTER_ERROR_STATE: 'TDSQL-C 集群处于错误状态: {{status}}',
110
+ TDSQL_CLUSTER_WAITING: '等待 TDSQL-C 集群就绪: {{clusterId}} (状态: {{status}})',
111
+ TDSQL_CLUSTER_TIMEOUT_READY: '等待 TDSQL-C 集群就绪超时: {{clusterId}}',
112
+ TDSQL_CLUSTER_NOT_FOUND: '未找到 TDSQL-C 集群: {{clusterId}}',
113
+ TDSQL_CLUSTER_GET_FAILED: '获取 TDSQL-C 集群失败',
114
+ TDSQL_CLUSTER_UPDATED: 'TDSQL-C 集群已更新: {{clusterId}}',
115
+ TDSQL_CLUSTER_UPDATE_FAILED: '更新 TDSQL-C 集群失败',
116
+ TDSQL_CLUSTER_DELETION_INITIATED: 'TDSQL-C 集群删除已启动: {{clusterId}}',
117
+ TDSQL_CLUSTER_DELETED: 'TDSQL-C 集群已删除: {{clusterId}}',
118
+ TDSQL_CLUSTER_DELETE_FAILED: '删除 TDSQL-C 集群失败',
119
+ TDSQL_CLUSTER_BEING_DELETED: 'TDSQL-C 集群正在删除: {{clusterId}}',
120
+ TDSQL_CLUSTER_WAITING_DELETE: '等待 TDSQL-C 集群删除: {{clusterId}} (状态: {{status}})',
121
+ TDSQL_CLUSTER_TIMEOUT_DELETE: '等待 TDSQL-C 集群删除超时: {{clusterId}}',
122
+ // RDS 数据库消息
123
+ RDS_INSTANCE_CREATION_INITIATED: 'RDS 实例创建已启动',
124
+ RDS_INSTANCE_CREATION_FAILED: '创建 RDS 实例失败: {{error}}',
125
+ RDS_INSTANCE_NO_ID_RETURNED: '创建 RDS 实例失败:未返回实例 ID',
126
+ RDS_INSTANCE_READY: 'RDS 实例已就绪: {{instanceId}}',
127
+ RDS_INSTANCE_ERROR_STATE: 'RDS 实例处于错误状态: {{status}}',
128
+ RDS_INSTANCE_WAITING: '等待 RDS 实例就绪: {{instanceId}} (状态: {{status}})',
129
+ RDS_INSTANCE_TIMEOUT_READY: '等待 RDS 实例就绪超时: {{instanceId}}',
130
+ RDS_INSTANCE_NOT_FOUND: '未找到 RDS 实例: {{instanceId}}',
131
+ RDS_INSTANCE_GET_FAILED: '获取 RDS 实例失败: {{error}}',
132
+ RDS_INSTANCE_UPDATED: 'RDS 实例已更新: {{instanceId}}',
133
+ RDS_INSTANCE_UPDATE_FAILED: '更新 RDS 实例失败: {{error}}',
134
+ RDS_INSTANCE_DELETION_INITIATED: 'RDS 实例删除已启动: {{instanceId}}',
135
+ RDS_INSTANCE_DELETED: 'RDS 实例已删除: {{instanceId}}',
136
+ RDS_INSTANCE_DELETE_FAILED: '删除 RDS 实例失败: {{error}}',
137
+ RDS_INSTANCE_WAITING_DELETE: '等待 RDS 实例删除: {{instanceId}}',
138
+ RDS_INSTANCE_TIMEOUT_DELETE: '等待 RDS 实例删除超时: {{instanceId}}',
139
+ // Elasticsearch Serverless 消息
140
+ ES_APP_CREATION_INITIATED: 'Elasticsearch Serverless 应用创建已启动',
141
+ ES_APP_CREATION_FAILED: '创建 Elasticsearch Serverless 应用失败: {{error}}',
142
+ ES_APP_NO_ID_RETURNED: '创建 Elasticsearch Serverless 应用失败:未返回应用 ID',
143
+ ES_APP_READY: 'Elasticsearch Serverless 应用已就绪: {{appId}}',
144
+ ES_APP_ERROR_STATE: 'Elasticsearch Serverless 应用处于错误状态: {{status}}',
145
+ ES_APP_WAITING: '等待 Elasticsearch Serverless 应用就绪: {{appId}} (状态: {{status}})',
146
+ ES_APP_TIMEOUT_READY: '等待 Elasticsearch Serverless 应用就绪超时: {{appId}}',
147
+ ES_APP_NOT_FOUND: '未找到 Elasticsearch Serverless 应用: {{appId}}',
148
+ ES_APP_GET_FAILED: '获取 Elasticsearch Serverless 应用失败: {{error}}',
149
+ ES_APP_UPDATED: 'Elasticsearch Serverless 应用已更新: {{appName}}',
150
+ ES_APP_UPDATE_FAILED: '更新 Elasticsearch Serverless 应用失败: {{error}}',
151
+ ES_APP_DELETION_INITIATED: 'Elasticsearch Serverless 应用删除已启动: {{appName}}',
152
+ ES_APP_DELETED: 'Elasticsearch Serverless 应用已删除: {{appName}}',
153
+ ES_APP_DELETE_FAILED: '删除 Elasticsearch Serverless 应用失败: {{error}}',
154
+ ES_APP_WAITING_DELETE: '等待 Elasticsearch Serverless 应用删除: {{appName}}',
155
+ ES_APP_TIMEOUT_DELETE: '等待 Elasticsearch Serverless 应用删除超时: {{appName}}',
156
+ // 腾讯云 Elasticsearch Serverless 消息
157
+ TENCENT_ES_SPACE_CREATION_INITIATED: '腾讯云 ES Serverless 空间创建已启动',
158
+ TENCENT_ES_SPACE_CREATION_FAILED: '创建腾讯云 ES Serverless 空间失败: {{error}}',
159
+ TENCENT_ES_SPACE_NO_ID_RETURNED: '创建腾讯云 ES Serverless 空间失败:未返回空间 ID',
160
+ TENCENT_ES_SPACE_READY: '腾讯云 ES Serverless 空间已就绪: {{spaceId}}',
161
+ TENCENT_ES_SPACE_ERROR_STATE: '腾讯云 ES Serverless 空间处于错误状态: {{status}}',
162
+ TENCENT_ES_SPACE_WAITING: '等待腾讯云 ES Serverless 空间就绪: {{spaceId}} (状态: {{status}})',
163
+ TENCENT_ES_SPACE_TIMEOUT_READY: '等待腾讯云 ES Serverless 空间就绪超时: {{spaceId}}',
164
+ TENCENT_ES_SPACE_NOT_FOUND: '未找到腾讯云 ES Serverless 空间: {{spaceId}}',
165
+ TENCENT_ES_SPACE_GET_FAILED: '获取腾讯云 ES Serverless 空间失败: {{error}}',
166
+ TENCENT_ES_SPACE_UPDATED: '腾讯云 ES Serverless 空间已更新: {{spaceId}}',
167
+ TENCENT_ES_SPACE_UPDATE_FAILED: '更新腾讯云 ES Serverless 空间失败: {{error}}',
168
+ TENCENT_ES_SPACE_DELETION_INITIATED: '腾讯云 ES Serverless 空间删除已启动: {{spaceId}}',
169
+ TENCENT_ES_SPACE_DELETED: '腾讯云 ES Serverless 空间已删除: {{spaceId}}',
170
+ TENCENT_ES_SPACE_DELETE_FAILED: '删除腾讯云 ES Serverless 空间失败: {{error}}',
171
+ TENCENT_ES_SPACE_WAITING_DELETE: '等待腾讯云 ES Serverless 空间删除: {{spaceId}}',
172
+ TENCENT_ES_SPACE_TIMEOUT_DELETE: '等待腾讯云 ES Serverless 空间删除超时: {{spaceId}}',
173
+ // Partial failure messages
174
+ PARTIAL_DEPLOYMENT_FAILURE: '⚠️ 部署部分失败: {{successCount}} 个资源成功,但 {{failedResource}} 失败。',
175
+ PARTIAL_FAILURE_STATE_SAVED: '已成功部署的资源状态已保存。再次运行 deploy 以重试失败的资源。',
176
+ PARTIAL_FAILURE_NEXT_STEPS: '后续步骤: 1) 查看上面的错误, 2) 修复配置问题, 3) 再次运行 deploy 继续。',
177
+ FAILED_TO_EXECUTE_ACTION: '执行 {{action}} 失败: {{logicalId}}: {{error}}',
178
+ STATE_PERSISTED_AFTER_OPERATION: '{{action}} {{resourceId}} 后状态已持久化',
179
+ // API Gateway messages
180
+ APIGW_GROUP_FOUND_REUSING: '找到现有 API 分组: {{groupName}},将复用它',
181
+ APIGW_DOMAIN_BINDING_FAILED: '绑定自定义域名失败: {{error}}',
182
+ APIGW_GROUP_APIS_CREATED_DOMAIN_FAILED: 'API 网关分组和 API 创建成功,但域名绑定失败',
183
+ APIGW_STATE_SAVED_RETRY: '状态已保存。您可以修复域名验证问题后重新部署',
184
+ APIGW_DOMAIN_VERIFICATION_REQUIRED: '域名 {{domainName}} 需要所有权验证。请按照上面的说明添加 DNS 记录。',
185
+ APIGW_DNS_RECORD_ADDED: 'DNS 验证记录添加成功: 记录名={{record}}, 记录类型={{type}}, 记录值={{value}}',
186
+ APIGW_DNS_PROPAGATION_WAITING: '等待 DNS 传播...',
187
+ APIGW_DNS_PROPAGATION_CHECK: '检查 DNS 传播(第 {{attempt}}/{{max}} 次尝试,等待 1 分钟)...',
188
+ APIGW_DNS_VERIFIED: 'DNS 记录验证成功,耗时 {{minutes}} 分钟',
189
+ APIGW_DNS_CHECK_FAILED: 'DNS 检查第 {{attempt}} 次尝试失败: {{error}}',
190
+ APIGW_DNS_PROPAGATION_TIMEOUT: 'DNS 记录已添加,但 10 分钟后无法验证传播。继续执行...',
191
+ APIGW_DNS_VERIFICATION_FAILED: '为 {{domain}} 添加 DNS 验证记录失败: {{error}}',
192
+ APIGW_DNS_CHECKING_STATUS: '检查 DNS 记录状态...',
193
+ APIGW_DNS_RECORD_EXISTS_POLLING: 'DNS 验证记录已存在(创建于 {{minutes}} 分钟前),等待传播...',
194
+ APIGW_DNS_RECORD_EXISTS_CHECKING: 'DNS 验证记录已存在(创建于 {{minutes}} 分钟前),检查状态...',
195
+ APIGW_DNS_RECORD_ACTIVE: 'DNS 记录已激活并验证',
196
+ APIGW_DNS_RECORD_MAY_NOT_PROPAGATED: 'DNS 记录存在但可能尚未完全传播',
197
+ APIGW_DNS_ADDING_RECORD: '为域名添加 DNS 验证记录: {{domain}}',
198
+ APIGW_DNS_RECORD_ALREADY_EXISTS: 'DNS 验证记录已存在于 {{domain}}',
199
+ APIGW_BINDING_DOMAIN: '绑定自定义域名: {{domain}}',
200
+ APIGW_DOMAIN_BOUND_SUCCESS: '成功绑定域名: {{domain}}',
201
+ APIGW_DOMAIN_OWNERSHIP_FAILED: '域名所有权验证失败: {{domain}}',
202
+ APIGW_ATTEMPTING_AUTO_VERIFICATION: '尝试使用令牌自动进行 DNS 验证: {{token}}',
203
+ APIGW_RETRYING_DOMAIN_BINDING: 'DNS 验证后重试域名绑定...',
204
+ APIGW_DOMAIN_BOUND_AFTER_VERIFICATION: '验证后成功绑定域名: {{domain}}',
205
+ APIGW_AUTO_VERIFICATION_FAILED: '自动验证失败: {{error}}',
206
+ APIGW_NO_VERIFICATION_TOKEN: '无法从错误响应中提取验证令牌',
207
+ APIGW_MANUAL_VERIFICATION_REQUIRED: '请在阿里云控制台手动验证域名所有权',
208
+ APIGW_VERIFICATION_HEADER: '需要域名所有权验证',
209
+ APIGW_VERIFICATION_DOMAIN: '域名: {{domain}}',
210
+ APIGW_VERIFICATION_INSTRUCTIONS: '要验证域名所有权,请添加以下 DNS 记录之一:',
211
+ APIGW_VERIFICATION_OPTION1: '选项 1: CNAME 验证',
212
+ APIGW_VERIFICATION_OPTION2: '选项 2: TXT 验证(推荐)',
213
+ APIGW_VERIFICATION_RECORD_NAME: ' 记录名: {{name}}',
214
+ APIGW_VERIFICATION_RECORD_TYPE: ' 记录类型: {{type}}',
215
+ APIGW_VERIFICATION_RECORD_VALUE: ' 记录值: {{value}}',
216
+ APIGW_VERIFICATION_NEXT_STEPS: '添加 DNS 记录后:',
217
+ APIGW_VERIFICATION_STEP1: '1. 等待 5-10 分钟让 DNS 传播',
218
+ APIGW_VERIFICATION_STEP2: '2. 再次运行 deploy 命令',
219
+ // Function resource messages
220
+ FC3_DEPENDENT_RESOURCES_TRACKED: '依赖资源(SLS、RAM、安全组、NAS)已在状态中跟踪',
221
+ FC3_CAN_RETRY_DEPLOYMENT: '您可以重试部署 - 系统将复用现有的依赖资源',
222
+ // Bucket resource messages
223
+ OSS_BUCKET_TRACKED_CAN_RETRY: '存储桶已在状态中跟踪,您可以重试部署以上传文件',
224
+ // Dependency graph messages
225
+ DEPENDENCY_GRAPH_GENERATED: '依赖图已生成',
226
+ EXECUTION_ORDER: '执行顺序',
227
+ DOT_GRAPH_OUTPUT: 'DOT 图形输出',
228
+ CYCLE_DETECTED: '检测到循环依赖',
229
+ };
@@ -2,32 +2,45 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseBucket = void 0;
4
4
  const types_1 = require("../types");
5
+ const parseUtils_1 = require("./parseUtils");
5
6
  const parseBucket = (buckets) => {
6
7
  if (!buckets) {
7
8
  return undefined;
8
9
  }
9
10
  return Object.entries(buckets).map(([key, bucket]) => ({
10
11
  key,
11
- name: bucket.name,
12
- storage: bucket.storage,
13
- versioning: bucket.versioning,
12
+ name: String(bucket.name),
13
+ storage: bucket.storage
14
+ ? {
15
+ class: String(bucket.storage.class),
16
+ }
17
+ : undefined,
18
+ versioning: bucket.versioning
19
+ ? {
20
+ status: String(bucket.versioning.status),
21
+ }
22
+ : undefined,
14
23
  security: bucket.security
15
24
  ? {
16
25
  acl: bucket.security.acl
17
- ? bucket.security.acl
26
+ ? String(bucket.security.acl)
18
27
  : types_1.BucketAccessEnum.PRIVATE,
19
- force_delete: bucket.security.force_delete ?? false,
20
- sse_algorithm: bucket.security.sse_algorithm,
21
- sse_kms_master_key_id: bucket.security.sse_kms_master_key_id,
28
+ force_delete: (0, parseUtils_1.parseBooleanWithDefault)(bucket.security.force_delete, false),
29
+ sse_algorithm: bucket.security.sse_algorithm
30
+ ? String(bucket.security.sse_algorithm)
31
+ : undefined,
32
+ sse_kms_master_key_id: bucket.security.sse_kms_master_key_id
33
+ ? String(bucket.security.sse_kms_master_key_id)
34
+ : undefined,
22
35
  }
23
36
  : undefined,
24
37
  website: bucket.website
25
38
  ? {
26
- code: bucket.website.code,
27
- domain: bucket.website.domain,
28
- index: bucket.website.index ?? 'index.html',
29
- error_page: bucket.website.error_page ?? '404.html',
30
- error_code: bucket.website.error_code ?? 404,
39
+ code: String(bucket.website.code),
40
+ domain: bucket.website.domain ? String(bucket.website.domain) : undefined,
41
+ index: (0, parseUtils_1.parseStringWithDefault)(bucket.website.index, 'index.html'),
42
+ error_page: (0, parseUtils_1.parseStringWithDefault)(bucket.website.error_page, '404.html'),
43
+ error_code: (0, parseUtils_1.parseNumberWithDefault)(bucket.website.error_code, 404),
31
44
  }
32
45
  : undefined,
33
46
  }));
@@ -2,31 +2,35 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseDatabase = void 0;
4
4
  const lodash_1 = require("lodash");
5
+ const parseUtils_1 = require("./parseUtils");
5
6
  const parseDatabase = (databases) => {
6
7
  if ((0, lodash_1.isEmpty)(databases)) {
7
8
  return undefined;
8
9
  }
9
10
  return Object.entries(databases)?.map(([key, database]) => ({
10
11
  key: key,
11
- name: database.name,
12
- type: database.type,
13
- version: database.version,
12
+ name: String(database.name),
13
+ type: String(database.type),
14
+ version: String(database.version),
14
15
  security: {
15
16
  basicAuth: {
16
- username: (0, lodash_1.get)(database, 'security.basic_auth.master_user'),
17
- password: (0, lodash_1.get)(database, 'security.basic_auth.password'),
17
+ username: (0, parseUtils_1.parseOptionalString)((0, lodash_1.get)(database, 'security.basic_auth.master_user')),
18
+ password: String((0, lodash_1.get)(database, 'security.basic_auth.password') ?? ''),
18
19
  },
19
20
  },
20
21
  cu: {
21
- min: database.cu?.min ?? 0,
22
- max: database.cu?.max ?? 6,
22
+ min: (0, parseUtils_1.parseNumberWithDefault)(database.cu?.min, 0),
23
+ max: (0, parseUtils_1.parseNumberWithDefault)(database.cu?.max, 6),
23
24
  },
24
25
  storage: {
25
- min: database.storage?.min ?? 20,
26
+ min: (0, parseUtils_1.parseNumberWithDefault)(database.storage?.min, 10),
27
+ max: database.storage?.max ? (0, parseUtils_1.parseNumber)(database.storage.max, 0) : undefined,
26
28
  },
27
29
  network: {
28
- type: database.network?.type ?? 'PRIVATE',
29
- ingressRules: database.network?.ingress_rules ?? ['0.0.0.0/0'],
30
+ type: String(database.network?.type ?? 'PRIVATE'),
31
+ ingressRules: database.network?.ingress_rules?.map((rule) => String(rule)) ?? ['0.0.0.0/0'],
32
+ vpcId: database.network?.vpc_id ? String(database.network.vpc_id) : undefined,
33
+ subnetId: database.network?.subnet_id ? String(database.network.subnet_id) : undefined,
30
34
  },
31
35
  }));
32
36
  };
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseFunction = void 0;
4
4
  const lodash_1 = require("lodash");
5
+ const parseUtils_1 = require("./parseUtils");
5
6
  const parseFunction = (functions) => {
6
7
  if ((0, lodash_1.isEmpty)(functions)) {
7
8
  return undefined;
@@ -9,16 +10,28 @@ const parseFunction = (functions) => {
9
10
  return Object.entries(functions).map(([key, func]) => ({
10
11
  key,
11
12
  name: func.name,
12
- code: func.code,
13
- container: func.container,
14
- memory: func.memory,
13
+ code: func.code
14
+ ? {
15
+ runtime: String(func.code.runtime),
16
+ handler: func.code.handler,
17
+ path: func.code.path,
18
+ }
19
+ : undefined,
20
+ container: func.container
21
+ ? {
22
+ image: func.container.image,
23
+ cmd: func.container.cmd,
24
+ port: (0, parseUtils_1.parseNumberWithDefault)(func.container.port, 0),
25
+ }
26
+ : undefined,
27
+ memory: (0, parseUtils_1.parseNumber)(func.memory),
15
28
  gpu: func.gpu,
16
- timeout: func.timeout,
29
+ timeout: (0, parseUtils_1.parseNumber)(func.timeout),
17
30
  environment: func.environment,
18
- log: func.log,
31
+ log: (0, parseUtils_1.parseBoolean)(func.log),
19
32
  network: func.network,
20
33
  storage: {
21
- disk: func.storage?.disk,
34
+ disk: (0, parseUtils_1.parseNumber)(func.storage?.disk),
22
35
  nas: func.storage?.nas?.map((nasItem) => ({
23
36
  mount_path: nasItem.mount_path,
24
37
  storage_class: nasItem.storage_class,
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseOptionalString = exports.parseStringWithDefault = exports.parseNumberWithDefault = exports.parseNumber = exports.parseBooleanWithDefault = exports.parseBoolean = void 0;
4
+ /**
5
+ * Helper to convert Resolvable<boolean> to boolean
6
+ * @param value - The value that may be a boolean, string 'true'/'false', or undefined
7
+ * @param defaultValue - The default value to return if value is undefined or not parseable
8
+ */
9
+ const parseBoolean = (value, defaultValue) => {
10
+ if (typeof value === 'boolean') {
11
+ return value;
12
+ }
13
+ if (value === 'true') {
14
+ return true;
15
+ }
16
+ if (value === 'false') {
17
+ return false;
18
+ }
19
+ return defaultValue;
20
+ };
21
+ exports.parseBoolean = parseBoolean;
22
+ /**
23
+ * Helper to convert Resolvable<boolean> to boolean with a required default
24
+ * @param value - The value that may be a boolean, string 'true'/'false', or undefined
25
+ * @param defaultValue - The default value to return if value is undefined or not parseable
26
+ */
27
+ const parseBooleanWithDefault = (value, defaultValue) => {
28
+ const result = (0, exports.parseBoolean)(value, defaultValue);
29
+ return result ?? defaultValue;
30
+ };
31
+ exports.parseBooleanWithDefault = parseBooleanWithDefault;
32
+ /**
33
+ * Helper to convert Resolvable<number> to number
34
+ * @param value - The value that may be a number, string number, or undefined
35
+ * @param defaultValue - The default value to return if value is undefined or not parseable
36
+ */
37
+ const parseNumber = (value, defaultValue) => {
38
+ if (typeof value === 'number') {
39
+ return value;
40
+ }
41
+ if (typeof value === 'string') {
42
+ const parsed = Number(value);
43
+ return isNaN(parsed) ? defaultValue : parsed;
44
+ }
45
+ return defaultValue;
46
+ };
47
+ exports.parseNumber = parseNumber;
48
+ /**
49
+ * Helper to convert Resolvable<number> to number with a required default
50
+ * @param value - The value that may be a number, string number, or undefined
51
+ * @param defaultValue - The default value to return if value is undefined or not parseable
52
+ */
53
+ const parseNumberWithDefault = (value, defaultValue) => {
54
+ const result = (0, exports.parseNumber)(value, defaultValue);
55
+ return result ?? defaultValue;
56
+ };
57
+ exports.parseNumberWithDefault = parseNumberWithDefault;
58
+ /**
59
+ * Helper to convert Resolvable<string> to string with a default value
60
+ * @param value - The value that may be a string or undefined
61
+ * @param defaultValue - The default value to return if value is undefined
62
+ */
63
+ const parseStringWithDefault = (value, defaultValue) => {
64
+ return value ? String(value) : defaultValue;
65
+ };
66
+ exports.parseStringWithDefault = parseStringWithDefault;
67
+ /**
68
+ * Helper to safely convert Resolvable<string> to string | undefined
69
+ * @param value - The value that may be a string or undefined
70
+ */
71
+ const parseOptionalString = (value) => {
72
+ return value ? String(value) : undefined;
73
+ };
74
+ exports.parseOptionalString = parseOptionalString;
@@ -1,41 +1,43 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseTable = parseTable;
3
+ exports.parseTable = void 0;
4
4
  const lodash_1 = require("lodash");
5
- function parseTable(tablesRaw) {
5
+ const parseUtils_1 = require("./parseUtils");
6
+ const parseTable = (tablesRaw) => {
6
7
  if ((0, lodash_1.isEmpty)(tablesRaw)) {
7
8
  return undefined;
8
9
  }
9
10
  return Object.entries(tablesRaw)?.map(([key, table]) => {
10
11
  const throughput = (0, lodash_1.omitBy)({
11
12
  reserved: (0, lodash_1.omitBy)({
12
- read: table.throughput?.reserved?.read,
13
- write: table.throughput?.reserved?.write,
13
+ read: (0, parseUtils_1.parseNumber)(table.throughput?.reserved?.read),
14
+ write: (0, parseUtils_1.parseNumber)(table.throughput?.reserved?.write),
14
15
  }, lodash_1.isNil),
15
16
  onDemand: (0, lodash_1.omitBy)({
16
- read: table.throughput?.on_demand?.read,
17
- write: table.throughput?.on_demand?.write,
17
+ read: (0, parseUtils_1.parseNumber)(table.throughput?.on_demand?.read),
18
+ write: (0, parseUtils_1.parseNumber)(table.throughput?.on_demand?.write),
18
19
  }, lodash_1.isNil),
19
20
  }, lodash_1.isEmpty);
20
21
  return {
21
22
  key,
22
- collection: table.collection,
23
- name: table.name,
24
- type: table.type,
25
- desc: table.desc,
23
+ collection: String(table.collection),
24
+ name: String(table.name),
25
+ type: String(table.type),
26
+ desc: table.desc ? String(table.desc) : undefined,
26
27
  network: {
27
- type: table.network?.type ?? 'PRIVATE',
28
- ingressRules: table.network?.ingress_rules ?? [],
28
+ type: String(table.network?.type ?? 'PRIVATE'),
29
+ ingressRules: table.network?.ingress_rules?.map((rule) => String(rule)) ?? [],
29
30
  },
30
31
  throughput: !(0, lodash_1.isEmpty)(throughput) ? throughput : undefined,
31
32
  keySchema: table.key_schema?.map((keySchema) => ({
32
- name: keySchema.name,
33
- type: keySchema.type,
33
+ name: String(keySchema.name),
34
+ type: String(keySchema.type),
34
35
  })) ?? [],
35
36
  attributes: table.attributes?.map((attribute) => ({
36
- name: attribute.name,
37
- type: attribute.type,
37
+ name: String(attribute.name),
38
+ type: String(attribute.type),
38
39
  })) ?? [],
39
40
  };
40
41
  });
41
- }
42
+ };
43
+ exports.parseTable = parseTable;
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeApigwPlan = void 0;
4
+ const apigwResource_1 = require("./apigwResource");
5
+ const common_1 = require("../../common");
6
+ const stateManager_1 = require("../../common/stateManager");
7
+ const lang_1 = require("../../lang");
8
+ const executeSingleItem = async (context, item, eventsMap, serviceName, roleArn, currentState) => {
9
+ switch (item.action) {
10
+ case 'noop':
11
+ common_1.logger.info(`No changes for ${item.logicalId}`);
12
+ return null;
13
+ case 'create': {
14
+ const event = eventsMap.get(item.logicalId);
15
+ if (!event) {
16
+ throw new Error(`Event not found for logical ID: ${item.logicalId}`);
17
+ }
18
+ common_1.logger.info(`Creating API Gateway resources for: ${event.name}`);
19
+ const newState = await (0, apigwResource_1.createApigwResource)(context, event, serviceName, roleArn, currentState);
20
+ common_1.logger.info(`Successfully created API Gateway resources for: ${event.name}`);
21
+ return newState;
22
+ }
23
+ case 'update': {
24
+ const event = eventsMap.get(item.logicalId);
25
+ if (!event) {
26
+ throw new Error(`Event not found for logical ID: ${item.logicalId}`);
27
+ }
28
+ common_1.logger.info(`Updating API Gateway resources for: ${event.name}`);
29
+ const newState = await (0, apigwResource_1.updateApigwResource)(context, event, serviceName, roleArn, currentState);
30
+ common_1.logger.info(`Successfully updated API Gateway resources for: ${event.name}`);
31
+ return newState;
32
+ }
33
+ case 'delete': {
34
+ const state = (0, stateManager_1.getResource)(currentState, item.logicalId);
35
+ if (!state) {
36
+ common_1.logger.warn(`State not found for ${item.logicalId}, skipping deletion`);
37
+ return null;
38
+ }
39
+ common_1.logger.info(`Deleting API Gateway resources for: ${item.logicalId}`);
40
+ const newState = await (0, apigwResource_1.deleteApigwResource)(context, item.logicalId, currentState);
41
+ common_1.logger.info(`Successfully deleted API Gateway resources for: ${item.logicalId}`);
42
+ return newState;
43
+ }
44
+ default:
45
+ common_1.logger.warn(`Unknown action: ${item.action} for ${item.logicalId}`);
46
+ return null;
47
+ }
48
+ };
49
+ /**
50
+ * Execute API Gateway plan with partial failure support
51
+ */
52
+ const executeApigwPlan = async (context, plan, events, serviceName, roleArn, initialState, onStateChange) => {
53
+ const eventsMap = new Map(events?.map((e) => [`events.${e.key}`, e]) ?? []);
54
+ const successfulItems = [];
55
+ let currentState = initialState;
56
+ for (const item of plan.items) {
57
+ try {
58
+ const newState = await executeSingleItem(context, item, eventsMap, serviceName, roleArn, currentState);
59
+ if (newState !== null) {
60
+ currentState = newState;
61
+ successfulItems.push(item);
62
+ if (onStateChange) {
63
+ onStateChange(currentState);
64
+ common_1.logger.debug(lang_1.lang.__('STATE_PERSISTED_AFTER_OPERATION', {
65
+ action: item.action,
66
+ resourceId: item.logicalId,
67
+ }));
68
+ }
69
+ }
70
+ }
71
+ catch (error) {
72
+ return {
73
+ state: currentState,
74
+ partialFailure: {
75
+ failedItem: item,
76
+ error: error instanceof Error ? error : new Error(String(error)),
77
+ successfulItems,
78
+ },
79
+ };
80
+ }
81
+ }
82
+ return { state: currentState };
83
+ };
84
+ exports.executeApigwPlan = executeApigwPlan;