@intelligems/sst 2.49.3 → 2.49.6-ig.10

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.
@@ -6,11 +6,32 @@ import path from "path";
6
6
  import fs from "fs";
7
7
  import http from "http";
8
8
  import url from "url";
9
+ import os from "os";
10
+ try {
11
+ const mod = await import("node:module");
12
+ if (typeof mod.enableCompileCache === "function") {
13
+ const cacheDir = path.join(os.tmpdir(), "sst-compile-cache");
14
+ mod.enableCompileCache(cacheDir);
15
+ }
16
+ } catch {
17
+ }
9
18
  var input = workerData;
10
- var parsed = path.parse(input.handler);
11
- var file = [".js", ".jsx", ".mjs", ".cjs"].map((ext) => path.join(input.out, parsed.dir, parsed.name + ext)).find((file2) => {
12
- return fs.existsSync(file2);
13
- });
19
+ var monoBundlePath = path.join(input.out, "index.mjs");
20
+ var useMonoBundle = input.isMonoBuild ?? (input.handler === "index.handler" && fs.existsSync(monoBundlePath));
21
+ var file;
22
+ var handlerName;
23
+ if (useMonoBundle) {
24
+ file = monoBundlePath;
25
+ handlerName = "handler";
26
+ } else {
27
+ const parsed = path.parse(input.handler);
28
+ const foundFile = [".js", ".jsx", ".mjs", ".cjs"].map((ext) => path.join(input.out, parsed.dir, parsed.name + ext)).find((f) => fs.existsSync(f));
29
+ if (!foundFile) {
30
+ throw new Error(`Could not find handler file for "${input.handler}"`);
31
+ }
32
+ file = foundFile;
33
+ handlerName = parsed.ext.substring(1);
34
+ }
14
35
  var fn;
