@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,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeBucketPlan = void 0;
4
+ const ossResource_1 = require("./ossResource");
5
+ const common_1 = require("../../common");
6
+ const stateManager_1 = require("../../common/stateManager");
7
+ const lang_1 = require("../../lang");
8
+ const executeCreateAction = async (context, bucket, currentState) => {
9
+ common_1.logger.info(`Creating bucket: ${bucket.name}`);
10
+ const newState = await (0, ossResource_1.createBucketResource)(context, bucket, currentState);
11
+ common_1.logger.info(`Successfully created bucket: ${bucket.name}`);
12
+ return newState;
13
+ };
14
+ const executeUpdateAction = async (context, bucket, currentState) => {
15
+ common_1.logger.info(`Updating bucket: ${bucket.name}`);
16
+ const newState = await (0, ossResource_1.updateBucketResource)(context, bucket, currentState);
17
+ common_1.logger.info(`Successfully updated bucket: ${bucket.name}`);
18
+ return newState;
19
+ };
20
+ const executeDeleteAction = async (context, bucketName, logicalId, currentState) => {
21
+ common_1.logger.info(`Deleting bucket: ${bucketName}`);
22
+ const newState = await (0, ossResource_1.deleteBucketResource)(context, bucketName, logicalId, currentState);
23
+ common_1.logger.info(`Successfully deleted bucket: ${bucketName}`);
24
+ return newState;
25
+ };
26
+ const executeSingleItem = async (context, item, bucketsMap, currentState) => {
27
+ switch (item.action) {
28
+ case 'noop':
29
+ common_1.logger.info(`No changes for ${item.logicalId}`);
30
+ return null;
31
+ case 'create': {
32
+ const bucket = bucketsMap.get(item.logicalId);
33
+ if (!bucket) {
34
+ throw new Error(`Bucket not found for logical ID: ${item.logicalId}`);
35
+ }
36
+ return executeCreateAction(context, bucket, currentState);
37
+ }
38
+ case 'update': {
39
+ const bucket = bucketsMap.get(item.logicalId);
40
+ if (!bucket) {
41
+ throw new Error(`Bucket not found for logical ID: ${item.logicalId}`);
42
+ }
43
+ return executeUpdateAction(context, bucket, currentState);
44
+ }
45
+ case 'delete': {
46
+ const state = (0, stateManager_1.getResource)(currentState, item.logicalId);
47
+ if (!state) {
48
+ common_1.logger.warn(`State not found for ${item.logicalId}, skipping deletion`);
49
+ return null;
50
+ }
51
+ const bucketName = state.definition.bucketName;
52
+ return executeDeleteAction(context, bucketName, item.logicalId, currentState);
53
+ }
54
+ default:
55
+ common_1.logger.warn(`Unknown action: ${item.action} for ${item.logicalId}`);
56
+ return null;
57
+ }
58
+ };
59
+ const executeBucketPlan = async (context, plan, buckets, initialState, onStateChange) => {
60
+ const bucketsMap = new Map(buckets?.map((bucket) => [`buckets.${bucket.key}`, bucket]) ?? []);
61
+ const successfulItems = [];
62
+ let currentState = initialState;
63
+ for (const item of plan.items) {
64
+ try {
65
+ const newState = await executeSingleItem(context, item, bucketsMap, currentState);
66
+ if (newState !== null) {
67
+ currentState = newState;
68
+ successfulItems.push(item);
69
+ if (onStateChange) {
70
+ onStateChange(currentState);
71
+ common_1.logger.debug(lang_1.lang.__('STATE_PERSISTED_AFTER_OPERATION', {
72
+ action: item.action,
73
+ resourceId: item.logicalId,
74
+ }));
75
+ }
76
+ }
77
+ }
78
+ catch (error) {
79
+ return {
80
+ state: currentState,
81
+ partialFailure: {
82
+ failedItem: item,
83
+ error: error instanceof Error ? error : new Error(String(error)),
84
+ successfulItems,
85
+ },
86
+ };
87
+ }
88
+ }
89
+ return { state: currentState };
90
+ };
91
+ exports.executeBucketPlan = executeBucketPlan;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateBucketPlan = void 0;
4
+ const aliyunClient_1 = require("../../common/aliyunClient");
5
+ const ossTypes_1 = require("./ossTypes");
6
+ const stateManager_1 = require("../../common/stateManager");
7
+ const hashUtils_1 = require("../../common/hashUtils");
8
+ const planBucketDeletion = (logicalId, definition) => ({
9
+ logicalId,
10
+ action: 'delete',
11
+ resourceType: 'ALIYUN_OSS_BUCKET',
12
+ changes: { before: definition },
13
+ });
14
+ const generateBucketPlan = async (context, state, buckets) => {
15
+ if (!buckets || buckets.length === 0) {
16
+ const allStates = (0, stateManager_1.getAllResources)(state);
17
+ const items = Object.entries(allStates)
18
+ .filter(([logicalId]) => logicalId.startsWith('buckets.'))
19
+ .map(([logicalId, resourceState]) => planBucketDeletion(logicalId, resourceState.definition));
20
+ return { items };
21
+ }
22
+ const desiredLogicalIds = new Set(buckets.map((bucket) => `buckets.${bucket.key}`));
23
+ const bucketItems = await Promise.all(buckets.map(async (bucket) => {
24
+ const logicalId = `buckets.${bucket.key}`;
25
+ const currentState = (0, stateManager_1.getResource)(state, logicalId);
26
+ const config = (0, ossTypes_1.bucketToOssBucketConfig)(bucket);
27
+ const desiredDefinition = (0, ossTypes_1.extractOssBucketDefinition)(config);
28
+ if (!currentState) {
29
+ return {
30
+ logicalId,
31
+ action: 'create',
32
+ resourceType: 'ALIYUN_OSS_BUCKET',
33
+ changes: { after: desiredDefinition },
34
+ };
35
+ }
36
+ try {
37
+ const client = (0, aliyunClient_1.createAliyunClient)(context);
38
+ const remoteBucket = await client.oss.getBucket(bucket.name);
39
+ if (!remoteBucket) {
40
+ return {
41
+ logicalId,
42
+ action: 'create',
43
+ resourceType: 'ALIYUN_OSS_BUCKET',
44
+ changes: { before: currentState.definition, after: desiredDefinition },
45
+ drifted: true,
46
+ };
47
+ }
48
+ const currentDefinition = currentState.definition || {};
49
+ const definitionChanged = !(0, hashUtils_1.attributesEqual)(currentDefinition, desiredDefinition);
50
+ if (definitionChanged) {
51
+ return {
52
+ logicalId,
53
+ action: 'update',
54
+ resourceType: 'ALIYUN_OSS_BUCKET',
55
+ changes: { before: currentDefinition, after: desiredDefinition },
56
+ drifted: true,
57
+ };
58
+ }
59
+ return { logicalId, action: 'noop', resourceType: 'ALIYUN_OSS_BUCKET' };
60
+ }
61
+ catch {
62
+ return {
63
+ logicalId,
64
+ action: 'create',
65
+ resourceType: 'ALIYUN_OSS_BUCKET',
66
+ changes: { before: currentState.definition, after: desiredDefinition },
67
+ };
68
+ }
69
+ }));
70
+ const allStates = (0, stateManager_1.getAllResources)(state);
71
+ const deletionItems = Object.entries(allStates)
72
+ .filter(([logicalId]) => logicalId.startsWith('buckets.') && !desiredLogicalIds.has(logicalId))
73
+ .map(([logicalId, resourceState]) => planBucketDeletion(logicalId, resourceState.definition));
74
+ return { items: [...bucketItems, ...deletionItems] };
75
+ };
76
+ exports.generateBucketPlan = generateBucketPlan;
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.deleteBucketResource = exports.updateBucketResource = exports.readBucketResource = exports.createBucketResource = void 0;
7
+ const aliyunClient_1 = require("../../common/aliyunClient");
8
+ const common_1 = require("../../common");
9
+ const ossTypes_1 = require("./ossTypes");
10
+ const logger_1 = require("../../common/logger");
11
+ const lang_1 = require("../../lang");
12
+ const node_path_1 = __importDefault(require("node:path"));
13
+ const buildOssInstanceFromProvider = (info, arn) => {
14
+ return {
15
+ type: 'ALIYUN_OSS_BUCKET',
16
+ arn,
17
+ id: info.name,
18
+ bucketName: info.name,
19
+ location: info.location ?? null,
20
+ creationDate: info.creationDate ?? null,
21
+ storageClass: info.storageClass ?? null,
22
+ dataRedundancyType: info.dataRedundancyType ?? null,
23
+ resourceGroupId: info.resourceGroupId ?? null,
24
+ comment: info.comment ?? null,
25
+ owner: info.owner
26
+ ? {
27
+ id: info.owner.id ?? null,
28
+ displayName: info.owner.displayName ?? null,
29
+ }
30
+ : undefined,
31
+ blockPublicAccess: info.blockPublicAccess ?? null,
32
+ accessMonitorStatus: info.accessMonitorStatus ?? null,
33
+ acl: info.acl ?? null,
34
+ websiteConfig: info.websiteConfig
35
+ ? {
36
+ indexDocument: info.websiteConfig.indexDocument ?? null,
37
+ errorDocument: info.websiteConfig.errorDocument ?? null,
38
+ }
39
+ : undefined,
40
+ loggingConfig: info.loggingConfig
41
+ ? {
42
+ targetBucket: info.loggingConfig.targetBucket ?? null,
43
+ targetPrefix: info.loggingConfig.targetPrefix ?? null,
44
+ }
45
+ : undefined,
46
+ corsRules: info.corsRules?.map((rule) => ({
47
+ id: rule.id ?? null,
48
+ allowedOrigins: rule.allowedOrigins ?? [],
49
+ allowedMethods: rule.allowedMethods ?? [],
50
+ allowedHeaders: rule.allowedHeaders ?? [],
51
+ exposeHeaders: rule.exposeHeaders ?? [],
52
+ maxAgeSeconds: rule.maxAgeSeconds ?? null,
53
+ })),
54
+ lifecycleRules: info.lifecycleRules?.map((rule) => ({
55
+ id: rule.id ?? null,
56
+ status: rule.status ?? null,
57
+ prefix: rule.prefix ?? null,
58
+ expiration: rule.expiration
59
+ ? {
60
+ days: rule.expiration.days ?? null,
61
+ date: rule.expiration.date ?? null,
62
+ expiredObjectDeleteMarker: rule.expiration.expiredObjectDeleteMarker ?? null,
63
+ }
64
+ : undefined,
65
+ transition: rule.transition
66
+ ? {
67
+ days: rule.transition.days ?? null,
68
+ date: rule.transition.date ?? null,
69
+ storageClass: rule.transition.storageClass ?? null,
70
+ }
71
+ : undefined,
72
+ })),
73
+ versioningStatus: info.versioningConfig?.status ?? null,
74
+ encryptionConfig: info.encryptionConfig
75
+ ? {
76
+ sseAlgorithm: info.encryptionConfig.sseAlgorithm ?? null,
77
+ kmsMasterKeyId: info.encryptionConfig.kmsMasterKeyId ?? null,
78
+ kmsDataEncryption: info.encryptionConfig.kmsDataEncryption ?? null,
79
+ }
80
+ : undefined,
81
+ transferAccelerationStatus: info.transferAccelerationStatus ?? null,
82
+ replicationRules: info.replicationRules?.map((rule) => ({
83
+ id: rule.id ?? null,
84
+ status: rule.status ?? null,
85
+ prefix: rule.prefix ?? null,
86
+ destination: rule.destination
87
+ ? {
88
+ bucket: rule.destination.bucket ?? null,
89
+ storageClass: rule.destination.storageClass ?? null,
90
+ }
91
+ : undefined,
92
+ })),
93
+ tags: info.tags?.map((tag) => ({
94
+ key: tag.key ?? null,
95
+ value: tag.value ?? null,
96
+ })),
97
+ };
98
+ };
99
+ const createBucketResource = async (context, bucket, state) => {
100
+ const config = (0, ossTypes_1.bucketToOssBucketConfig)(bucket);
101
+ const client = (0, aliyunClient_1.createAliyunClient)(context);
102
+ await client.oss.createBucket({
103
+ bucketName: config.bucketName,
104
+ acl: config.acl,
105
+ websiteConfig: config.websiteConfig,
106
+ storageClass: config.storageClass,
107
+ });
108
+ // Refresh state from provider to get bucket info
109
+ let bucketInfo = await client.oss.getBucket(config.bucketName);
110
+ if (!bucketInfo) {
111
+ throw new Error(`Failed to refresh state for bucket: ${config.bucketName}`);
112
+ }
113
+ const definition = (0, ossTypes_1.extractOssBucketDefinition)(config);
114
+ const arn = `arn:acs:oss:${context.region}:${context.accountId}:${config.bucketName}`;
115
+ const logicalId = `buckets.${bucket.key}`;
116
+ // Save state immediately after bucket creation, before file upload
117
+ const partialResourceState = {
118
+ mode: 'managed',
119
+ region: context.region,
120
+ definition,
121
+ instances: [buildOssInstanceFromProvider(bucketInfo, arn)],
122
+ lastUpdated: new Date().toISOString(),
123
+ };
124
+ state = (0, common_1.setResource)(state, logicalId, partialResourceState);
125
+ // Upload static files if code path is specified
126
+ if (bucket.website?.code) {
127
+ try {
128
+ const codePath = node_path_1.default.resolve(process.cwd(), bucket.website.code);
129
+ await client.oss.uploadFiles(config.bucketName, codePath);
130
+ // Refresh state after upload to get updated info
131
+ bucketInfo = await client.oss.getBucket(config.bucketName);
132
+ if (bucketInfo) {
133
+ const updatedResourceState = {
134
+ mode: 'managed',
135
+ region: context.region,
136
+ definition,
137
+ instances: [buildOssInstanceFromProvider(bucketInfo, arn)],
138
+ lastUpdated: new Date().toISOString(),
139
+ };
140
+ return (0, common_1.setResource)(state, logicalId, updatedResourceState);
141
+ }
142
+ }
143
+ catch (error) {
144
+ logger_1.logger.error(`Failed to upload files to bucket, but bucket was created and saved to state: ${error}`);
145
+ logger_1.logger.info(lang_1.lang.__('OSS_BUCKET_TRACKED_CAN_RETRY'));
146
+ return state;
147
+ }
148
+ }
149
+ return state;
150
+ };
151
+ exports.createBucketResource = createBucketResource;
152
+ const readBucketResource = async (context, bucketName) => {
153
+ const client = (0, aliyunClient_1.createAliyunClient)(context);
154
+ return await client.oss.getBucket(bucketName);
155
+ };
156
+ exports.readBucketResource = readBucketResource;
157
+ const updateBucketResource = async (context, bucket, state) => {
158
+ const config = (0, ossTypes_1.bucketToOssBucketConfig)(bucket);
159
+ const client = (0, aliyunClient_1.createAliyunClient)(context);
160
+ // Update ACL if specified
161
+ if (config.acl) {
162
+ await client.oss.updateBucketAcl(config.bucketName, config.acl);
163
+ }
164
+ // Update website configuration if specified
165
+ if (config.websiteConfig) {
166
+ await client.oss.updateBucketWebsite(config.bucketName, config.websiteConfig);
167
+ }
168
+ // Upload static files if code path is specified
169
+ if (bucket.website?.code) {
170
+ const codePath = node_path_1.default.resolve(process.cwd(), bucket.website.code);
171
+ await client.oss.uploadFiles(config.bucketName, codePath);
172
+ }
173
+ // Refresh state from provider to get all attributes
174
+ const bucketInfo = await client.oss.getBucket(config.bucketName);
175
+ if (!bucketInfo) {
176
+ throw new Error(`Failed to refresh state for bucket: ${config.bucketName}`);
177
+ }
178
+ const definition = (0, ossTypes_1.extractOssBucketDefinition)(config);
179
+ const arn = `arn:acs:oss:${context.region}:${context.accountId}:${config.bucketName}`;
180
+ const resourceState = {
181
+ mode: 'managed',
182
+ region: context.region,
183
+ definition,
184
+ instances: [buildOssInstanceFromProvider(bucketInfo, arn)],
185
+ lastUpdated: new Date().toISOString(),
186
+ };
187
+ const logicalId = `buckets.${bucket.key}`;
188
+ return (0, common_1.setResource)(state, logicalId, resourceState);
189
+ };
190
+ exports.updateBucketResource = updateBucketResource;
191
+ const deleteBucketResource = async (context, bucketName, logicalId, state) => {
192
+ const client = (0, aliyunClient_1.createAliyunClient)(context);
193
+ await client.oss.deleteBucket(bucketName);
194
+ return (0, common_1.removeResource)(state, logicalId);
195
+ };
196
+ exports.deleteBucketResource = deleteBucketResource;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractOssBucketDefinition = exports.bucketToOssBucketConfig = void 0;
4
+ const types_1 = require("../../types");
5
+ const bucketTypes_1 = require("../bucketTypes");
6
+ // Map from domain enum to provider ACL type
7
+ const aclMap = {
8
+ [types_1.BucketAccessEnum.PRIVATE]: bucketTypes_1.BucketACL.PRIVATE,
9
+ [types_1.BucketAccessEnum.PUBLIC_READ]: bucketTypes_1.BucketACL.PUBLIC_READ,
10
+ [types_1.BucketAccessEnum.PUBLIC_READ_WRITE]: bucketTypes_1.BucketACL.PUBLIC_READ_WRITE,
11
+ };
12
+ const bucketToOssBucketConfig = (bucket) => {
13
+ const config = {
14
+ bucketName: bucket.name,
15
+ };
16
+ if (bucket.security?.acl) {
17
+ config.acl = aclMap[bucket.security.acl];
18
+ }
19
+ if (bucket.website) {
20
+ config.websiteConfig = {
21
+ indexDocument: bucket.website.index,
22
+ };
23
+ if (bucket.website.error_page) {
24
+ config.websiteConfig.errorDocument = bucket.website.error_page;
25
+ }
26
+ }
27
+ if (bucket.storage?.class) {
28
+ config.storageClass = bucket.storage.class;
29
+ }
30
+ if (bucket.website?.domain) {
31
+ config.domain = bucket.website.domain;
32
+ }
33
+ return config;
34
+ };
35
+ exports.bucketToOssBucketConfig = bucketToOssBucketConfig;
36
+ const extractOssBucketDefinition = (config) => {
37
+ return {
38
+ bucketName: config.bucketName,
39
+ acl: config.acl ?? null,
40
+ websiteConfiguration: config.websiteConfig
41
+ ? {
42
+ indexDocument: config.websiteConfig.indexDocument,
43
+ errorDocument: config.websiteConfig.errorDocument ?? null,
44
+ }
45
+ : {},
46
+ storageClass: config.storageClass ?? null,
47
+ domain: config.domain ?? null,
48
+ };
49
+ };
50
+ exports.extractOssBucketDefinition = extractOssBucketDefinition;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateAliyunPlan = void 0;
4
+ const common_1 = require("../../common");
5
+ const lang_1 = require("../../lang");
6
+ const fc3Planner_1 = require("./fc3Planner");
7
+ const ossPlanner_1 = require("./ossPlanner");
8
+ const databasePlanner_1 = require("./databasePlanner");
9
+ const tablestorePlanner_1 = require("./tablestorePlanner");
10
+ const apigwPlanner_1 = require("./apigwPlanner");
11
+ const generateAliyunPlan = async (iac) => {
12
+ const context = (0, common_1.getContext)();
13
+ const state = (0, common_1.loadState)(iac.provider.name, process.cwd());
14
+ const functionPlan = await (0, fc3Planner_1.generateFunctionPlan)(context, state, iac.functions);
15
+ const bucketPlan = await (0, ossPlanner_1.generateBucketPlan)(context, state, iac.buckets);
16
+ const databasePlan = await (0, databasePlanner_1.generateDatabasePlan)(context, state, iac.databases);
17
+ const tablePlan = await (0, tablestorePlanner_1.generateTablePlan)(context, state, iac.tables);
18
+ const eventPlan = await (0, apigwPlanner_1.generateApigwPlan)(context, state, iac.events, iac.service);
19
+ const allItems = [
20
+ ...functionPlan.items,
21
+ ...bucketPlan.items,
22
+ ...databasePlan.items,
23
+ ...tablePlan.items,
24
+ ...eventPlan.items,
25
+ ];
26
+ const dependencyInfo = (0, common_1.getDependencyInfo)(allItems);
27
+ if (dependencyInfo.cycleError) {
28
+ throw new Error(`${lang_1.lang.__('CYCLE_DETECTED')}: ${dependencyInfo.cycleError.cycle.join(' -> ')}`);
29
+ }
30
+ return {
31
+ items: dependencyInfo.order,
32
+ levels: dependencyInfo.levels,
33
+ graph: dependencyInfo.graph,
34
+ dotGraph: (0, common_1.toDotFormat)(dependencyInfo.graph),
35
+ };
36
+ };
37
+ exports.generateAliyunPlan = generateAliyunPlan;
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractRdsDefinition = exports.databaseToRdsConfig = void 0;
4
+ // Map database versions to RDS engine versions
5
+ const rdsEngineMap = new Map([
6
+ [
7
+ `${"RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */}-${"MYSQL_5.7" /* DatabaseVersionEnum['MYSQL_5.7'] */}`,
8
+ {
9
+ engine: 'MySQL',
10
+ version: '5.7',
11
+ category: 'serverless_basic',
12
+ dbInstanceClass: 'mysql.n2.serverless.1c',
13
+ quota: { minCapacity: 0.5, maxCapacity: 32, ha: false },
14
+ storage: { type: 'general_essd', bursting: true },
15
+ },
16
+ ],
17
+ [
18
+ `${"RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */}-${"MYSQL_8.0" /* DatabaseVersionEnum['MYSQL_8.0'] */}`,
19
+ {
20
+ engine: 'MySQL',
21
+ version: '8.0',
22
+ category: 'serverless_basic',
23
+ dbInstanceClass: 'mysql.n2.serverless.1c',
24
+ quota: { minCapacity: 0.5, maxCapacity: 32, ha: false },
25
+ storage: { type: 'general_essd', bursting: true },
26
+ },
27
+ ],
28
+ [
29
+ `${"RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */}-${"MYSQL_HA_5.7" /* DatabaseVersionEnum['MYSQL_HA_5.7'] */}`,
30
+ {
31
+ engine: 'MySQL',
32
+ version: '5.7',
33
+ category: 'serverless_standard',
34
+ dbInstanceClass: 'mysql.n2.serverless.2c',
35
+ quota: { minCapacity: 0.5, maxCapacity: 32, ha: true },
36
+ storage: { type: 'general_essd', bursting: true },
37
+ },
38
+ ],
39
+ [
40
+ `${"RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */}-${"MYSQL_HA_8.0" /* DatabaseVersionEnum['MYSQL_HA_8.0'] */}`,
41
+ {
42
+ engine: 'MySQL',
43
+ version: '8.0',
44
+ category: 'serverless_standard',
45
+ dbInstanceClass: 'mysql.n2.serverless.2c',
46
+ quota: { minCapacity: 0.5, maxCapacity: 32, ha: true },
47
+ storage: { type: 'general_essd', bursting: true },
48
+ },
49
+ ],
50
+ [
51
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_14" /* DatabaseVersionEnum.PGSQL_14 */}`,
52
+ {
53
+ engine: 'PostgreSQL',
54
+ version: '14.0',
55
+ category: 'serverless_basic',
56
+ dbInstanceClass: 'pg.n2.serverless.1c',
57
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: false },
58
+ storage: { type: 'general_essd', bursting: true },
59
+ },
60
+ ],
61
+ [
62
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_15" /* DatabaseVersionEnum.PGSQL_15 */}`,
63
+ {
64
+ engine: 'PostgreSQL',
65
+ version: '15.0',
66
+ category: 'serverless_basic',
67
+ dbInstanceClass: 'pg.n2.serverless.1c',
68
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: false },
69
+ storage: { type: 'general_essd', bursting: true },
70
+ },
71
+ ],
72
+ [
73
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_16" /* DatabaseVersionEnum.PGSQL_16 */}`,
74
+ {
75
+ engine: 'PostgreSQL',
76
+ version: '16.0',
77
+ category: 'serverless_basic',
78
+ dbInstanceClass: 'pg.n2.serverless.1c',
79
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: false },
80
+ storage: { type: 'general_essd', bursting: true },
81
+ },
82
+ ],
83
+ [
84
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_HA_14" /* DatabaseVersionEnum.PGSQL_HA_14 */}`,
85
+ {
86
+ engine: 'PostgreSQL',
87
+ version: '14.0',
88
+ category: 'serverless_standard',
89
+ dbInstanceClass: 'pg.n2.serverless.2c',
90
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: true },
91
+ storage: { type: 'general_essd', bursting: true },
92
+ },
93
+ ],
94
+ [
95
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_HA_15" /* DatabaseVersionEnum.PGSQL_HA_15 */}`,
96
+ {
97
+ engine: 'PostgreSQL',
98
+ version: '15.0',
99
+ category: 'serverless_standard',
100
+ dbInstanceClass: 'pg.n2.serverless.2c',
101
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: true },
102
+ storage: { type: 'general_essd', bursting: true },
103
+ },
104
+ ],
105
+ [
106
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_HA_16" /* DatabaseVersionEnum.PGSQL_HA_16 */}`,
107
+ {
108
+ engine: 'PostgreSQL',
109
+ version: '16.0',
110
+ category: 'serverless_standard',
111
+ dbInstanceClass: 'pg.n2.serverless.2c',
112
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: true },
113
+ storage: { type: 'general_essd', bursting: true },
114
+ },
115
+ ],
116
+ [
117
+ `${"RDS_MSSQL_SERVERLESS" /* DatabaseEnum.RDS_MSSQL_SERVERLESS */}-${"MSSQL_HA_2016" /* DatabaseVersionEnum.MSSQL_HA_2016 */}`,
118
+ {
119
+ engine: 'SQLServer',
120
+ version: '2016_std_sl',
121
+ category: 'serverless_ha',
122
+ dbInstanceClass: 'mssql.mem2.serverless.s2',
123
+ quota: { minCapacity: 2, maxCapacity: 8, ha: true },
124
+ storage: { type: 'cloud_essd', bursting: false },
125
+ },
126
+ ],
127
+ [
128
+ `${"RDS_MSSQL_SERVERLESS" /* DatabaseEnum.RDS_MSSQL_SERVERLESS */}-${"MSSQL_HA_2017" /* DatabaseVersionEnum.MSSQL_HA_2017 */}`,
129
+ {
130
+ engine: 'SQLServer',
131
+ version: '2017_std_sl',
132
+ category: 'serverless_ha',
133
+ dbInstanceClass: 'mssql.mem2.serverless.s2',
134
+ quota: { minCapacity: 2, maxCapacity: 8, ha: true },
135
+ storage: { type: 'cloud_essd', bursting: false },
136
+ },
137
+ ],
138
+ [
139
+ `${"RDS_MSSQL_SERVERLESS" /* DatabaseEnum.RDS_MSSQL_SERVERLESS */}-${"MSSQL_HA_2019" /* DatabaseVersionEnum.MSSQL_HA_2019 */}`,
140
+ {
141
+ engine: 'SQLServer',
142
+ version: '2019_std_sl',
143
+ category: 'serverless_ha',
144
+ dbInstanceClass: 'mssql.mem2.serverless.s2',
145
+ quota: { minCapacity: 2, maxCapacity: 8, ha: true },
146
+ storage: { type: 'cloud_essd', bursting: false },
147
+ },
148
+ ],
149
+ ]);
150
+ const databaseToRdsConfig = (database) => {
151
+ const engineConfig = rdsEngineMap.get(`${database.type}-${database.version}`);
152
+ if (!engineConfig) {
153
+ throw new Error(`Unsupported RDS database type/version: ${database.type}-${database.version}`);
154
+ }
155
+ const { engine, version, category, dbInstanceClass, quota, storage } = engineConfig;
156
+ const config = {
157
+ dbInstanceDescription: database.name,
158
+ engine: engine,
159
+ engineVersion: version,
160
+ dbInstanceClass: dbInstanceClass,
161
+ dbInstanceStorage: database.storage.min,
162
+ category: category,
163
+ dbInstanceStorageType: storage.type,
164
+ burstingEnabled: storage.bursting,
165
+ serverlessConfig: {
166
+ minCapacity: database.cu.min === 0 ? quota.minCapacity : database.cu.min + quota.minCapacity,
167
+ maxCapacity: database.cu.max + quota.minCapacity <= quota.maxCapacity
168
+ ? database.cu.max + quota.minCapacity
169
+ : quota.maxCapacity,
170
+ autoPause: database.cu.min === 0,
171
+ switchForce: false,
172
+ },
173
+ masterUsername: database.security.basicAuth.username,
174
+ masterUserPassword: database.security.basicAuth.password,
175
+ masterUserType: 'Super',
176
+ multiAZ: quota.ha,
177
+ securityIPList: database.network.ingressRules.join(','),
178
+ connectionStringType: database.network.type === 'PRIVATE' ? 'Inner' : 'Public',
179
+ dbInstanceNetType: database.network.type === 'PRIVATE' ? 'Intranet' : 'Internet',
180
+ };
181
+ // Add VPC configuration if provided
182
+ if (database.network.vpcId) {
183
+ config.vpcId = database.network.vpcId;
184
+ }
185
+ if (database.network.subnetId) {
186
+ config.vSwitchId = database.network.subnetId;
187
+ }
188
+ return config;
189
+ };
190
+ exports.databaseToRdsConfig = databaseToRdsConfig;
191
+ const extractRdsDefinition = (config) => {
192
+ return {
193
+ dbInstanceDescription: config.dbInstanceDescription,
194
+ engine: config.engine,
195
+ engineVersion: config.engineVersion,
196
+ dbInstanceClass: config.dbInstanceClass,
197
+ dbInstanceStorage: config.dbInstanceStorage,
198
+ category: config.category,
199
+ dbInstanceStorageType: config.dbInstanceStorageType,
200
+ burstingEnabled: config.burstingEnabled ?? null,
201
+ serverlessConfig: config.serverlessConfig
202
+ ? {
203
+ minCapacity: config.serverlessConfig.minCapacity,
204
+ maxCapacity: config.serverlessConfig.maxCapacity,
205
+ autoPause: config.serverlessConfig.autoPause,
206
+ switchForce: config.serverlessConfig.switchForce,
207
+ }
208
+ : null,
209
+ multiAZ: config.multiAZ ?? null,
210
+ securityIPList: config.securityIPList ?? null,
211
+ connectionStringType: config.connectionStringType ?? null,
212
+ dbInstanceNetType: config.dbInstanceNetType ?? null,
213
+ vpcId: config.vpcId ?? null,
214
+ vSwitchId: config.vSwitchId ?? null,
215
+ };
216
+ };
217
+ exports.extractRdsDefinition = extractRdsDefinition;