UNPKG

@geek-fun/serverlessinsight

Version:

Full life cycle cross providers serverless application management for your fast-growing business.

179 lines (178 loc) 7.18 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.cleanupAssets = exports.publishAssets = exports.constructAssets = exports.getAssets = void 0; const node_fs_1 = __importDefault(require("node:fs")); const ossDeployment = __importStar(require("@alicloud/ros-cdk-ossdeployment")); const node_path_1 = __importDefault(require("node:path")); const jszip_1 = __importDefault(require("jszip")); const logger_1 = require("./logger"); const lodash_1 = require("lodash"); const ali_oss_1 = __importDefault(require("ali-oss")); const context_1 = require("./context"); const buildAssets = (rootPath, relativePath) => { const location = node_path_1.default.resolve(rootPath, relativePath); if (!node_fs_1.default.existsSync(location)) { throw new Error(`Location: ${location} is not exists!`); } if (node_fs_1.default.lstatSync(location).isFile()) { return [ ossDeployment.Source.asset(location, {}, relativePath.substring(0, relativePath.lastIndexOf('/') + 1)), ]; } return node_fs_1.default .readdirSync(location) .map((file) => buildAssets(rootPath, `${relativePath}/${file}`.replace(/^\//, ''))) .flat(); }; const getAssets = (location) => { return buildAssets(location, ''); }; exports.getAssets = getAssets; const assembleFiles = (folder, zip) => { const files = node_fs_1.default.readdirSync(folder); files.forEach((file) => { const filePath = node_path_1.default.join(folder, file); if (node_fs_1.default.lstatSync(filePath).isFile()) { const content = node_fs_1.default.readFileSync(filePath); zip.file(file, content); } else { const subZip = zip.folder(file); if (subZip) { assembleFiles(filePath, subZip); } } }); }; const zipAssets = async (assetsPath) => { const zip = new jszip_1.default(); assembleFiles(assetsPath, zip); const zipPath = `${assetsPath.replace(/\/$/, '').trim()}.zip`; await zip .generateAsync({ type: 'nodebuffer' }) .then((content) => { node_fs_1.default.writeFileSync(zipPath, content); logger_1.logger.info(`Folder compressed to: ${zipPath}`); }) .catch((e) => { logger_1.logger.error(`Failed to compress folder: ${e}`); throw e; }); return zipPath; }; const constructAssets = async ({ files, rootPath, }) => { const { region } = (0, context_1.getContext)(); const assets = await Promise.all(Object.entries(files) .filter(([, fileItem]) => !fileItem.source.path.endsWith('.template.json')) .map(async ([, fileItem]) => { let sourcePath = `${rootPath}/${fileItem.source.path}`; if (fileItem.source.packaging === 'zip') { sourcePath = await zipAssets(`${rootPath}/${fileItem.source.path}`); } return { bucketName: (0, lodash_1.get)(fileItem, 'destinations.current_account-current_region.bucketName', '').replace('${ALIYUN::Region}', region), source: sourcePath, objectKey: (0, lodash_1.get)(fileItem, 'destinations.current_account-current_region.objectKey'), }; })); return !(0, lodash_1.isEmpty)(assets) ? assets : undefined; }; exports.constructAssets = constructAssets; const ensureBucketExits = async (bucketName, ossClient) => await ossClient.getBucketInfo(bucketName).catch((err) => { if (err.code === 'NoSuchBucket') { logger_1.logger.info(`Bucket: ${bucketName} not exists, creating...`); return ossClient.putBucket(bucketName, { storageClass: 'Standard', acl: 'private', dataRedundancyType: 'LRS', }); } else { throw err; } }); const publishAssets = async (assets) => { if (!assets?.length) { logger_1.logger.info('No assets to publish, skipped!'); return; } const context = (0, context_1.getContext)(); const bucketName = assets[0].bucketName; const client = new ali_oss_1.default({ region: `oss-${context.region}`, accessKeyId: context.accessKeyId, accessKeySecret: context.accessKeySecret, bucket: bucketName, timeout: 600000, // 10 minutes }); await ensureBucketExits(bucketName, client); const headers = { 'x-oss-storage-class': 'Standard', 'x-oss-object-acl': 'default', 'x-oss-forbid-overwrite': 'false', }; await Promise.all(assets.map(async ({ source, objectKey }) => { await client.put(objectKey, node_path_1.default.normalize(source), { headers }); logger_1.logger.debug(`Upload file: ${source} to bucket: ${bucketName} successfully!`); })); return bucketName; }; exports.publishAssets = publishAssets; const cleanupAssets = async (assets) => { if (!assets?.length) { logger_1.logger.info('No assets to cleanup, skipped!'); return; } const context = (0, context_1.getContext)(); const bucketName = assets[0].bucketName; const client = new ali_oss_1.default({ region: `oss-${context.region}`, accessKeyId: context.accessKeyId, accessKeySecret: context.accessKeySecret, bucket: bucketName, }); await Promise.all(assets.map(async ({ objectKey }) => { await client.delete(objectKey); logger_1.logger.debug(`Cleanup file: ${objectKey} from bucket: ${bucketName} successfully!`); })); // delete the bucket await client.deleteBucket(bucketName); logger_1.logger.debug(`Cleanup bucket: ${bucketName} successfully!`); }; exports.cleanupAssets = cleanupAssets;