15
36
  function fetch(req) {
16
37
  return new Promise((resolve, reject) => {
@@ -44,13 +65,15 @@ function fetch(req) {
44
65
  try {
45
66
  const { href } = url.pathToFileURL(file);
46
67
  const mod = await import(href);
47
- const handler = parsed.ext.substring(1);
48
- fn = mod[handler];
68
+ fn = mod[handlerName];
49
69
  if (!fn) {
50
70
  throw new Error(
51
- `Function "${handler}" not found in "${input.handler}". Found ${Object.keys(mod).join(", ")}`
71
+ useMonoBundle ? `Mono-bundle handler "${handlerName}" not found in "${file}". Found: ${Object.keys(mod).join(", ")}` : `Function "${handlerName}" not found in "${input.handler}". Found: ${Object.keys(mod).join(", ")}`
52
72
  );
53
73
  }
74
+ if (useMonoBundle && mod.warmUp) {
75
+ await mod.warmUp();
76
+ }
54
77
  } catch (ex) {
55
78
  await fetch({
56
79
  path: `/runtime/init/error`,
@@ -97,6 +120,15 @@ while (true) {
97
120
  method: "GET",
98
121
  headers: {}
99
122
  });
123
+ const sstFunctionId = result.headers["lambda-runtime-sst-function-id"];
124
+ if (sstFunctionId) {
125
+ process.env.SST_FUNCTION_ID = sstFunctionId;
126
+ }
127
+ const parsed = JSON.parse(result.body);
128
+ const invocationEnv = parsed.env;
129
+ if (invocationEnv && typeof invocationEnv === "object") {
130
+ Object.assign(process.env, invocationEnv);
131
+ }
100
132
  context = {
101
133
  awsRequestId: result.headers["lambda-runtime-aws-request-id"],
102
134
  invokedFunctionArn: result.headers["lambda-runtime-invoked-function-arn"],
@@ -108,9 +140,10 @@ while (true) {
108
140
  identity: JSON.parse(result.headers["lambda-runtime-cognito-identity"]) ?? void 0,
109
141
  // If clientContext is null, we want to mimick AWS behavior and return undefined
110
142
  clientContext: JSON.parse(result.headers["lambda-runtime-client-context"]) ?? void 0,
111
- functionName: process.env.AWS_LAMBDA_FUNCTION_NAME,
112
- functionVersion: process.env.AWS_LAMBDA_FUNCTION_VERSION,
113
- memoryLimitInMB: process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE,
143
+ // Per-invocation function context from headers (essential for mono-build shared workers)
144
+ functionName: result.headers["lambda-runtime-function-name"] || process.env.AWS_LAMBDA_FUNCTION_NAME,
145
+ functionVersion: result.headers["lambda-runtime-function-version"] || process.env.AWS_LAMBDA_FUNCTION_VERSION,
146
+ memoryLimitInMB: result.headers["lambda-runtime-function-memory-size"] || process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE,
114
147
  logGroupName: result.headers["lambda-runtime-log-group-name"],
115
148
  logStreamName: result.headers["lambda-runtime-log-stream-name"],
116
149
  callbackWaitsForEmptyEventLoop: {
@@ -139,7 +172,7 @@ while (true) {
139
172
  );
140
173
  }
141
174
  };
142
- request = JSON.parse(result.body);
175
+ request = parsed.event;
143
176
  } catch {
144
177
  continue;
145
178
  }
@@ -4,8 +4,9 @@ import json
4
4
  import logging
5
5
  import argparse
6
6
  import traceback
7
- from urllib import request, parse
8
- from time import strftime, time
7
+ import signal
8
+ from urllib import request
9
+ from time import time
9
10
  from importlib import import_module
10
11
 
11
12
  class Identity(object):
@@ -22,15 +23,15 @@ class ClientContext(object):
22
23
 
23
24
  class Context(object):
24
25
  def __init__(self, invoked_function_arn, aws_request_id, deadline_ms, identity, client_context, log_group_name, log_stream_name):
25
- self.function_name = os.environ['AWS_LAMBDA_FUNCTION_NAME']
26
+ self.function_name = os.environ.get('AWS_LAMBDA_FUNCTION_NAME', 'local')
26
27
  self.invoked_function_arn = invoked_function_arn
27
28
  self.aws_request_id = aws_request_id
28
- self.memory_limit_in_mb = os.environ['AWS_LAMBDA_FUNCTION_MEMORY_SIZE']
29
+ self.memory_limit_in_mb = os.environ.get('AWS_LAMBDA_FUNCTION_MEMORY_SIZE', '128')
29
30
  self.deadline_ms = deadline_ms
30
31
  # If identity is null, we want to mimick AWS behavior and return an object with None values
31
- self.identity = Identity(**json.loads(identity)) if identity != 'null' else Identity(cognito_identity_id = None, cognito_identity_pool_id = None)
32
+ self.identity = Identity(**json.loads(identity)) if identity and identity != 'null' else Identity(cognito_identity_id=None, cognito_identity_pool_id=None)
32
33
  # If client_context is null, we want to mimick AWS behavior and return None
33
- self.client_context = ClientContext(**json.loads(client_context)) if client_context != 'null' else None
34
+ self.client_context = ClientContext(**json.loads(client_context)) if client_context and client_context != 'null' else None
34
35
  self.log_group_name = log_group_name
35
36
  self.log_stream_name = log_stream_name
36
37
 
@@ -42,15 +43,17 @@ class Context(object):
42
43
 
43
44
 
44
45
  def handleUnserializable(obj):
45
- print(
46
- "Unserializable {}: {} when returning result {!r}".format(
47
- type(obj), repr(obj), result
48
- )
49
- )
50
-
51
46
  raise TypeError("Unserializable {}: {!r}".format(type(obj), obj))
52
47
 
53
48
 
49
+ # Idle timeout handler
50
+ class IdleTimeoutError(Exception):
51
+ pass
52
+
53
+ def idle_timeout_handler(signum, frame):
54
+ raise IdleTimeoutError("Worker idle timeout")
55
+
56
+
54
57
  logging.basicConfig()
55
58
 
56
59
  parser = argparse.ArgumentParser(
@@ -64,15 +67,69 @@ parser.add_argument('handler_module',
64
67
  parser.add_argument('src_path', help='SrcPath of the handler function')
65
68
  parser.add_argument('handler_name', help='Name of the handler function')
66
69
 
70
+ # Idle timeout in seconds (15 minutes, matching Node.js runtime)
71
+ IDLE_TIMEOUT = 15 * 60
72
+
67
73
  if __name__ == '__main__':
68
74
  args = parser.parse_args()
69
75
 
70
76
  # this is needed because you need to import from where you've executed sst
71
77
  sys.path.append('.')
72
78
 
73
- # fetch request
74
- url = "http://{}/2018-06-01/runtime/invocation/next".format(os.environ['AWS_LAMBDA_RUNTIME_API'])
75
- r = request.urlopen(url)
79
+ # set the sys.path to the src_path. Otherwise importing a local file
80
+ # would fail with error ModuleNotFoundError
81
+ sys.path.append(args.src_path)
82
+
83
+ # Import handler module once at startup (warm start optimization)
84
+ handler = None
85
+ try:
86
+ # remove leading zeros for relative imports
87
+ if args.handler_module.startswith('.'):
88
+ module = import_module(args.handler_module[1:])
89
+ else:
90
+ module = import_module(args.handler_module)
91
+
92
+ handler = getattr(module, args.handler_name)
93
+ except Exception as e:
94
+ # Report init error and exit
95
+ traceback.print_exc()
96
+ try:
97
+ init_error_url = "http://{}/2018-06-01/runtime/init/error".format(
98
+ os.environ['AWS_LAMBDA_RUNTIME_API']
99
+ )
100
+ ex_type, ex_value, ex_traceback = sys.exc_info()
101
+ error_data = json.dumps({
102
+ "errorType": ex_type.__name__ if ex_type else "ImportError",
103
+ "errorMessage": str(ex_value),
104
+ "trace": traceback.format_tb(ex_traceback) if ex_traceback else [],
105
+ }).encode("utf-8")
106
+ req = request.Request(init_error_url, method="POST", data=error_data)
107
+ req.add_header('Content-Type', 'application/json')
108
+ request.urlopen(req)
109
+ except Exception:
110
+ pass
111
+ sys.exit(1)
112
+
113
+ # Main event loop - handle multiple invocations
114
+ while True:
115
+ context = None
116
+
117
+ try:
118
+ # Set up idle timeout using SIGALRM (Unix only)
119
+ if hasattr(signal, 'SIGALRM'):
120
+ signal.signal(signal.SIGALRM, idle_timeout_handler)
121
+ signal.alarm(IDLE_TIMEOUT)
122
+
123
+ # Fetch next invocation (blocks until one is available)
124
+ next_url = "http://{}/2018-06-01/runtime/invocation/next".format(
125
+ os.environ['AWS_LAMBDA_RUNTIME_API']
126
+ )
127
+ r = request.urlopen(next_url)
128
+
129
+ # Cancel idle timeout once we have work
130
+ if hasattr(signal, 'SIGALRM'):
131
+ signal.alarm(0)
132
+
76
133
  event = json.loads(r.read())
77
134
  context = Context(
78
135
  r.getheader('Lambda-Runtime-Invoked-Function-Arn'),
@@ -84,44 +141,58 @@ if __name__ == '__main__':
84
141
  r.getheader('Lambda-Runtime-Log-Stream-Name')
85
142
  )
86
143
 
87
- # invoke handler
88
- has_error = False
144
+ # Invoke handler
89
145
  try:
90
- # set the sys.path to the src_path. Other wise importing a local file
91
- # would fail with error ModuleNotFoundError
92
- sys.path.append(args.src_path)
93
-
94
- # remove leading zeros for relative imports
95
- if args.handler_module.startswith('.'):
96
- module = import_module(args.handler_module[1:])
97
- else:
98
- module = import_module(args.handler_module)
99
-
100
- handler = getattr(module, args.handler_name)
101
146
  result = handler(event, context)
102
147
  data = json.dumps(result, default=handleUnserializable).encode("utf-8")
103
-
148
+ url_destination = '/response'
104
149
  except Exception as e:
105
- has_error = True
106
- # print error in bootstrap because we won't be able to print the Python
107
- # stack trace in the correct format in NodeJS
150
+ # Handler error - report but keep worker alive
108
151
  traceback.print_exc()
109
- # build error response
110
152
  ex_type, ex_value, ex_traceback = sys.exc_info()
111
- result = {
112
- "errorType": ex_type.__name__,
153
+ error_result = {
154
+ "errorType": ex_type.__name__ if ex_type else "Error",
113
155
  "errorMessage": str(ex_value),
114
- "trace": traceback.format_tb(ex_traceback),
156
+ "trace": traceback.format_tb(ex_traceback) if ex_traceback else [],
115
157
  }
116
- data = json.dumps(result).encode("utf-8")
117
-
118
- # send response
119
- if has_error == False:
120
- url_destination = '/response'
121
- else:
158
+ data = json.dumps(error_result).encode("utf-8")
122
159
  url_destination = '/error'
123
- url = "http://{}/2018-06-01/runtime/invocation/{}{}".format(os.environ['AWS_LAMBDA_RUNTIME_API'], context.aws_request_id, url_destination)
124
- req = request.Request(url, method="POST", data=data)
160
+
161
+ # Send response
162
+ response_url = "http://{}/2018-06-01/runtime/invocation/{}{}".format(
163
+ os.environ['AWS_LAMBDA_RUNTIME_API'],
164
+ context.aws_request_id,
165
+ url_destination
166
+ )
167
+ req = request.Request(response_url, method="POST", data=data)
125
168
  req.add_header('Content-Type', 'application/json')
126
- r = request.urlopen(req, data=data)
127
169
 
170
+ # Retry sending response (matching Node.js behavior)
171
+ max_retries = 3
172
+ for attempt in range(max_retries):
173
+ try:
174
+ request.urlopen(req)
175
+ break
176
+ except Exception as e:
177
+ if attempt < max_retries - 1:
178
+ import time as time_module
179
+ time_module.sleep(0.5)
180
+ else:
181
+ print(f"Failed to send response after {max_retries} attempts: {e}", file=sys.stderr)
182
+
183
+ except IdleTimeoutError:
184
+ # Idle timeout - exit gracefully
185
+ print("Worker idle timeout, exiting", file=sys.stderr)
186
+ sys.exit(0)
187
+
188
+ except KeyboardInterrupt:
189
+ # Graceful shutdown
190
+ print("Worker interrupted, exiting", file=sys.stderr)
191
+ sys.exit(0)
192
+
193
+ except Exception as e:
194
+ # Unexpected error in the runtime loop itself
195
+ print(f"Runtime error: {e}", file=sys.stderr)
196
+ traceback.print_exc()
197
+ # Continue to next iteration - don't crash the worker
198
+ continue
@@ -1,16 +1,28 @@
1
- // @ts-nocheck
2
1
  import * as os from "os";
3
2
  import * as fs_path from "path";
4
3
  import * as fs from "fs";
4
+ import { fileURLToPath, pathToFileURL } from "url";
5
5
  export const PROJECT_CONFIG = "cdk.json";
6
6
  export const USER_DEFAULTS = "~/.cdk.json";
7
7
  const CONTEXT_KEY = "context";
8
- const cdkToolkitUrl = await import.meta.resolve("@aws-cdk/toolkit-lib");
9
- const cdkToolkitPath = new URL(cdkToolkitUrl).pathname;
10
- const { ToolkitError } = await import(cdkToolkitPath);
11
- const { Context, PROJECT_CONTEXT } = await import(fs_path.resolve(cdkToolkitPath, "..", "api", "context.js"));
12
- const { Settings } = await import(fs_path.resolve(cdkToolkitPath, "..", "api", "settings.js"));
13
- const { Tags } = await import(fs_path.resolve(cdkToolkitPath, "..", "api", "tags", "index.js"));
8
+ let cdkToolkitPath = "";
9
+ let cdkToolkitUrl = "";
10
+ try {
11
+ cdkToolkitUrl = await import.meta.resolve("@aws-cdk/toolkit-lib");
12
+ cdkToolkitPath = fileURLToPath(cdkToolkitUrl);
13
+ }
14
+ catch (e) {
15
+ // Fallback for test environment where import.meta.resolve is not available
16
+ const module = await import("module");
17
+ const require = module.createRequire(import.meta.url);
18
+ cdkToolkitPath = require.resolve("@aws-cdk/toolkit-lib");
19
+ cdkToolkitUrl = pathToFileURL(cdkToolkitPath).href;
20
+ }
21
+ const { ToolkitError } = await import(cdkToolkitUrl);
22
+ const { Context, PROJECT_CONTEXT } = await import(pathToFileURL(fs_path.resolve(cdkToolkitPath, "..", "api", "context.js")).href);
23
+ const { Settings } = await import(pathToFileURL(fs_path.resolve(cdkToolkitPath, "..", "api", "settings.js"))
24
+ .href);
25
+ const { Tags } = await import(pathToFileURL(fs_path.resolve(cdkToolkitPath, "..", "api", "tags", "index.js")).href);
14
26
  export var Command;
15
27
  (function (Command) {
16
28
  Command["LS"] = "ls";
package/README.md DELETED
@@ -1,43 +0,0 @@
1
- # sst
2
-
3
- [SST](https://sst.dev) makes it easy to build modern full-stack applications on AWS.
4
-
5
- The `sst` package is made up of the following.
6
-
7
- - [`sst`](https://docs.sst.dev/packages/sst) CLI
8
- - [`sst/node`](https://docs.sst.dev/clients) Node.js client
9
- - [`sst/constructs`](https://docs.sst.dev/constructs) CDK constructs
10
-
11
- ## Installation
12
-
13
- Install the `sst` package in your project root.
14
-
15
- ```bash
16
- npm install sst --save-exact
17
- ```
18
-
19
- ## Usage
20
-
21
- Once installed, you can run the CLI commands using.
22
-
23
- ```bash
24
- npx sst <command>
25
- ```
26
-
27
- Import the Node.js client in your functions. For example, you can import the `Bucket` client.
28
-
29
- ```ts
30
- import { Bucket } from "sst/node/bucket";
31
- ```
32
-
33
- And import the constructs you need in your stacks code. For example, you can add an API.
34
-
35
- ```ts
36
- import { Api } from "sst/constructs";
37
- ```
38
-
39
- For more details, [head over to our docs](https://docs.sst.dev).
40
-
41
- ---
42
-
43
- **Join our community** [Discord](https://sst.dev/discord) | [YouTube](https://www.youtube.com/c/sst-dev) | [Twitter](https://twitter.com/SST_dev)
package/package.json.bak DELETED
@@ -1,156 +0,0 @@
1
- {
2
- "publishConfig": {
3
- "directory": "dist",
4
- "access": "public"
5
- },
6
- "sideEffects": false,
7
- "name": "@intelligems/sst",
8
- "version": "2.49.3",
9
- "bin": {
10
- "sst": "cli/sst.js"
11
- },
12
- "description": "A CLI to help deploy SST apps.",
13
- "type": "module",
14
- "license": "MIT",
15
- "scripts": {
16
- "prepare": "",
17
- "build": "node build.mjs && tsc",
18
- "test": "vitest run",
19
- "dev": "source .env && tsc-watch --onSuccess \"rsync -av dist/* ${TO} --checksum\""
20
- },
21
- "repository": {
22
- "type": "git",
23
- "url": "git+https://github.com/sst/v2.git",
24
- "directory": "packages/cli"
25
- },
26
- "exports": {
27
- "./constructs/deprecated": "./constructs/deprecated/index.js",
28
- "./constructs/future": "./constructs/future/index.js",
29
- "./constructs": "./constructs/index.js",
30
- "./context": "./context/index.js",
31
- "./node/future/*": "./node/future/*/index.js",
32
- "./node/*": "./node/*/index.js",
33
- ".": "./index.js",
34
- "./*": "./*"
35
- },
36
- "homepage": "https://sst.dev",
37
- "dependencies": {
38
- "@aws-cdk/aws-lambda-python-alpha": "2.201.0-alpha.0",
39
- "@aws-cdk/cloud-assembly-schema": "44.5.0",
40
- "@aws-cdk/cloudformation-diff": "2.182.0",
41
- "@aws-cdk/cx-api": "2.201.0",
42
- "@aws-cdk/toolkit-lib": "1.1.1",
43
- "@aws-crypto/sha256-js": "^5.2.0",
44
- "@aws-sdk/client-cloudformation": "3.699.0",
45
- "@aws-sdk/client-ecs": "3.699.0",
46
- "@aws-sdk/client-eventbridge": "3.699.0",
47
- "@aws-sdk/client-iam": "3.699.0",
48
- "@aws-sdk/client-iot": "3.699.0",
49
- "@aws-sdk/client-iot-data-plane": "3.699.0",
50
- "@aws-sdk/client-lambda": "3.699.0",
51
- "@aws-sdk/client-rds-data": "3.699.0",
52
- "@aws-sdk/client-s3": "3.699.0",
53
- "@aws-sdk/client-ssm": "3.699.0",
54
- "@aws-sdk/client-sts": "3.699.0",
55
- "@aws-sdk/config-resolver": "3.374.0",
56
- "@aws-sdk/credential-providers": "3.699.0",
57
- "@aws-sdk/middleware-retry": "3.374.0",
58
- "@aws-sdk/middleware-signing": "3.451.0",
59
- "@aws-sdk/signature-v4-crt": "3.451.0",
60
- "@aws-sdk/smithy-client": "3.374.0",
61
- "@babel/core": "^7.0.0-0",
62
- "@babel/generator": "^7.20.5",
63
- "@babel/plugin-syntax-typescript": "^7.21.4",
64
- "@smithy/signature-v4": "2.0.16",
65
- "@trpc/server": "9.18.0",
66
- "adm-zip": "0.5.14",
67
- "aws-cdk-lib": "2.201.0",
68
- "aws-iot-device-sdk": "^2.2.13",
69
- "aws-sdk": "^2.1501.0",
70
- "builtin-modules": "3.2.0",
71
- "cdk-assets": "3.3.1",
72
- "chalk": "^5.2.0",
73
- "chokidar": "^3.5.3",
74
- "ci-info": "^3.7.0",
75
- "colorette": "^2.0.19",
76
- "conf": "^10.2.0",
77
- "constructs": "10.3.0",
78
- "cross-spawn": "^7.0.3",
79
- "dendriform-immer-patch-optimiser": "^2.1.0",
80
- "dotenv": "^16.0.3",
81
- "esbuild": "0.18.13",
82
- "express": "^4.18.2",
83
- "fast-jwt": "^5.0.5",
84
- "get-port": "^6.1.2",
85
- "glob": "^10.0.0",
86
- "graphql": "*",
87
- "graphql-yoga": "^3.9.0",
88
- "immer": "9",
89
- "ink": "^4.0.0",
90
- "ink-spinner": "^5.0.0",
91
- "kysely": "^0.25.0",
92
- "kysely-codegen": "^0.10.1",
93
- "kysely-data-api": "^0.2.1",
94
- "minimatch": "^6.1.6",
95
- "openid-client": "^5.1.8",
96
- "ora": "^6.1.2",
97
- "react": "^18.0.0",
98
- "remeda": "^1.3.0",
99
- "tree-kill": "^1.2.2",
100
- "undici": "^5.12.0",
101
- "uuid": "^9.0.0",
102
- "ws": "^8.11.0",
103
- "yargs": "^17.6.2",
104
- "zod": "^3.21.4"
105
- },
106
- "devDependencies": {
107
- "dotenv-cli": "^8.0.0",
108
- "@aws-sdk/client-api-gateway": "3.699.0",
109
- "@aws-sdk/client-cloudfront": "3.699.0",
110
- "@aws-sdk/client-codebuild": "3.699.0",
111
- "@aws-sdk/client-sqs": "3.699.0",
112
- "@aws-sdk/types": "3.451.0",
113
- "@graphql-tools/merge": "^8.3.16",
114
- "@sls-next/lambda-at-edge": "^3.7.0",
115
- "@smithy/types": "4.1.0",
116
- "@tsconfig/node16": "^1.0.3",
117
- "@tsconfig/node18": "^18.2.2",
118
- "@types/adm-zip": "^0.5.0",
119
- "@types/async": "^3.2.24",
120
- "@types/aws-iot-device-sdk": "^2.2.8",
121
- "@types/aws-lambda": "^8.10.128",
122
- "@types/babel__core": "^7.1.20",
123
- "@types/babel__generator": "^7.6.4",
124
- "@types/cross-spawn": "^6.0.2",
125
- "@types/express": "^4.17.14",
126
- "@types/node": "18.11.9",
127
- "@types/react": "^18.0.28",
128
- "@types/uuid": "^8.3.4",
129
- "@types/ws": "8.5.3",
130
- "@types/yargs": "^17.0.13",
131
- "archiver": "^5.3.1",
132
- "astro-sst": "2.45.1",
133
- "async": "^3.2.4",
134
- "tsx": "^3.12.1",
135
- "typescript": "5.2.2",
136
- "vitest": "^0.33.0",
137
- "tsc-watch": "^6.2.1"
138
- },
139
- "peerDependencies": {
140
- "@sls-next/lambda-at-edge": "^3.7.0"
141
- },
142
- "peerDependenciesMeta": {
143
- "@sls-next/lambda-at-edge": {
144
- "optional": true
145
- }
146
- },
147
- "bugs": {
148
- "url": "https://github.com/sst/v2/issues"
149
- },
150
- "main": "index.js",
151
- "directories": {
152
- "test": "test"
153
- },
154
- "keywords": [],
155
- "author": ""
156
- }