diff --git a/apps/test-app-runtime/tsconfig.json b/apps/test-app-runtime/tsconfig.json index 0f5976ac9..eca044bab 100644 --- a/apps/test-app-runtime/tsconfig.json +++ b/apps/test-app-runtime/tsconfig.json @@ -9,6 +9,6 @@ "references": [ { "path": "../../packages/@eventual/aws-client" }, { "path": "../../packages/@eventual/core" }, - { "path": "../../packages/@eventual/integrations-slack" } + { "path": "../../packages/@eventual/integrations/slack" } ] } diff --git a/apps/tests/aws-runtime/package.json b/apps/tests/aws-runtime/package.json index b1147a3e2..859b0c143 100644 --- a/apps/tests/aws-runtime/package.json +++ b/apps/tests/aws-runtime/package.json @@ -25,6 +25,7 @@ }, "devDependencies": { "@anatine/zod-openapi": "^1.12.0", + "aws-cdk-lib": "^2.81.0", "@aws-sdk/types": "^3.341.0", "@jest/globals": "^29.5.0", "@types/aws-lambda": "^8.10.115", diff --git a/packages/@eventual/core/src/index.ts b/packages/@eventual/core/src/index.ts index 5138332cd..a5e178722 100644 --- a/packages/@eventual/core/src/index.ts +++ b/packages/@eventual/core/src/index.ts @@ -11,6 +11,7 @@ export * from "./http-method.js"; export * from "./http/index.js"; export * from "./infer.js"; export * from "./logging.js"; +export * from "./resource.js"; export * from "./schedule.js"; export * from "./search/index.js"; export * from "./secret.js"; diff --git a/packages/@eventual/core/src/resource.ts b/packages/@eventual/core/src/resource.ts new file mode 100644 index 000000000..4cb2101ba --- /dev/null +++ b/packages/@eventual/core/src/resource.ts @@ -0,0 +1,60 @@ +import { Execution } from "./execution.js"; + +export interface Resource { + kind: "Resource"; + id: ID; + client: Client; + attributes: Attributes; +} + +export function resource< + const ID extends string, + const Properties, + const Attributes, + const Client +>( + id: ID, + options: { + create(request: Properties): Promise | Attributes>; + update(request: { + oldResourceProperties: Properties; + newResourceProperties: Properties; + attributes: Serialized; + }): Promise | Attributes>; + delete(request: { + properties: Properties; + attributes: Serialized; + }): Promise | void>; + init(output: Serialized): Promise; + } +): (id: string, props: Properties) => Resource { + return { + kind: "Resource", + id, + options, + } as any; +} + +export type Serialized = T extends + | undefined + | null + | boolean + | number + | string + ? T + : T extends readonly any[] + ? { + [i in keyof T]: i extends number ? Serialized : T[i]; + } + : T extends Record + ? Omit< + { + [k in keyof T]: T[k] extends (...args: any[]) => any + ? never + : Serialized; + }, + { + [k in keyof T]: T[k] extends (...args: any[]) => any ? k : never; + }[keyof T] + > + : never; diff --git a/packages/@eventual/integrations-slack/.gitignore b/packages/@eventual/integrations/slack/.gitignore similarity index 100% rename from packages/@eventual/integrations-slack/.gitignore rename to packages/@eventual/integrations/slack/.gitignore diff --git a/packages/@eventual/integrations-slack/.npmignore b/packages/@eventual/integrations/slack/.npmignore similarity index 100% rename from packages/@eventual/integrations-slack/.npmignore rename to packages/@eventual/integrations/slack/.npmignore diff --git a/packages/@eventual/integrations-slack/CHANGELOG.md b/packages/@eventual/integrations/slack/CHANGELOG.md similarity index 100% rename from packages/@eventual/integrations-slack/CHANGELOG.md rename to packages/@eventual/integrations/slack/CHANGELOG.md diff --git a/packages/@eventual/integrations-slack/CONTRIBUTING.MD b/packages/@eventual/integrations/slack/CONTRIBUTING.MD similarity index 100% rename from packages/@eventual/integrations-slack/CONTRIBUTING.MD rename to packages/@eventual/integrations/slack/CONTRIBUTING.MD diff --git a/packages/@eventual/integrations-slack/README.md b/packages/@eventual/integrations/slack/README.md similarity index 100% rename from packages/@eventual/integrations-slack/README.md rename to packages/@eventual/integrations/slack/README.md diff --git a/packages/@eventual/integrations-slack/img/cfn-list.png b/packages/@eventual/integrations/slack/img/cfn-list.png similarity index 100% rename from packages/@eventual/integrations-slack/img/cfn-list.png rename to packages/@eventual/integrations/slack/img/cfn-list.png diff --git a/packages/@eventual/integrations-slack/img/cfn-resource-link.png b/packages/@eventual/integrations/slack/img/cfn-resource-link.png similarity index 100% rename from packages/@eventual/integrations-slack/img/cfn-resource-link.png rename to packages/@eventual/integrations/slack/img/cfn-resource-link.png diff --git a/packages/@eventual/integrations-slack/img/cfn-resources.png b/packages/@eventual/integrations/slack/img/cfn-resources.png similarity index 100% rename from packages/@eventual/integrations-slack/img/cfn-resources.png rename to packages/@eventual/integrations/slack/img/cfn-resources.png diff --git a/packages/@eventual/integrations-slack/img/oauth-token.png b/packages/@eventual/integrations/slack/img/oauth-token.png similarity index 100% rename from packages/@eventual/integrations-slack/img/oauth-token.png rename to packages/@eventual/integrations/slack/img/oauth-token.png diff --git a/packages/@eventual/integrations-slack/img/scopes.png b/packages/@eventual/integrations/slack/img/scopes.png similarity index 100% rename from packages/@eventual/integrations-slack/img/scopes.png rename to packages/@eventual/integrations/slack/img/scopes.png diff --git a/packages/@eventual/integrations-slack/img/secrets-manager.png b/packages/@eventual/integrations/slack/img/secrets-manager.png similarity index 100% rename from packages/@eventual/integrations-slack/img/secrets-manager.png rename to packages/@eventual/integrations/slack/img/secrets-manager.png diff --git a/packages/@eventual/integrations-slack/img/signing-secret.png b/packages/@eventual/integrations/slack/img/signing-secret.png similarity index 100% rename from packages/@eventual/integrations-slack/img/signing-secret.png rename to packages/@eventual/integrations/slack/img/signing-secret.png diff --git a/packages/@eventual/integrations-slack/package.json b/packages/@eventual/integrations/slack/package.json similarity index 100% rename from packages/@eventual/integrations-slack/package.json rename to packages/@eventual/integrations/slack/package.json diff --git a/packages/@eventual/integrations-slack/src/events.ts b/packages/@eventual/integrations/slack/src/events.ts similarity index 100% rename from packages/@eventual/integrations-slack/src/events.ts rename to packages/@eventual/integrations/slack/src/events.ts diff --git a/packages/@eventual/integrations-slack/src/index.ts b/packages/@eventual/integrations/slack/src/index.ts similarity index 100% rename from packages/@eventual/integrations-slack/src/index.ts rename to packages/@eventual/integrations/slack/src/index.ts diff --git a/packages/@eventual/integrations-slack/src/package.json b/packages/@eventual/integrations/slack/src/package.json similarity index 100% rename from packages/@eventual/integrations-slack/src/package.json rename to packages/@eventual/integrations/slack/src/package.json diff --git a/packages/@eventual/integrations-slack/src/receiver.ts b/packages/@eventual/integrations/slack/src/receiver.ts similarity index 100% rename from packages/@eventual/integrations-slack/src/receiver.ts rename to packages/@eventual/integrations/slack/src/receiver.ts diff --git a/packages/@eventual/integrations-slack/src/slack.ts b/packages/@eventual/integrations/slack/src/slack.ts similarity index 100% rename from packages/@eventual/integrations-slack/src/slack.ts rename to packages/@eventual/integrations/slack/src/slack.ts diff --git a/packages/@eventual/integrations/slack/tsconfig.cjs.json b/packages/@eventual/integrations/slack/tsconfig.cjs.json new file mode 100644 index 000000000..e93c8d4b6 --- /dev/null +++ b/packages/@eventual/integrations/slack/tsconfig.cjs.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../../tsconfig-base.cjs", + "include": ["src"], + "exclude": ["lib", "node_modules", "src/package.json"], + "compilerOptions": { + "outDir": "lib/cjs", + "rootDir": "src" + }, + "references": [] +} diff --git a/packages/@eventual/integrations-slack/tsconfig.json b/packages/@eventual/integrations/slack/tsconfig.json similarity index 65% rename from packages/@eventual/integrations-slack/tsconfig.json rename to packages/@eventual/integrations/slack/tsconfig.json index 0f41787e5..03c1a291a 100644 --- a/packages/@eventual/integrations-slack/tsconfig.json +++ b/packages/@eventual/integrations/slack/tsconfig.json @@ -1,10 +1,10 @@ { - "extends": "../../../tsconfig-base", + "extends": "../../../../tsconfig-base", "include": ["src", "src/package.json"], "exclude": ["lib", "node_modules"], "compilerOptions": { "outDir": "lib/esm", "rootDir": "src" }, - "references": [{ "path": "../core" }] + "references": [{ "path": "../../core" }] } diff --git a/packages/@eventual/integrations/twilio/package.json b/packages/@eventual/integrations/twilio/package.json new file mode 100644 index 000000000..6eacc95c4 --- /dev/null +++ b/packages/@eventual/integrations/twilio/package.json @@ -0,0 +1,55 @@ +{ + "name": "@eventual/twilio", + "version": "0.41.0", + "exports": { + ".": { + "import": "./lib/esm/index.js", + "require": "./lib/cjs/index.js" + } + }, + "main": "./lib/cjs/index.js", + "module": "./lib/esm/index.js", + "files": [ + "lib" + ], + "dependencies": { + "tsscmp": "^1.0.6", + "twilio": "^4.11.1" + }, + "peerDependencies": { + "@eventual/core": "workspace:^", + "itty-router": "^2.6.6" + }, + "devDependencies": { + "@eventual/core": "workspace:^", + "@types/jest": "^29.5.1", + "@types/node": "^18", + "@types/tsscmp": "^1.0.0", + "itty-router": "2.6.6", + "jest": "^29", + "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", + "typescript": "^5", + "ulidx": "^0.3.0" + }, + "jest": { + "extensionsToTreatAsEsm": [ + ".ts" + ], + "moduleNameMapper": { + "^(\\.{1,2}/.*)\\.js$": "$1" + }, + "transform": { + "^.+\\.(t|j)sx?$": [ + "ts-jest", + { + "tsconfig": "tsconfig.test.json", + "useESM": true + } + ] + } + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/@eventual/integrations/twilio/src/account.ts b/packages/@eventual/integrations/twilio/src/account.ts new file mode 100644 index 000000000..2e4dd2583 --- /dev/null +++ b/packages/@eventual/integrations/twilio/src/account.ts @@ -0,0 +1,82 @@ +import twilio from "twilio"; +import { HttpResponse, api, resource } from "@eventual/core"; +import type { AddressListInstanceCreateOptions } from "twilio/lib/rest/api/v2010/account/address"; +import type { IncomingPhoneNumberListInstanceCreateOptions } from "twilio/lib/rest/api/v2010/account/incomingPhoneNumber"; + +const client = twilio( + process.env.TWILIO_ACCOUNT_SID, + process.env.TWILIO_AUTH_TOKEN +); + +export const Address = resource("twilio.Address", { + async create(input: AddressListInstanceCreateOptions) { + return { + sid: (await client.addresses.create(input)).sid, + }; + }, + async update({ newResourceProperties, attributes: address }) { + const updatedAddress = await client + .addresses(address.sid) + .update(newResourceProperties); + return { + sid: updatedAddress.sid, + }; + }, + async delete({ attributes: address }) { + await client.addresses(address.sid).remove(); + }, + async init(address) { + return client.addresses.get(address.sid).fetch(); + }, +}); + +export const PhoneNumber = resource("twilio.PhoneNumber", { + async create(input: IncomingPhoneNumberListInstanceCreateOptions) { + return { + sid: (await client.incomingPhoneNumbers.create(input)).sid, + }; + }, + async update({ newResourceProperties, attributes: address }) { + const updatedAddress = await client + .incomingPhoneNumbers(address.sid) + .update(newResourceProperties); + return { + sid: updatedAddress.sid, + }; + }, + async delete({ attributes: address }) { + await client.incomingPhoneNumbers(address.sid).remove(); + }, + async init(address) { + return client.incomingPhoneNumbers.get(address.sid).fetch(); + }, +}); + +export const samGoodwin = Address("Sam Goodwin", { + customerName: "Sam Goodwin", + city: "Seattle", + region: "Seattle", + postalCode: "98109", + isoCountry: "US", + street: "560 Highland Drive", +}); + +export const samGoodwinCell = PhoneNumber("Sam Goodwin Cell", { + // PROBLEM: attributes.sid won't exist during infer/synth + // can use a Proxy to intercept these references, not sure if good idea + addressSid: samGoodwin.attributes.sid, + // TODO: where to get this from? + // This will need to be a ngrok URL when running locally + // And then the API Gateway URL when deployed + smsUrl: process.env.SERVER_URL, +}); + +export const sms = api.post("/sms", (request) => { + const response = new twilio.twiml.MessagingResponse().message("Hello World"); + return new HttpResponse(response.toString(), { + status: 200, + headers: { + "Content-Type": "text/xml", + }, + }); +}); diff --git a/packages/@eventual/integrations-slack/tsconfig.cjs.json b/packages/@eventual/integrations/twilio/tsconfig.cjs.json similarity index 100% rename from packages/@eventual/integrations-slack/tsconfig.cjs.json rename to packages/@eventual/integrations/twilio/tsconfig.cjs.json diff --git a/packages/@eventual/integrations/twilio/tsconfig.json b/packages/@eventual/integrations/twilio/tsconfig.json new file mode 100644 index 000000000..0e30378d9 --- /dev/null +++ b/packages/@eventual/integrations/twilio/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../../../tsconfig-base", + "include": ["src", "src/package.json"], + "exclude": ["lib", "node_modules"], + "compilerOptions": { + "outDir": "lib/esm", + "rootDir": "src", + "esModuleInterop": true + }, + "references": [{ "path": "../../core" }] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d61dbd604..d956c485a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -130,7 +130,7 @@ importers: version: link:../../packages/@eventual/core '@eventual/integrations-slack': specifier: workspace:^ - version: link:../../packages/@eventual/integrations-slack + version: link:../../packages/@eventual/integrations/slack '@slack/bolt': specifier: ^3.12.2 version: 3.12.2 @@ -180,7 +180,7 @@ importers: version: link:../../packages/@eventual/aws-cdk '@serverless-stack/cli': specifier: ^1.18.4 - version: 1.18.4(constructs@10.2.36) + version: 1.18.4(constructs@10.1.154) '@serverless-stack/core': specifier: ^1.18.4 version: 1.18.4 @@ -192,7 +192,7 @@ importers: version: 1.0.1 aws-cdk-lib: specifier: 2.80.0 - version: 2.80.0(constructs@10.2.36) + version: 2.80.0(constructs@10.1.154) chalk: specifier: ^5.2.0 version: 5.2.0 @@ -267,6 +267,9 @@ importers: aws-cdk: specifier: ^2.80.0 version: 2.80.0 + aws-cdk-lib: + specifier: ^2.81.0 + version: 2.81.0(constructs@10.1.154) esbuild: specifier: ^0.17.4 version: 0.17.4 @@ -811,7 +814,7 @@ importers: specifier: ^5 version: 5.0.4 - packages/@eventual/integrations-slack: + packages/@eventual/integrations/slack: dependencies: '@slack/bolt': specifier: ^3.12.2 @@ -828,7 +831,47 @@ importers: devDependencies: '@eventual/core': specifier: workspace:^ - version: link:../core + version: link:../../core + '@types/jest': + specifier: ^29.5.1 + version: 29.5.1 + '@types/node': + specifier: ^18 + version: 18.0.0 + '@types/tsscmp': + specifier: ^1.0.0 + version: 1.0.0 + itty-router: + specifier: 2.6.6 + version: 2.6.6 + jest: + specifier: ^29 + version: 29.5.0(@types/node@18.0.0)(ts-node@10.9.1) + ts-jest: + specifier: ^29.1.0 + version: 29.1.0(@babel/core@7.22.1)(esbuild@0.17.4)(jest@29.5.0)(typescript@5.0.4) + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@swc/core@1.3.19)(@types/node@18.0.0)(typescript@5.0.4) + typescript: + specifier: ^5 + version: 5.0.4 + ulidx: + specifier: ^0.3.0 + version: 0.3.0 + + packages/@eventual/integrations/twilio: + dependencies: + tsscmp: + specifier: ^1.0.6 + version: 1.0.6 + twilio: + specifier: ^4.11.1 + version: 4.11.1 + devDependencies: + '@eventual/core': + specifier: workspace:^ + version: link:../../core '@types/jest': specifier: ^29.5.1 version: 29.5.1 @@ -1030,17 +1073,6 @@ packages: constructs: 10.1.154 dev: true - /@aws-cdk/aws-apigatewayv2-alpha@2.50.0-alpha.0(aws-cdk-lib@2.50.0)(constructs@10.2.36): - resolution: {integrity: sha512-dttWDqy+nTg/fD9y0egvj7/zdnOVEo0qyGsep1RV+p16R3F4ObMKyPVIg15fz57tK//Gp/i1QgXsZaSqbcWHOg==} - engines: {node: '>= 14.15.0'} - peerDependencies: - aws-cdk-lib: ^2.50.0 - constructs: ^10.0.0 - dependencies: - aws-cdk-lib: 2.50.0(constructs@10.2.36) - constructs: 10.2.36 - dev: true - /@aws-cdk/aws-apigatewayv2-alpha@2.80.0-alpha.0(aws-cdk-lib@2.80.0)(constructs@10.1.154): resolution: {integrity: sha512-XBvDiay46ThYP5hoPcwVfzE9egPiwHMGUpVepg6qJ+HQwCmLesbArwurmG2TXcfRbO06uXrAWmWpAqQmh7nstw==} engines: {node: '>= 14.15.0'} @@ -4245,7 +4277,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 18.0.0 + '@types/node': 18.11.8 chalk: 4.1.2 jest-message-util: 29.5.0 jest-util: 29.5.0 @@ -4266,14 +4298,14 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.0.0 + '@types/node': 18.11.8 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@18.0.0)(ts-node@10.9.1) + jest-config: 29.5.0(@types/node@18.11.8)(ts-node@10.9.1) jest-haste-map: 29.5.0 jest-message-util: 29.5.0 jest-regex-util: 29.4.3 @@ -4307,7 +4339,7 @@ packages: dependencies: '@jest/fake-timers': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.0.0 + '@types/node': 18.11.8 jest-mock: 29.5.0 dev: true @@ -4334,7 +4366,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@sinonjs/fake-timers': 10.2.0 - '@types/node': 18.0.0 + '@types/node': 18.11.8 jest-message-util: 29.5.0 jest-mock: 29.5.0 jest-util: 29.5.0 @@ -4367,7 +4399,7 @@ packages: '@jest/transform': 29.5.0 '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 18.0.0 + '@types/node': 18.11.8 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4454,7 +4486,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.0.0 + '@types/node': 18.11.8 '@types/yargs': 16.0.5 chalk: 4.1.2 dev: true @@ -4466,7 +4498,7 @@ packages: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.0.0 + '@types/node': 18.11.8 '@types/yargs': 17.0.24 chalk: 4.1.2 dev: true @@ -4518,8 +4550,8 @@ packages: resolution: {integrity: sha512-QyKIWEnKQFnYu2ey+SAAm1A5xjzJLJJj3bhIZd3QKyXKKjaJ0hlxam/OsWSltxTNbcyH1jRJjC6Cxv31usv0Ag==} engines: {node: ^14.17.0 || >=16.0.0} dependencies: - chalk: 4.1.0 - execa: 5.0.0 + chalk: 4.1.2 + execa: 5.1.1 strong-log-transformer: 2.1.0 dev: true @@ -5149,15 +5181,15 @@ packages: - supports-color dev: true - /@serverless-stack/cli@1.18.4(constructs@10.2.36): + /@serverless-stack/cli@1.18.4(constructs@10.1.154): resolution: {integrity: sha512-eEG3brlbF/ptIo/s69Hcrn185CVkLWHpmtOmere7+lMPkmy1vxNhWIUuic+LNG0yweK+sg4uMVipREyvwblNDQ==} hasBin: true dependencies: - '@aws-cdk/aws-apigatewayv2-alpha': 2.50.0-alpha.0(aws-cdk-lib@2.50.0)(constructs@10.2.36) + '@aws-cdk/aws-apigatewayv2-alpha': 2.50.0-alpha.0(aws-cdk-lib@2.50.0)(constructs@10.1.154) '@serverless-stack/core': 1.18.4 '@serverless-stack/resources': 1.18.4 aws-cdk: 2.50.0 - aws-cdk-lib: 2.50.0(constructs@10.2.36) + aws-cdk-lib: 2.50.0(constructs@10.1.154) aws-sdk: 2.1280.0 body-parser: 1.20.2 chalk: 4.1.2 @@ -5333,7 +5365,7 @@ packages: resolution: {integrity: sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==} engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} dependencies: - '@types/node': 18.0.0 + '@types/node': 18.11.8 dev: false /@slack/oauth@2.6.1: @@ -5343,7 +5375,7 @@ packages: '@slack/logger': 3.0.0 '@slack/web-api': 6.8.1 '@types/jsonwebtoken': 8.5.9 - '@types/node': 18.0.0 + '@types/node': 18.11.8 jsonwebtoken: 9.0.0 lodash.isstring: 4.0.1 transitivePeerDependencies: @@ -5356,7 +5388,7 @@ packages: dependencies: '@slack/logger': 3.0.0 '@slack/web-api': 6.8.1 - '@types/node': 18.0.0 + '@types/node': 18.11.8 '@types/p-queue': 2.3.2 '@types/ws': 7.4.7 eventemitter3: 3.1.2 @@ -5382,7 +5414,7 @@ packages: '@slack/logger': 3.0.0 '@slack/types': 2.8.0 '@types/is-stream': 1.1.0 - '@types/node': 18.0.0 + '@types/node': 18.11.8 axios: 0.27.2 eventemitter3: 3.1.2 form-data: 2.5.1 @@ -5628,7 +5660,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.0.0 + '@types/node': 18.11.8 /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} @@ -5643,12 +5675,12 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.0.0 + '@types/node': 18.11.8 /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 18.0.0 + '@types/node': 18.11.8 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -5664,7 +5696,7 @@ packages: /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 18.0.0 + '@types/node': 18.11.8 dev: true /@types/inquirer@8.2.6: @@ -5677,7 +5709,7 @@ packages: /@types/is-stream@1.1.0: resolution: {integrity: sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==} dependencies: - '@types/node': 18.0.0 + '@types/node': 18.11.8 dev: false /@types/istanbul-lib-coverage@2.0.4: @@ -5714,7 +5746,7 @@ packages: /@types/jsonwebtoken@8.5.9: resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} dependencies: - '@types/node': 18.0.0 + '@types/node': 18.11.8 dev: false /@types/mime@1.3.2: @@ -5744,7 +5776,6 @@ packages: /@types/node@18.11.8: resolution: {integrity: sha512-uGwPWlE0Hj972KkHtCDVwZ8O39GmyjfMane1Z3GUBGGnkZ2USDq7SxLpVIiIHpweY9DS0QTDH0Nw7RNBsAAZ5A==} - dev: false /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -5806,7 +5837,7 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 18.0.0 + '@types/node': 18.11.8 /@types/serve-static@1.15.1: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} @@ -5821,7 +5852,7 @@ packages: /@types/through@0.0.30: resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} dependencies: - '@types/node': 18.0.0 + '@types/node': 18.11.8 dev: true /@types/tsscmp@1.0.0: @@ -5830,7 +5861,7 @@ packages: /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 18.0.0 + '@types/node': 18.11.8 dev: false /@types/yargs-parser@21.0.0: @@ -6076,7 +6107,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true /agentkeepalive@4.3.0: resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} @@ -6429,34 +6459,6 @@ packages: - semver - yaml - /aws-cdk-lib@2.50.0(constructs@10.2.36): - resolution: {integrity: sha512-deDbZTI7oyu3rqUyqjwhP6tnUO8MD70lE98yR65xiYty4yXBpsWKbeH3s1wNLpLAWS3hWJYyMtjZ4ZfC35NtVg==} - engines: {node: '>= 14.15.0'} - peerDependencies: - constructs: ^10.0.0 - dependencies: - '@balena/dockerignore': 1.0.2 - case: 1.6.3 - constructs: 10.2.36 - fs-extra: 9.1.0 - ignore: 5.2.4 - jsonschema: 1.4.1 - minimatch: 3.1.2 - punycode: 2.3.0 - semver: 7.5.1 - yaml: 1.10.2 - dev: true - bundledDependencies: - - '@balena/dockerignore' - - case - - fs-extra - - ignore - - jsonschema - - minimatch - - punycode - - semver - - yaml - /aws-cdk-lib@2.80.0(constructs@10.1.154): resolution: {integrity: sha512-PoqD3Yms5I0ajuTi071nTW/hpkH3XsdyZzn5gYsPv0qD7mqP3h6Qr+6RiGx+yQ1KcVFyxWdX15uK+DsC0KwvcQ==} engines: {node: '>= 14.15.0'} @@ -6489,8 +6491,8 @@ packages: - table - yaml - /aws-cdk-lib@2.80.0(constructs@10.2.36): - resolution: {integrity: sha512-PoqD3Yms5I0ajuTi071nTW/hpkH3XsdyZzn5gYsPv0qD7mqP3h6Qr+6RiGx+yQ1KcVFyxWdX15uK+DsC0KwvcQ==} + /aws-cdk-lib@2.81.0(constructs@10.1.154): + resolution: {integrity: sha512-jnXvyhyRvoFTQcpZPtZOeOyY7k4Jb1+c83RLFic71KrwL6xxLxzImbS5rnoDOJHaX/otyfDxzQfziOQ7I0kt/g==} engines: {node: '>= 14.15.0'} peerDependencies: constructs: ^10.0.0 @@ -6500,7 +6502,7 @@ packages: '@aws-cdk/asset-node-proxy-agent-v5': 2.0.155 '@balena/dockerignore': 1.0.2 case: 1.6.3 - constructs: 10.2.36 + constructs: 10.1.154 fs-extra: 11.1.1 ignore: 5.2.4 jsonschema: 1.4.1 @@ -6810,7 +6812,7 @@ packages: resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} dependencies: base64-js: 1.5.1 - ieee754: 1.1.13 + ieee754: 1.2.1 isarray: 1.0.0 /buffer@5.7.1: @@ -7274,11 +7276,6 @@ packages: resolution: {integrity: sha512-JStQT84+NhsfamESRExZoGzpq/f/gpq9xpzgtQNOzungs42Gy8kxjfU378MnVoRqwCHwk0vLN37HZjgH5tJo2A==} engines: {node: '>= 14.17.0'} - /constructs@10.2.36: - resolution: {integrity: sha512-7zFxt2ngpm76eqNqvnD5X1RC7/nlZ7NhpRHNJIzNj1MNZH3NSGe6iwHgIZSoK4pjdZktnZELdBZsVo/yqAvv2Q==} - engines: {node: '>= 16.14.0'} - dev: true - /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -7489,6 +7486,10 @@ packages: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} dev: true + /dayjs@1.11.7: + resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + dev: false + /debounce-fn@4.0.0: resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} engines: {node: '>=10'} @@ -7582,7 +7583,7 @@ packages: engines: {node: '>=10'} dependencies: globby: 11.1.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 is-glob: 4.0.3 is-path-cwd: 2.2.0 is-path-inside: 3.0.3 @@ -8793,9 +8794,9 @@ packages: engines: {node: '>=10'} dependencies: cross-spawn: 7.0.3 - get-stream: 6.0.0 + get-stream: 6.0.1 human-signals: 2.1.0 - is-stream: 2.0.0 + is-stream: 2.0.1 merge-stream: 2.0.0 npm-run-path: 4.0.1 onetime: 5.1.2 @@ -9400,7 +9401,7 @@ packages: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.0.5 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 dev: true @@ -9644,7 +9645,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -10230,7 +10230,7 @@ packages: '@jest/expect': 29.5.0 '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.0.0 + '@types/node': 18.11.8 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -10318,6 +10318,46 @@ packages: - supports-color dev: true + /jest-config@29.5.0(@types/node@18.11.8)(ts-node@10.9.1): + resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.22.1 + '@jest/test-sequencer': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.11.8 + babel-jest: 29.5.0(@babel/core@7.22.1) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.5.0 + jest-environment-node: 29.5.0 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-runner: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.5.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1(@swc/core@1.3.19)(@types/node@18.0.0)(typescript@5.0.4) + transitivePeerDependencies: + - supports-color + dev: true + /jest-diff@29.5.0: resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10353,7 +10393,7 @@ packages: '@jest/environment': 29.5.0 '@jest/fake-timers': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.0.0 + '@types/node': 18.11.8 jest-mock: 29.5.0 jest-util: 29.5.0 dev: true @@ -10369,7 +10409,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@types/graceful-fs': 4.1.6 - '@types/node': 18.0.0 + '@types/node': 18.11.8 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -10420,7 +10460,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 18.0.0 + '@types/node': 18.11.8 jest-util: 29.5.0 dev: true @@ -10475,7 +10515,7 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.0.0 + '@types/node': 18.11.8 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -10506,7 +10546,7 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.0.0 + '@types/node': 18.11.8 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -10561,7 +10601,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 18.0.0 + '@types/node': 18.11.8 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -10586,7 +10626,7 @@ packages: dependencies: '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.0.0 + '@types/node': 18.11.8 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -10598,7 +10638,7 @@ packages: resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.0.0 + '@types/node': 18.11.8 jest-util: 29.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -11045,7 +11085,7 @@ packages: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 @@ -11055,7 +11095,7 @@ packages: resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} engines: {node: '>=8'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 parse-json: 5.2.0 strip-bom: 4.0.0 type-fest: 0.6.0 @@ -11625,7 +11665,7 @@ packages: array-differ: 3.0.0 array-union: 2.1.0 arrify: 2.0.1 - minimatch: 3.0.5 + minimatch: 3.1.2 dev: true /mute-stream@0.0.8: @@ -11726,7 +11766,7 @@ packages: dependencies: env-paths: 2.2.1 glob: 7.2.3 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 make-fetch-happen: 10.2.1 nopt: 6.0.0 npmlog: 6.0.2 @@ -12015,7 +12055,7 @@ packages: '@yarnpkg/parsers': 3.0.0-rc.44 '@zkochan/js-yaml': 0.0.6 axios: 1.4.0 - chalk: 4.1.0 + chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 cliui: 7.0.4 @@ -12803,6 +12843,10 @@ packages: engines: {node: '>=0.4.x'} deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -13044,6 +13088,10 @@ packages: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -13222,6 +13270,10 @@ packages: loose-envify: 1.4.0 dev: false + /scmp@2.1.0: + resolution: {integrity: sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==} + dev: false + /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} dev: false @@ -13805,7 +13857,7 @@ packages: engines: {node: '>=10'} dependencies: del: 6.1.1 - is-stream: 2.0.0 + is-stream: 2.0.1 temp-dir: 2.0.0 type-fest: 0.16.0 unique-string: 2.0.0 @@ -14089,6 +14141,23 @@ packages: turbo-windows-arm64: 1.9.9 dev: true + /twilio@4.11.1: + resolution: {integrity: sha512-gU1eZcCbXKz2ltYfpF4V9y7IRhSPvL4fIEpbU9nRDTYCnwVkKQiIhKjX3vqeYbP3H+UhshrH3sHHXN8f0zem4Q==} + engines: {node: '>=14.0'} + dependencies: + axios: 0.26.1 + dayjs: 1.11.7 + https-proxy-agent: 5.0.1 + jsonwebtoken: 9.0.0 + qs: 6.11.0 + scmp: 2.1.0 + url-parse: 1.5.10 + xmlbuilder: 13.0.2 + transitivePeerDependencies: + - debug + - supports-color + dev: false + /type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} @@ -14293,6 +14362,13 @@ packages: dependencies: punycode: 2.3.0 + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + /url@0.10.3: resolution: {integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==} dependencies: @@ -14642,7 +14718,7 @@ packages: /write-file-atomic@2.4.3: resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 imurmurhash: 0.1.4 signal-exit: 3.0.7 dev: true @@ -14676,7 +14752,7 @@ packages: engines: {node: '>=6'} dependencies: detect-indent: 5.0.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 make-dir: 2.1.0 pify: 4.0.1 sort-keys: 2.0.0 @@ -14724,6 +14800,11 @@ packages: sax: 1.2.1 xmlbuilder: 9.0.7 + /xmlbuilder@13.0.2: + resolution: {integrity: sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==} + engines: {node: '>=6.0'} + dev: false + /xmlbuilder@9.0.7: resolution: {integrity: sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==} engines: {node: '>=4.0'} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8e1c54f61..288b647ae 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,7 @@ # https://pnpm.io/pnpm-workspace_yaml packages: - "packages/@eventual/*" + - "packages/@eventual/integrations/*" - "packages/create-eventual" - "apps/*" - "apps/tests/*" diff --git a/tsconfig.json b/tsconfig.json index 4c5fb2884..4f4225982 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,8 +23,8 @@ { "path": "packages/@eventual/core-runtime" }, { "path": "packages/@eventual/core-runtime/tsconfig.cjs.json" }, { "path": "packages/@eventual/core-runtime/tsconfig.test.json" }, - { "path": "packages/@eventual/integrations-slack" }, - { "path": "packages/@eventual/integrations-slack/tsconfig.cjs.json" }, + { "path": "packages/@eventual/integrations/slack" }, + { "path": "packages/@eventual/integrations/slack/tsconfig.cjs.json" }, { "path": "packages/@eventual/project" }, { "path": "packages/@eventual/project/tsconfig.cjs.json" }, { "path": "packages/@eventual/testing" },