From 11418c8e9efb2eed26e5ccc0c61366d4b9a38a3c Mon Sep 17 00:00:00 2001 From: Andrei Riaskov Date: Mon, 10 Jun 2024 00:04:22 +0300 Subject: [PATCH] fix(playground): upgrade to a modern tech stack --- packages/playground/README.md | 19 +- packages/playground/example.env | 17 ++ packages/playground/package.json | 13 +- packages/playground/src/Paywall.ts | 201 ++++++++++++++++----- packages/playground/src/index.ts | 76 +++++--- packages/playground/tsconfig.json | 2 +- yarn.lock | 279 ++++++++++++++++++++++++++++- 7 files changed, 513 insertions(+), 94 deletions(-) create mode 100644 packages/playground/example.env diff --git a/packages/playground/README.md b/packages/playground/README.md index 5bf25fa0..f05db343 100644 --- a/packages/playground/README.md +++ b/packages/playground/README.md @@ -1,21 +1,22 @@ -# Machinomy Playground +# Machinomy Berry Playground -[Machinomy](https://github.com/machinomy/machinomy/tree/master/packages/machinomy) examples. +[![Module type: ESM](https://img.shields.io/badge/module%20type-esm-brightgreen)]() +[![Module type: NodeVersion](https://img.shields.io/badge/Node.js->=21-brightgreen)]() -Web site: [machinomy.com](http://machinomy.com). -Twitter: [@machinomy](http://twitter.com/machinomy). -Support/Discussion: [Gitter](https://gitter.im/machinomy/machinomy). +[Machinomy](https://github.com/ARyaskov/machinomy/tree/master/packages/machinomy) examples. + +### ! Upgrading to v2 is in progress! Expect bugs ! :exclamation: -Please, pay attention, this package is the part of [Machinomy Monorepo](https://github.com/machinomy/machinomy) and it's intended to use with other monorepo's packages. +Please, pay attention, this package is the part of [Machinomy Monorepo](https://github.com/ARyaskov/machinomy) and it's intended to use with other monorepo's packages. :no_entry: You **should not** git clone this repository alone :white_check_mark: You **should** git clone the main repository via ``` -git clone https://github.com/machinomy/machinomy.git +git clone https://github.com/ARyaskov/machinomy.git or -git clone git@github.com:machinomy/machinomy.git +git clone git@github.com:ARyaskov/machinomy.git ``` -**For documentation, usage and contributing please see [Machinomy Monorepo](https://github.com/machinomy/machinomy).** +**For documentation, usage and contributing please see [Machinomy Monorepo](https://github.com/ARyaskov/machinomy).** diff --git a/packages/playground/example.env b/packages/playground/example.env new file mode 100644 index 00000000..177a09ab --- /dev/null +++ b/packages/playground/example.env @@ -0,0 +1,17 @@ +HOST= +PORT= +GATEWAY_URL= +# Available values: Ethereum, BNB Smart Chain, Polygon, Sepolia, Binance Smart Chain Testnet, Polygon Amoy +NETWORK= +# /* You may generate it on https://iancoleman.io/bip39/, but use it just for testing purposes, no real money! +ACCOUNT_MNEMONIC= +ACCOUNT_PRIVATE_KEY_0= +ACCOUNT_PUBLIC_KEY_0= +ACCOUNT_ADDRESS_0= +# */ You may generate it on https://iancoleman.io/bip39/, but use it just for testing purposes, no real money! +# Use any ETH RPC to get your API key (e.g. Alchemy or Infura). Use https-version of URL. +RPC_URL= +POLYGON_RPC_URL= +POLYGON_AMOY_RPC_URL= +# Use https://amoy.polygonscan.com/ to get your API key +POLYGONSCAN_API_KEY= diff --git a/packages/playground/package.json b/packages/playground/package.json index 2c6ea587..a6e02ec4 100644 --- a/packages/playground/package.json +++ b/packages/playground/package.json @@ -13,11 +13,12 @@ ], "license": "Apache-2.0", "scripts": { - "build": "tsc --project tsconfig.json", + "build": "yarn format && tsc --project tsconfig.json", "clean": "rm -rf dist/", - "lint": "tslint --format stylish --project . --exclude './node_modules/**/*.ts'", + "format": "prettier --write \"src/**/*.ts\"", "test": "exit 0", - "coverage": "exit 0" + "coverage": "exit 0", + "start": "yarn format && tsx src/index.ts" }, "dependencies": { "@machinomy/types-ethereumjs-util": "^0.0.12", @@ -36,7 +37,11 @@ "morgan": "^1.10.0", "sqlite3": "^5.1.7", "typescript": "*", - "url-join": "^4.0.1" + "url-join": "^4.0.1", + "viem": "*" + }, + "devDependencies": { + "tsx": "*" }, "resolutions": { "sqlite3": "^5.1.7" diff --git a/packages/playground/src/Paywall.ts b/packages/playground/src/Paywall.ts index c24591a5..ce164796 100644 --- a/packages/playground/src/Paywall.ts +++ b/packages/playground/src/Paywall.ts @@ -3,8 +3,6 @@ import dotenv from 'dotenv' import express from 'express' import { URL } from 'url' import urljoin from 'url-join' -import fetcher from 'machinomy/lib/util/fetcher' -import { BigNumber } from 'bignumber.js' const log = debug('paywall') @@ -16,26 +14,35 @@ dotenv.config() const GATEWAY_URL = process.env.GATEWAY_URL -function acceptUrl (base: URL) { +function acceptUrl(base: URL) { return urljoin(base.toString(), PREFIX, 'accept') } -function isAcceptUrl (url: string) { +function isAcceptUrl(url: string) { return url === PREFIX + '/accept' } -function paywallHeaders (receiverAccount: string, gatewayUri: string, price: BigNumber) { +function paywallHeaders( + receiverAccount: `0x${string}`, + gatewayUri: string, + price: bigint, +) { let headers = {} as any - headers['paywall-version'] = '0.1' + headers['paywall-version'] = '1.0' headers['paywall-price'] = price.toString() headers['paywall-address'] = receiverAccount headers['paywall-gateway'] = gatewayUri return headers } -function paywallHeadersToken (receiverAccount: string, gatewayUri: string, price: BigNumber, tokenContract: string) { +function paywallHeadersToken( + receiverAccount: `0x${string}`, + gatewayUri: string, + price: bigint, + tokenContract: `0x${string}`, +) { let headers = {} as any - headers['paywall-version'] = '0.1' + headers['paywall-version'] = '1.0' headers['paywall-price'] = price.toString() headers['paywall-address'] = receiverAccount headers['paywall-gateway'] = gatewayUri @@ -43,18 +50,28 @@ function paywallHeadersToken (receiverAccount: string, gatewayUri: string, price return headers } -function parseToken (req: express.Request, callback: (error: string | null, token?: string, meta?: string, price?: BigNumber) => void) { +function parseToken( + req: express.Request, + callback: ( + error: string | null, + token?: string, + meta?: string, + price?: bigint, + ) => void, +) { let content = req.get(HEADER_NAME) if (content) { let authorization = content.split(' ') let type = authorization[0].toLowerCase() let token = authorization[1] let meta = authorization[2] - let price = new BigNumber(authorization[3]) + let price = BigInt(authorization[3]) if (type === TOKEN_NAME) { callback(null, token, meta, price) } else { - callback(`Invalid ${HEADER_NAME} token name present. Expected ${TOKEN_NAME}, got ${type}`) + callback( + `Invalid ${HEADER_NAME} token name present. Expected ${TOKEN_NAME}, got ${type}`, + ) } } else { callback(`No ${HEADER_NAME} header present`) @@ -62,35 +79,54 @@ function parseToken (req: express.Request, callback: (error: string | null, toke } export default class Paywall { - receiverAccount: string + receiverAccount: `0x${string}` base: URL - constructor (receiverAccount: string, base: URL) { + constructor(receiverAccount: `0x${string}`, base: URL) { this.receiverAccount = receiverAccount this.base = base } - paymentRequired (price: BigNumber, req: express.Request, res: express.Response): void { + paymentRequired( + price: bigint, + req: express.Request, + res: express.Response, + ): void { log('Require payment ' + price.toString() + ' for ' + req.path) - res.status(402) + res + .status(402) .set(paywallHeaders(this.receiverAccount, acceptUrl(this.base), price)) .send('Payment Required') .end() } - guard (price: BigNumber, callback: express.RequestHandler): express.RequestHandler { - let _guard = async (fixedPrice: BigNumber, req: express.Request, res: express.Response, next: express.NextFunction, error: any, token?: string, meta?: string) => { + guard( + price: bigint, + callback: express.RequestHandler, + ): express.RequestHandler { + let _guard = async ( + fixedPrice: bigint, + req: express.Request, + res: express.Response, + next: express.NextFunction, + error: any, + token?: string, + meta?: string, + ) => { if (error || !token) { log(error) this.paymentRequired(fixedPrice, req, res) } else { - const response = await fetcher.fetch(`${GATEWAY_URL}${PREFIX}/verify/${token}`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json' + const response = await fetch( + `${GATEWAY_URL}${PREFIX}/verify/${token}`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', }, - credentials: 'include' - }) + ) if (response.status >= 200 && response.status < 300) { log('Got valid paywall token') @@ -102,7 +138,11 @@ export default class Paywall { } } - return (req: express.Request, res: express.Response, next: express.NextFunction) => { + return ( + req: express.Request, + res: express.Response, + next: express.NextFunction, + ) => { log(`Requested ${req.path}`) parseToken(req, (error, token, meta) => { return _guard(price, req, res, next, error, token!, meta!) @@ -110,24 +150,29 @@ export default class Paywall { } } - paymentInvalid (price: BigNumber, req: express.Request, res: express.Response) { - res.status(409) // Conflict + paymentInvalid(price: bigint, req: express.Request, res: express.Response) { + res + .status(409) // Conflict .set(paywallHeaders(this.receiverAccount, acceptUrl(this.base), price)) .send('Payment Invalid') .end() } - middleware () { - let handler: express.RequestHandler = async (req: express.Request, res: express.Response, next: express.NextFunction) => { + middleware() { + let handler: express.RequestHandler = async ( + req: express.Request, + res: express.Response, + next: express.NextFunction, + ) => { log('Called payment handler') try { - const response = await fetcher.fetch(`${GATEWAY_URL}${PREFIX}/accept`, { + const response = await fetch(`${GATEWAY_URL}${PREFIX}/accept`, { method: 'POST', headers: { - 'Content-Type': 'application/json' + 'Content-Type': 'application/json', }, credentials: 'include', - body: JSON.stringify(req.body) + body: JSON.stringify(req.body), }) log('Accept request') const json = await response.json() @@ -138,7 +183,11 @@ export default class Paywall { } } - return (req: express.Request, res: express.Response, next: express.NextFunction) => { + return ( + req: express.Request, + res: express.Response, + next: express.NextFunction, + ) => { if (isAcceptUrl(req.url)) { handler(req, res, next) } else { @@ -147,34 +196,76 @@ export default class Paywall { } } - paymentRequiredToken (price: BigNumber, tokenContract: string, req: express.Request, res: express.Response): void { + paymentRequiredToken( + price: bigint, + tokenContract: `0x${string}`, + req: express.Request, + res: express.Response, + ): void { log('Require payment ' + price.toString() + ' for ' + req.path) - res.status(402) - .set(paywallHeadersToken(this.receiverAccount, acceptUrl(this.base), price, tokenContract)) + res + .status(402) + .set( + paywallHeadersToken( + this.receiverAccount, + acceptUrl(this.base), + price, + tokenContract, + ), + ) .send('Payment Required') .end() } - paymentInvalidToken (price: BigNumber, tokenContract: string, req: express.Request, res: express.Response) { - res.status(409) // Conflict - .set(paywallHeadersToken(this.receiverAccount, acceptUrl(this.base), price, tokenContract)) + paymentInvalidToken( + price: bigint, + tokenContract: `0x${string}`, + req: express.Request, + res: express.Response, + ) { + res + .status(409) // Conflict + .set( + paywallHeadersToken( + this.receiverAccount, + acceptUrl(this.base), + price, + tokenContract, + ), + ) .send('Payment Invalid') .end() } - guardToken (price: BigNumber, tokenContract: string, callback: express.RequestHandler): express.RequestHandler { - let _guard = async (fixedPrice: BigNumber, req: express.Request, res: express.Response, next: express.NextFunction, error: any, _tokenContract: string, token?: string, meta?: string) => { + guardToken( + price: bigint, + tokenContract: `0x${string}`, + callback: express.RequestHandler, + ): express.RequestHandler { + let _guard = async ( + fixedPrice: bigint, + req: express.Request, + res: express.Response, + next: express.NextFunction, + error: any, + _tokenContract: `0x${string}`, + token?: string, + meta?: string, + ) => { if (error || !token) { log(error) this.paymentRequiredToken(fixedPrice, _tokenContract, req, res) } else { - const response = await fetcher.fetch(`${GATEWAY_URL}${PREFIX}/verify/${token}`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json' + const response = await fetch( + `${GATEWAY_URL}${PREFIX}/verify/${token}`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', }, - credentials: 'include' - }) + ) if (response.status >= 200 && response.status < 300) { log('Got valid paywall token') @@ -186,12 +277,24 @@ export default class Paywall { } } - return (req: express.Request, res: express.Response, next: express.NextFunction) => { + return ( + req: express.Request, + res: express.Response, + next: express.NextFunction, + ) => { log(`Requested ${req.path}`) parseToken(req, (error, token, meta) => { - return _guard(price, req, res, next, error, tokenContract, token!, meta!) + return _guard( + price, + req, + res, + next, + error, + tokenContract, + token!, + meta!, + ) }) } } - } diff --git a/packages/playground/src/index.ts b/packages/playground/src/index.ts index 00e35881..a17a3be9 100644 --- a/packages/playground/src/index.ts +++ b/packages/playground/src/index.ts @@ -1,34 +1,47 @@ +import 'dotenv/config' import express from 'express' import bodyParser from 'body-parser' -import dotenv from 'dotenv' import HDWalletProvider from '@machinomy/hdwallet-provider' -import contracts from '@machinomy/contracts' +import { + Network, + NetworkType, + networkByName, + DefaultUnidirectionalAddress, + Unidirectional, +} from '@riaskov/machinomy-contracts' import Paywall from './Paywall' import morgan from 'morgan' import url from 'url' -import { BigNumber } from 'bignumber.js' - -async function main () { - dotenv.config() +import { Chain, createWalletClient, http } from 'viem' +async function main() { const HOST = String(process.env.HOST) const PORT = Number(process.env.PORT) - const MNEMONIC = String(process.env.MNEMONIC).trim() - const PROVIDER_URL = String(process.env.PROVIDER_URL) - const GATEWAY_URL = String(process.env.GATEWAY_URL) + const MNEMONIC = String(process.env.ACCOUNT_MNEMONIC).trim() + const RPC_URL = String(process.env.RPC_URL).trim() + const GATEWAY_URL = String(process.env.GATEWAY_URL).trim() + const NETWORK = String(process.env.NETWORK).trim() + const chain: any = networkByName(NETWORK) as NetworkType - const provider = HDWalletProvider.mnemonic({ - mnemonic: MNEMONIC!, - rpc: PROVIDER_URL + const walletClient = createWalletClient({ + chain: chain, + transport: http(RPC_URL), }) - const account = (await provider.getAddresses())[0] + + const addresses = await walletClient.getAddresses() + + const address = addresses[0] const base = new url.URL(GATEWAY_URL) - const paywall = new Paywall(account, base) + const paywall = new Paywall(address, base) - const instanceTestToken: contracts.TestToken.Contract = await contracts.TestToken.contract(provider).deployed() + const unidirectional = new Unidirectional({ + network: chain, + httpRpcUrl: RPC_URL, + mnemonic: MNEMONIC, + }) - const tokenContract = instanceTestToken.address + // const tokenContract = instanceTestToken.address let app = express() app.use(bodyParser.json()) @@ -36,23 +49,28 @@ async function main () { app.use(paywall.middleware()) app.use(morgan('combined')) - app.get('/hello', paywall.guard(new BigNumber(1000), (req: express.Request, res: express.Response) => { - res.end('Thank you for the payment!') - })) + app.get( + '/hello', + paywall.guard(1000n, (req: express.Request, res: express.Response) => { + res.end('Thank you for the payment!') + }), + ) - app.get('/hello-token', paywall.guardToken(new BigNumber(5), tokenContract, (req: express.Request, res: express.Response) => { - res.end('Thank you for the payment!') - })) + // app.get('/hello-token', paywall.guardToken(5n, tokenContract, (req: express.Request, res: express.Response) => { + // res.end('Thank you for the payment!') + // })) app.listen(PORT, () => { console.log(`Waiting at http(s)://${HOST}:${PORT}/hello`) - console.log(`Waiting at http(s)://${HOST}:${PORT}/hello-token`) + // console.log(`Waiting at http(s)://${HOST}:${PORT}/hello-token`) }) } -main().then(() => { - // Do Nothing -}).catch(error => { - console.error(error) - process.exit(1) -}) +main() + .then(() => { + // Do Nothing + }) + .catch((error) => { + console.error(error) + process.exit(1) + }) diff --git a/packages/playground/tsconfig.json b/packages/playground/tsconfig.json index 1aa25dc3..f21cce93 100644 --- a/packages/playground/tsconfig.json +++ b/packages/playground/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig", + "extends": "../../tsconfig.esm.json", "compilerOptions": { "sourceRoot": "src/", "outDir": "dist/", diff --git a/yarn.lock b/yarn.lock index 0002770b..d5a54304 100644 --- a/yarn.lock +++ b/yarn.lock @@ -341,6 +341,167 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/aix-ppc64@npm:0.21.4" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/android-arm64@npm:0.21.4" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/android-arm@npm:0.21.4" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/android-x64@npm:0.21.4" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/darwin-arm64@npm:0.21.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/darwin-x64@npm:0.21.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/freebsd-arm64@npm:0.21.4" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/freebsd-x64@npm:0.21.4" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/linux-arm64@npm:0.21.4" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/linux-arm@npm:0.21.4" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/linux-ia32@npm:0.21.4" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/linux-loong64@npm:0.21.4" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/linux-mips64el@npm:0.21.4" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/linux-ppc64@npm:0.21.4" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/linux-riscv64@npm:0.21.4" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/linux-s390x@npm:0.21.4" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/linux-x64@npm:0.21.4" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/netbsd-x64@npm:0.21.4" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/openbsd-x64@npm:0.21.4" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/sunos-x64@npm:0.21.4" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/win32-arm64@npm:0.21.4" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/win32-ia32@npm:0.21.4" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.21.4": + version: 0.21.4 + resolution: "@esbuild/win32-x64@npm:0.21.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@ethereumjs/common@npm:^3.2.0": version: 3.2.0 resolution: "@ethereumjs/common@npm:3.2.0" @@ -1922,8 +2083,10 @@ __metadata: express: "npm:^4.19.2" morgan: "npm:^1.10.0" sqlite3: "npm:^5.1.7" + tsx: "npm:*" typescript: "npm:*" url-join: "npm:^4.0.1" + viem: "npm:*" languageName: unknown linkType: soft @@ -6503,6 +6666,86 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:~0.21.4": + version: 0.21.4 + resolution: "esbuild@npm:0.21.4" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.4" + "@esbuild/android-arm": "npm:0.21.4" + "@esbuild/android-arm64": "npm:0.21.4" + "@esbuild/android-x64": "npm:0.21.4" + "@esbuild/darwin-arm64": "npm:0.21.4" + "@esbuild/darwin-x64": "npm:0.21.4" + "@esbuild/freebsd-arm64": "npm:0.21.4" + "@esbuild/freebsd-x64": "npm:0.21.4" + "@esbuild/linux-arm": "npm:0.21.4" + "@esbuild/linux-arm64": "npm:0.21.4" + "@esbuild/linux-ia32": "npm:0.21.4" + "@esbuild/linux-loong64": "npm:0.21.4" + "@esbuild/linux-mips64el": "npm:0.21.4" + "@esbuild/linux-ppc64": "npm:0.21.4" + "@esbuild/linux-riscv64": "npm:0.21.4" + "@esbuild/linux-s390x": "npm:0.21.4" + "@esbuild/linux-x64": "npm:0.21.4" + "@esbuild/netbsd-x64": "npm:0.21.4" + "@esbuild/openbsd-x64": "npm:0.21.4" + "@esbuild/sunos-x64": "npm:0.21.4" + "@esbuild/win32-arm64": "npm:0.21.4" + "@esbuild/win32-ia32": "npm:0.21.4" + "@esbuild/win32-x64": "npm:0.21.4" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/83276c7b82bc3415199da91a84a01cf287d4912f2c02fead9c0542d6bda463d6d152cb7fb86f680dae72dc701c864a8963069ddb9e2b344948595cc87f81c4f1 + languageName: node + linkType: hard + "escalade@npm:^3.1.1, escalade@npm:^3.1.2": version: 3.1.2 resolution: "escalade@npm:3.1.2" @@ -7974,7 +8217,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.2": +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -7994,7 +8237,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -8167,6 +8410,15 @@ __metadata: languageName: node linkType: hard +"get-tsconfig@npm:^4.7.5": + version: 4.7.5 + resolution: "get-tsconfig@npm:4.7.5" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 10c0/a917dff2ba9ee187c41945736bf9bbab65de31ce5bc1effd76267be483a7340915cff232199406379f26517d2d0a4edcdbcda8cca599c2480a0f2cf1e1de3efa + languageName: node + linkType: hard + "get-value@npm:^2.0.3, get-value@npm:^2.0.6": version: 2.0.6 resolution: "get-value@npm:2.0.6" @@ -13484,6 +13736,13 @@ __metadata: languageName: node linkType: hard +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab + languageName: node + linkType: hard + "resolve-url@npm:^0.2.1": version: 0.2.1 resolution: "resolve-url@npm:0.2.1" @@ -15339,6 +15598,22 @@ __metadata: languageName: node linkType: hard +"tsx@npm:*": + version: 4.15.1 + resolution: "tsx@npm:4.15.1" + dependencies: + esbuild: "npm:~0.21.4" + fsevents: "npm:~2.3.3" + get-tsconfig: "npm:^4.7.5" + dependenciesMeta: + fsevents: + optional: true + bin: + tsx: dist/cli.mjs + checksum: 10c0/ae361b98ba4b99cab3faa5d448a80d6c44c2a88768c1dea11ccf7c444ccd2253ae2914744a5cdcb7aa5f6a3a18a2cb933623ae467b9b0b767c103ee913b0fdd1 + languageName: node + linkType: hard + "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0"