@geek-fun/serverlessinsight 0.3.3 → 0.4.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.
@@ -0,0 +1,111 @@
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.stopLocal = exports.servLocal = void 0;
7
+ const localStack_1 = require("../../types/localStack");
8
+ const common_1 = require("../../common");
9
+ const node_http_1 = __importDefault(require("node:http"));
10
+ let localServer;
11
+ const cleanPathSegments = (pathname) => pathname
12
+ .split('/')
13
+ .map((segment) => segment.trim())
14
+ .filter((segment) => segment.length > 0);
15
+ const respondJson = (res, status, body, headers = {}) => {
16
+ res.writeHead(status, { 'Content-Type': 'application/json', ...headers });
17
+ res.end(JSON.stringify(body));
18
+ };
19
+ const respondRaw = (res, status, body, headers = {}) => {
20
+ res.writeHead(status, headers);
21
+ res.end(body);
22
+ };
23
+ const parseRequest = (req) => {
24
+ const url = new URL(req.url ?? '/', 'http://localhost');
25
+ const [routeSegment, identifierSegment, ...rest] = cleanPathSegments(url.pathname);
26
+ if (!routeSegment) {
27
+ return undefined;
28
+ }
29
+ const kindKey = routeSegment.toUpperCase();
30
+ const kind = localStack_1.RouteKind[kindKey];
31
+ if (!kind) {
32
+ return undefined;
33
+ }
34
+ const subPath = rest.length > 0 ? `/${rest.join('/')}` : '/';
35
+ return {
36
+ kind,
37
+ identifier: identifierSegment,
38
+ url: subPath,
39
+ method: req.method ?? 'GET',
40
+ query: Object.fromEntries(url.searchParams.entries()),
41
+ rawUrl: url.pathname,
42
+ };
43
+ };
44
+ const servLocal = async (handlers, iac) => {
45
+ if (localServer) {
46
+ common_1.logger.info(`localServer already running on http://localhost:${common_1.SI_LOCALSTACK_SERVER_PORT}`);
47
+ return;
48
+ }
49
+ localServer = node_http_1.default.createServer(async (req, res) => {
50
+ try {
51
+ const parsed = parseRequest(req);
52
+ if (!parsed) {
53
+ respondJson(res, 404, { error: 'Route not found' });
54
+ return;
55
+ }
56
+ const route = handlers.find((h) => h.kind === parsed.kind);
57
+ if (!route) {
58
+ respondJson(res, 404, { error: `Handler for ${parsed.kind} not registered` });
59
+ return;
60
+ }
61
+ const outcome = await route.handler(req, parsed, iac);
62
+ if (!outcome) {
63
+ respondJson(res, 204, {});
64
+ return;
65
+ }
66
+ // Raw responses (e.g., from bucket handler) include both Content-Type and Content-Length headers
67
+ // and the body is already formatted as a string (not a JSON object)
68
+ const isRawResponse = typeof outcome.body === 'string' &&
69
+ outcome.headers?.['Content-Type'] &&
70
+ outcome.headers?.['Content-Length'];
71
+ if (isRawResponse) {
72
+ respondRaw(res, outcome.statusCode, outcome.body, outcome.headers);
73
+ }
74
+ else {
75
+ respondJson(res, outcome.statusCode, outcome.body ?? {}, outcome.headers);
76
+ }
77
+ }
78
+ catch (err) {
79
+ common_1.logger.error({ err }, 'Local gateway error');
80
+ respondJson(res, 500, { error: 'Local gateway failure' });
81
+ }
82
+ });
83
+ await new Promise((resolve, reject) => {
84
+ localServer.listen(common_1.SI_LOCALSTACK_SERVER_PORT, '0.0.0.0', () => {
85
+ common_1.logger.info(`Local Server listening on http://localhost:${common_1.SI_LOCALSTACK_SERVER_PORT}`);
86
+ resolve();
87
+ });
88
+ localServer.once('error', reject);
89
+ });
90
+ };
91
+ exports.servLocal = servLocal;
92
+ const stopLocal = async () => {
93
+ if (!localServer) {
94
+ common_1.logger.info('localServer is not running');
95
+ return;
96
+ }
97
+ await new Promise((resolve, reject) => {
98
+ localServer.close((err) => {
99
+ if (err) {
100
+ common_1.logger.error({ err }, 'Error stopping localServer');
101
+ reject(err);
102
+ }
103
+ else {
104
+ localServer = undefined;
105
+ common_1.logger.info('localServer stopped');
106
+ resolve();
107
+ }
108
+ });
109
+ });
110
+ };
111
+ exports.stopLocal = stopLocal;
@@ -0,0 +1,36 @@
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.extractZipFile = void 0;
7
+ const jszip_1 = __importDefault(require("jszip"));
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const node_os_1 = __importDefault(require("node:os"));
11
+ const extractZipFile = async (zipPath) => {
12
+ const zipData = node_fs_1.default.readFileSync(zipPath);
13
+ const zip = await jszip_1.default.loadAsync(zipData);
14
+ const tempDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'si-function-'));
15
+ for (const [relativePath, file] of Object.entries(zip.files)) {
16
+ if (file.dir) {
17
+ node_fs_1.default.mkdirSync(node_path_1.default.join(tempDir, relativePath), { recursive: true });
18
+ }
19
+ else {
20
+ const content = await file.async('nodebuffer');
21
+ const filePath = node_path_1.default.join(tempDir, relativePath);
22
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(filePath), { recursive: true });
23
+ node_fs_1.default.writeFileSync(filePath, content);
24
+ }
25
+ }
26
+ // Check if there's a single root directory in the zip
27
+ const entries = node_fs_1.default.readdirSync(tempDir);
28
+ if (entries.length === 1) {
29
+ const singleEntry = node_path_1.default.join(tempDir, entries[0]);
30
+ if (node_fs_1.default.statSync(singleEntry).isDirectory()) {
31
+ return singleEntry;
32
+ }
33
+ }
34
+ return tempDir;
35
+ };
36
+ exports.extractZipFile = extractZipFile;
@@ -33,9 +33,7 @@ const getBootstrapTemplate = async (context) => {
33
33
  Description: 'ServerlessInsight Bootstrap API',
34
34
  Handler: 'index.handler',
35
35
  Runtime: 'nodejs20',
36
- Layers: [
37
- `acs:fc:${context.region}:${context.accountId}:layers/si-bootstrap-sdk/versions/18`,
38
- ],
36
+ Layers: [`acs:fc:${context.region}:1990893136649406:layers/si-bootstrap-sdk/versions/18`],
39
37
  Code: {
40
38
  SourceCode: `
41
39
  const { bootstrapHandler } = require('@geek-fun/si-bootstrap-sdk');
@@ -0,0 +1,81 @@
1
+ import { IncomingMessage } from 'node:http';
2
+ import { ServerlessIac } from '../index';
3
+ export declare enum RouteKind {
4
+ SI_FUNCTIONS = "SI_FUNCTIONS",
5
+ SI_BUCKETS = "SI_BUCKETS",
6
+ SI_WEBSITE_BUCKETS = "SI_WEBSITE_BUCKETS",
7
+ SI_EVENTS = "SI_EVENTS"
8
+ }
9
+ export type ParsedRequest = {
10
+ kind: RouteKind;
11
+ identifier: string;
12
+ url: string;
13
+ method: string;
14
+ query: Record<string, string>;
15
+ rawUrl: string;
16
+ };
17
+ export type RouteResponse = {
18
+ statusCode: number;
19
+ headers?: Record<string, string>;
20
+ body?: unknown;
21
+ };
22
+ export type RouteHandler = (req: IncomingMessage, parsed: ParsedRequest, iac: ServerlessIac) => Promise<RouteResponse | void> | RouteResponse | void;
23
+ export type FunctionOptions = {
24
+ codeDir: string;
25
+ functionKey: string;
26
+ handler: string;
27
+ servicePath: string;
28
+ timeout: number;
29
+ };
30
+ export type AliyunApiGatewayContext = {
31
+ requestId: string;
32
+ region: string;
33
+ accountId: string;
34
+ credentials: {
35
+ accessKeyId: string;
36
+ accessKeySecret: string;
37
+ securityToken: string;
38
+ };
39
+ function: {
40
+ name: string;
41
+ handler: string;
42
+ memory: number;
43
+ timeout: number;
44
+ initializer: string;
45
+ };
46
+ service: {
47
+ name: string;
48
+ logProject: string;
49
+ logStore: string;
50
+ qualifier: string;
51
+ versionId: string;
52
+ };
53
+ tracing: {
54
+ spanContext: string;
55
+ jaegerEndpoint: string;
56
+ spanBaggages: Record<string, string>;
57
+ parseOpenTracingBaggages: () => Record<string, string>;
58
+ };
59
+ logger: {
60
+ debug: (message: string) => void;
61
+ info: (message: string) => void;
62
+ warn: (message: string) => void;
63
+ error: (message: string) => void;
64
+ log: (message: string) => void;
65
+ };
66
+ };
67
+ export type AliyunServerlessEvent = {
68
+ path: string;
69
+ httpMethod: string;
70
+ headers: Record<string, string>;
71
+ queryParameters: Record<string, string>;
72
+ pathParameters: Record<string, string>;
73
+ body: string | undefined;
74
+ isBase64Encoded: boolean;
75
+ };
76
+ export type AliyunFCResponse = {
77
+ isBase64Encoded: boolean;
78
+ statusCode: string | number;
79
+ headers?: Record<string, string>;
80
+ body: string | unknown;
81
+ };
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RouteKind = void 0;
4
+ var RouteKind;
5
+ (function (RouteKind) {
6
+ RouteKind["SI_FUNCTIONS"] = "SI_FUNCTIONS";
7
+ RouteKind["SI_BUCKETS"] = "SI_BUCKETS";
8
+ RouteKind["SI_WEBSITE_BUCKETS"] = "SI_WEBSITE_BUCKETS";
9
+ RouteKind["SI_EVENTS"] = "SI_EVENTS";
10
+ })(RouteKind || (exports.RouteKind = RouteKind = {}));
@@ -1 +1 @@
1
- {"root":["../src/index.ts","../src/commands/deploy.ts","../src/commands/destroy.ts","../src/commands/index.ts","../src/commands/local.ts","../src/commands/template.ts","../src/commands/validate.ts","../src/common/base64.ts","../src/common/constants.ts","../src/common/context.ts","../src/common/domainHelper.ts","../src/common/getVersion.ts","../src/common/iacHelper.ts","../src/common/imsClient.ts","../src/common/index.ts","../src/common/logger.ts","../src/common/providerEnum.ts","../src/common/rosAssets.ts","../src/common/rosClient.ts","../src/lang/index.ts","../src/parser/bucketParser.ts","../src/parser/databaseParser.ts","../src/parser/eventParser.ts","../src/parser/functionParser.ts","../src/parser/index.ts","../src/parser/tableParser.ts","../src/parser/tagParser.ts","../src/stack/deploy.ts","../src/stack/index.ts","../src/stack/localStack/event.ts","../src/stack/localStack/index.ts","../src/stack/rfsStack/function.ts","../src/stack/rfsStack/index.ts","../src/stack/rosStack/bootstrap.ts","../src/stack/rosStack/bucket.ts","../src/stack/rosStack/database.ts","../src/stack/rosStack/event.ts","../src/stack/rosStack/function.ts","../src/stack/rosStack/index.ts","../src/stack/rosStack/stage.ts","../src/stack/rosStack/table.ts","../src/stack/rosStack/tag.ts","../src/stack/rosStack/vars.ts","../src/types/assets.ts","../src/types/index.ts","../src/types/domains/bucket.ts","../src/types/domains/context.ts","../src/types/domains/database.ts","../src/types/domains/event.ts","../src/types/domains/function.ts","../src/types/domains/provider.ts","../src/types/domains/table.ts","../src/types/domains/tag.ts","../src/types/domains/vars.ts","../src/validator/bucketSchema.ts","../src/validator/databaseSchema.ts","../src/validator/eventSchema.ts","../src/validator/functionSchema.ts","../src/validator/iacSchema.ts","../src/validator/index.ts","../src/validator/rootSchema.ts","../src/validator/tableschema.ts"],"version":"5.9.2"}
1
+ {"root":["../src/index.ts","../src/commands/deploy.ts","../src/commands/destroy.ts","../src/commands/index.ts","../src/commands/local.ts","../src/commands/template.ts","../src/commands/validate.ts","../src/common/base64.ts","../src/common/constants.ts","../src/common/context.ts","../src/common/getVersion.ts","../src/common/iacHelper.ts","../src/common/imsClient.ts","../src/common/index.ts","../src/common/logger.ts","../src/common/providerEnum.ts","../src/common/requestHelper.ts","../src/common/rosAssets.ts","../src/common/rosClient.ts","../src/lang/index.ts","../src/parser/bucketParser.ts","../src/parser/databaseParser.ts","../src/parser/eventParser.ts","../src/parser/functionParser.ts","../src/parser/index.ts","../src/parser/tableParser.ts","../src/parser/tagParser.ts","../src/stack/deploy.ts","../src/stack/index.ts","../src/stack/localStack/aliyunFc.ts","../src/stack/localStack/bucket.ts","../src/stack/localStack/event.ts","../src/stack/localStack/function.ts","../src/stack/localStack/functionRunner.ts","../src/stack/localStack/index.ts","../src/stack/localStack/localServer.ts","../src/stack/localStack/utils.ts","../src/stack/rfsStack/function.ts","../src/stack/rfsStack/index.ts","../src/stack/rosStack/bootstrap.ts","../src/stack/rosStack/bucket.ts","../src/stack/rosStack/database.ts","../src/stack/rosStack/event.ts","../src/stack/rosStack/function.ts","../src/stack/rosStack/index.ts","../src/stack/rosStack/stage.ts","../src/stack/rosStack/table.ts","../src/stack/rosStack/tag.ts","../src/stack/rosStack/vars.ts","../src/types/assets.ts","../src/types/index.ts","../src/types/domains/bucket.ts","../src/types/domains/context.ts","../src/types/domains/database.ts","../src/types/domains/event.ts","../src/types/domains/function.ts","../src/types/domains/provider.ts","../src/types/domains/table.ts","../src/types/domains/tag.ts","../src/types/domains/vars.ts","../src/types/localStack/index.ts","../src/validator/bucketSchema.ts","../src/validator/databaseSchema.ts","../src/validator/eventSchema.ts","../src/validator/functionSchema.ts","../src/validator/iacSchema.ts","../src/validator/index.ts","../src/validator/rootSchema.ts","../src/validator/tableschema.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geek-fun/serverlessinsight",
3
- "version": "0.3.3",
3
+ "version": "0.4.0",
4
4
  "description": "Full life cycle cross providers serverless application management for your fast-growing business.",
5
5
  "homepage": "https://serverlessinsight.geekfun.club",
6
6
  "main": "dist/src/index.js",
@@ -51,52 +51,52 @@
51
51
  "dependencies": {
52
52
  "@alicloud/ims20190815": "^2.3.2",
53
53
  "@alicloud/openapi-client": "^0.4.15",
54
- "@alicloud/ros-cdk-apigateway": "^1.10.0",
55
- "@alicloud/ros-cdk-core": "^1.10.0",
56
- "@alicloud/ros-cdk-dns": "^1.10.0",
57
- "@alicloud/ros-cdk-ecs": "^1.10.0",
58
- "@alicloud/ros-cdk-elasticsearchserverless": "^1.10.0",
59
- "@alicloud/ros-cdk-fc3": "^1.10.0",
60
- "@alicloud/ros-cdk-nas": "^1.10.0",
61
- "@alicloud/ros-cdk-oss": "^1.10.0",
62
- "@alicloud/ros-cdk-ossdeployment": "^1.10.0",
63
- "@alicloud/ros-cdk-ots": "^1.10.0",
64
- "@alicloud/ros-cdk-ram": "^1.10.0",
65
- "@alicloud/ros-cdk-rds": "^1.10.0",
66
- "@alicloud/ros-cdk-ros": "^1.10.0",
67
- "@alicloud/ros-cdk-sls": "^1.10.0",
68
- "@alicloud/ros-cdk-vpc": "^1.10.0",
54
+ "@alicloud/ros-cdk-apigateway": "^1.11.0",
55
+ "@alicloud/ros-cdk-core": "^1.11.0",
56
+ "@alicloud/ros-cdk-dns": "^1.11.0",
57
+ "@alicloud/ros-cdk-ecs": "^1.11.0",
58
+ "@alicloud/ros-cdk-elasticsearchserverless": "^1.11.0",
59
+ "@alicloud/ros-cdk-fc3": "^1.11.0",
60
+ "@alicloud/ros-cdk-nas": "^1.11.0",
61
+ "@alicloud/ros-cdk-oss": "^1.11.0",
62
+ "@alicloud/ros-cdk-ossdeployment": "^1.11.0",
63
+ "@alicloud/ros-cdk-ots": "^1.11.0",
64
+ "@alicloud/ros-cdk-ram": "^1.11.0",
65
+ "@alicloud/ros-cdk-rds": "^1.11.0",
66
+ "@alicloud/ros-cdk-ros": "^1.11.0",
67
+ "@alicloud/ros-cdk-sls": "^1.11.0",
68
+ "@alicloud/ros-cdk-vpc": "^1.11.0",
69
69
  "@alicloud/ros20190910": "^3.6.0",
70
70
  "ajv": "^8.17.1",
71
71
  "ali-oss": "^6.23.0",
72
72
  "chalk": "^5.6.2",
73
- "commander": "^14.0.1",
73
+ "commander": "^14.0.2",
74
74
  "i": "^0.3.7",
75
- "i18n": "^0.15.2",
75
+ "i18n": "^0.15.3",
76
76
  "jszip": "^3.10.1",
77
77
  "lodash": "^4.17.21",
78
- "npm": "^11.5.2",
79
- "pino": "^9.9.4",
80
- "pino-pretty": "^13.1.1",
81
- "yaml": "^2.8.1"
78
+ "npm": "^11.7.0",
79
+ "pino": "^10.1.0",
80
+ "pino-pretty": "^13.1.3",
81
+ "yaml": "^2.8.2"
82
82
  },
83
83
  "devDependencies": {
84
- "@types/ali-oss": "^6.16.11",
84
+ "@types/ali-oss": "^6.16.13",
85
85
  "@types/i18n": "^0.13.12",
86
86
  "@types/jest": "^30.0.0",
87
- "@types/lodash": "^4.17.20",
88
- "@types/node": "^24.3.0",
89
- "@typescript-eslint/eslint-plugin": "^8.39.1",
90
- "@typescript-eslint/parser": "^8.39.1",
91
- "eslint": "^9.33.0",
87
+ "@types/lodash": "^4.17.21",
88
+ "@types/node": "^25.0.3",
89
+ "@typescript-eslint/eslint-plugin": "^8.50.0",
90
+ "@typescript-eslint/parser": "^8.50.0",
91
+ "eslint": "^9.39.2",
92
92
  "eslint-config-prettier": "^10.1.8",
93
93
  "eslint-plugin-prettier": "^5.5.4",
94
- "globals": "^16.3.0",
94
+ "globals": "^16.5.0",
95
95
  "husky": "^9.1.7",
96
- "jest": "^30.0.5",
97
- "prettier": "^3.6.2",
98
- "ts-jest": "^29.4.1",
96
+ "jest": "^30.2.0",
97
+ "prettier": "^3.7.4",
98
+ "ts-jest": "^29.4.6",
99
99
  "ts-node": "^10.9.2",
100
- "typescript": "^5.9.2"
100
+ "typescript": "^5.9.3"
101
101
  }
102
102
  }
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.splitDomain = void 0;
4
- const splitDomain = (domain) => {
5
- const parts = domain.split('.');
6
- const rr = parts.length > 2 ? parts[0] : '@';
7
- const domainName = parts.length > 2 ? parts.slice(1).join('.') : domain;
8
- return { rr, domainName };
9
- };
10
- exports.splitDomain = splitDomain;