diff --git a/README.md b/README.md index a616d65..f86e388 100644 --- a/README.md +++ b/README.md @@ -18,41 +18,52 @@ To get started follow the steps below: 1. Clone this repo & install dependencies -``` -git clone https://github.com/BuidlGuidl/grants.buidlguidl.com.git -cd grants.buidlguidl.com -yarn install -``` + ``` + git clone https://github.com/BuidlGuidl/grants.buidlguidl.com.git + cd grants.buidlguidl.com + yarn install + ``` 2. Set up your environment variables (and optionally, a local Firebase instance): -Copy the `packages/nextjs/.env.example` file to `packages/nextjs/.env.local` and fill in the required environment variables. + Copy the `packages/nextjs/.env.example` file to `packages/nextjs/.env.local` and fill in the required environment variables. -(Optional) Start the firebase emulators (vs set up a live Firebase instance). You will need to install the [firebase CLI](https://firebase.google.com/docs/cli#install_the_firebase_cli) and run the following command: -```bash -# You might need to add a real "--project " (run firebase projects:list) -firebase emulators:start -``` + (Optional) Start the firebase emulators (vs set up a live Firebase instance). You will need to install the [firebase CLI](https://firebase.google.com/docs/cli#install_the_firebase_cli) and run the following command: -3. Run a local network in the first terminal: + ```bash + # You might need to add a real "--project " (run firebase projects:list) + firebase emulators:start + ``` -``` -yarn chain -``` +3. Seed data in your local Firebase instance: -This command starts a local Ethereum network using Hardhat. The network runs on your local machine and can be used for testing and development. You can customize the network configuration in `hardhat.config.ts`. + Copy the `packages/local_db/seed.sample.json` to `packages/local_db/seed.json` and tweak the data as you see fit. Then run the following command: -4. On a second terminal, deploy the test contract: + ```bash + yarn seed + ``` -``` -yarn deploy -``` + To seed it to empty _*live*_ firestore instance you can use `yarn seed --force-prod`. If there is data in the live instance, it will not seed it again to bypass it use `yarn seed --reset --force-prod` -This command deploys a test smart contract to the local network. The contract is located in `packages/hardhat/contracts` and can be modified to suit your needs. The `yarn deploy` command uses the deploy script located in `packages/hardhat/deploy` to deploy the contract to the network. You can also customize the deploy script. +4. Run a local network in the first terminal: -4. On a third terminal, start your NextJS app: + ```bash + yarn chain + ``` -``` -yarn start -``` + This command starts a local Ethereum network using Hardhat. The network runs on your local machine and can be used for testing and development. You can customize the network configuration in `hardhat.config.ts`. -Visit your app on: `http://localhost:3000`. You can interact with your smart contract using the `/debug` page. You can tweak the app config in `packages/nextjs/scaffold.config.ts`. +5. On a second terminal, deploy the test contract: + + ``` + yarn deploy + ``` + + This command deploys a test smart contract to the local network. The contract is located in `packages/hardhat/contracts` and can be modified to suit your needs. The `yarn deploy` command uses the deploy script located in `packages/hardhat/deploy` to deploy the contract to the network. You can also customize the deploy script. + +6. On a third terminal, start your NextJS app: + + ``` + yarn start + ``` + + Visit your app on: `http://localhost:3000`. You can interact with your smart contract using the `/debug` page. You can tweak the app config in `packages/nextjs/scaffold.config.ts`. diff --git a/package.json b/package.json index 8fafb49..4cc4f1f 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "workspaces": { "packages": [ "packages/hardhat", - "packages/nextjs" + "packages/nextjs", + "packages/local_db" ] }, "scripts": { @@ -28,7 +29,8 @@ "postinstall": "husky install", "precommit": "lint-staged", "vercel": "yarn workspace @se-2/nextjs vercel", - "vercel:yolo": "yarn workspace @se-2/nextjs vercel:yolo" + "vercel:yolo": "yarn workspace @se-2/nextjs vercel:yolo", + "seed": "yarn workspace @se-2/local_db seed" }, "packageManager": "yarn@3.2.3", "devDependencies": { diff --git a/packages/local_db/.gitignore b/packages/local_db/.gitignore new file mode 100644 index 0000000..9c88718 --- /dev/null +++ b/packages/local_db/.gitignore @@ -0,0 +1,21 @@ +# dependencies +/node_modules + +# build +/dist + +# misc +.DS_Store + +# local env files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# typescript +*.tsbuildinfo + +# seed +seed.json diff --git a/packages/local_db/firestoreDB.ts b/packages/local_db/firestoreDB.ts new file mode 100644 index 0000000..bc98bdd --- /dev/null +++ b/packages/local_db/firestoreDB.ts @@ -0,0 +1,24 @@ +import { applicationDefault, getApps, initializeApp } from "firebase-admin/app"; +import { getFirestore } from "firebase-admin/firestore"; + +const getFirestoreConnector = () => { + if (getApps().length > 0) { + return getFirestore(); + } + + if (process.env.GOOGLE_APPLICATION_CREDENTIALS) { + console.log("Initializing LIVE Firestore"); + initializeApp({ + credential: applicationDefault(), + }); + } else { + console.log("Initializing local Firestore instance"); + initializeApp({ + projectId: process.env.FIREBASE_PROJECT_ID, + }); + } + + return getFirestore(); +}; + +export { getFirestoreConnector }; diff --git a/packages/local_db/index.ts b/packages/local_db/index.ts new file mode 100644 index 0000000..b5c2f65 --- /dev/null +++ b/packages/local_db/index.ts @@ -0,0 +1,34 @@ +import * as dotenv from "dotenv"; +dotenv.config({ path: "../nextjs/.env.local" }); + +import { getFirestoreConnector } from "./firestoreDB.js"; +import { importSeed } from "./utils.js"; + +const seedData = async () => { + const firestoreDB = getFirestoreConnector(); + + const args = process.argv.slice(2); + const flags = args.filter((arg) => arg.startsWith("--")); + const isForceProd = flags.includes("--force-prod"); + + if (process.env.GOOGLE_APPLICATION_CREDENTIALS) { + console.log("Connected to LIVE Firestore"); + if (!isForceProd) { + console.log("To update Live firestore use `yarn seed --force-prod`"); + console.log("Exiting..."); + return; + } + } + + try { + await importSeed(firestoreDB); + } catch (error) { + console.error("Error seeding the data:", error); + } +}; + +try { + seedData(); +} catch (error) { + console.error("Error initializing seed data:", error); +} diff --git a/packages/local_db/package.json b/packages/local_db/package.json new file mode 100644 index 0000000..3f681f1 --- /dev/null +++ b/packages/local_db/package.json @@ -0,0 +1,23 @@ +{ + "name": "@se-2/local_db", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "seed": "tsx index.ts" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "dotenv": "^16.4.1", + "firebase-admin": "^11.11.1" + }, + "devDependencies": { + "@types/node": "^20.11.16", + "tsx": "^4.7.0", + "typescript": "^5.3.3" + } +} diff --git a/packages/local_db/seed.sample.json b/packages/local_db/seed.sample.json new file mode 100644 index 0000000..14edf18 --- /dev/null +++ b/packages/local_db/seed.sample.json @@ -0,0 +1,173 @@ +{ + "version": "1.1.1", + "users": { + "0x60583563D5879C2E59973E5718c7DE2147971807": { + "creationTimestamp": 1633088553221, + "role": "admin", + "ens": "carletex.eth", + "function": "damageDealer", + "status": { + "text": "My Status", + "timestamp": 1657208443047 + }, + "builderCohort": [ + { + "id": "0x2eA63c9C9C114ae85b1027697A906420a23e8572", + "name": "Sand Garden", + "url": "https://sandgarden.buidlguidl.com" + } + ], + "stream": { + "streamAddress": "0xCC756617C97a05aC472fD8Ab92C88F2A9cb681EC", + "streamAddress_rinkeby": "0xCC756617C97a05aC472fD8Ab92C88F2A9cb681EC", + "streamAddress_localhost": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "cap": "0.5", + "frequency": 2592000, + "lastContract": 1654720543, + "lastIndexedBlock": 10983432, + "balance": "0.21" + }, + "builds": [ + { + "id": "06bb3c9d-784b-44d1-b7e2-1ae5affdfa8b", + "submittedTimestamp": 1658587661752 + } + ] + }, + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": { + "creationTimestamp": 1633088553223, + "role": "builder", + "function": "damageDealer", + "socialLinks": { + "telegram": "test", + "twitter": "test" + }, + "builderCohort": [ + { + "id": "0x2eA63c9C9C114ae85b1027697A906420a23e8572", + "name": "Sand Garden", + "url": "https://sandgarden.buidlguidl.com" + }, + { + "id": "0xaCc9Cc4983D57cea0748B8CD1Adb87Ada5b1a67c", + "name": "Not Just Notfellows", + "url": "https://not-just-notfellows.buidlguidl.com/" + } + ], + "stream": { + "streamAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "cap": "0.5", + "frequency": 2592000, + "lastContract": 1654720543, + "lastIndexedBlock": 10983432, + "balance": "0.5" + } + }, + "0x34aA3F359A9D614239015126635CE7732c18fDF3": { + "creationTimestamp": 1648653481405, + "role": "builder", + "function": "knight", + "ens": "austingriffith.eth" + }, + "0x72fC8b63692B516D0D8748d469faB65C7e4e7389": { + "creationTimestamp": 1648653501156, + "role": "builder", + "function": "cadets", + "ensClaimData": { + "submittedTimestamp": 1648736241913, + "provided": true + } + } + }, + "builds": { + "06bb3c9d-784b-44d1-b7e2-1ae5affdfa8b": { + "branch": "https://github.com/moonshotcollective/scaffold-directory", + "demoUrl": "https://speedrunethereum.com/", + "videoUrl": "", + "desc": "👩‍🏫 Learn how to build on Ethereum completing the scaffold-eth challenges.", + "image": "https://storage.googleapis.com/download/storage/v1/b/buidlguidl-v3.appspot.com/o/builds%2F0032da28a08871cbcb2922b00.png?generation=1647284971917513&alt=media", + "name": "🏃‍♀️ SpeedRunEthereum.com", + "builder": "0x60583563D5879C2E59973E5718c7DE2147971807", + "featured": false, + "submittedTimestamp": 1658587661752, + "likes": ["0x60583563D5879C2E59973E5718c7DE2147971807"] + } + }, + "events": [ + { + "type": "build.submit", + "timestamp": 1658587661754, + "signature": "0x206e5f766fb427599acacb41d45dfb794d95076f3af8519008328cef9c6bf3b4137a87ba73368f1e16b19674edddb6860093e601e6576c1b427fcc8e7ffba4cb1b", + "payload": { + "userAddress": "0x60583563D5879C2E59973E5718c7DE2147971807", + "buildUrl": "https://github.com/moonshotcollective/scaffold-directory", + "name": "🏃‍♀️ SpeedRunEthereum.com", + "buildId": "06bb3c9d-784b-44d1-b7e2-1ae5affdfa8b" + } + }, + { + "type": "stream.withdraw", + "timestamp": 1660983774000, + "payload": { + "userAddress": "0x60583563D5879C2E59973E5718c7DE2147971807", + "amount": "0.5", + "block": "13845820", + "reason": "Test withdraw", + "streamAddress": "0xCC756617C97a05aC472fD8Ab92C88F2A9cb681EC", + "tx": "0x6be7d0065eb1ec0f5e9296b82b527e4b1b8fec91d890066d43857044443a9969" + } + } + ], + "cohorts": { + "0x2eA63c9C9C114ae85b1027697A906420a23e8572": { + "chainId": 10, + "name": "Sand Garden", + "url": "https://sandgarden.buidlguidl.com" + }, + "0x2Be18e07C7be0a2CC408C9E02C90203B2052D7DE": { + "chainId": 1, + "name": "Jessy's Hacker House", + "url": "https://hackerhouse.buidlguidl.com/" + } + }, + "config": { + "streams": { + "lastIndexedBlock": 10616289 + } + }, + "notifications": [ + { + "criteria": { + "minBuilds": 1, + "daysJoinedBefore": 30, + "hasStream": true + }, + "title": "New cohort coming", + "content": "Some 'New cohort coming' **markdown** content with [links](https://buidlguidl.com)", + "active": true + }, + { + "criteria": { + "daysJoinedAfter": 2 + }, + "title": "Onboarding Batch!", + "content": "Some 'Onboarding Batch' **markdown** content with [links](https://buidlguidl.com)", + "active": true + }, + { + "criteria": { + "hasStream": true + }, + "component": "OnboardingBatch", + "active": true + }, + { + "criteria": { + "hasStream": true + }, + "title": "Announment for stremead builders", + "content": "Some 'Announment for stremead builders' **markdown** content with [links](https://buidlguidl.com)", + "active": false + } + ] +} diff --git a/packages/local_db/tsconfig.json b/packages/local_db/tsconfig.json new file mode 100644 index 0000000..280cc92 --- /dev/null +++ b/packages/local_db/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "strict": true, + "noUncheckedIndexedAccess": true, + "skipLibCheck": true, + "target": "es2022", + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + "moduleResolution": "NodeNext", + "esModuleInterop": true, + "module": "NodeNext", + "outDir": "dist", + "exclude": ["node_modules", "dist"] + } +} diff --git a/packages/local_db/utils.ts b/packages/local_db/utils.ts new file mode 100644 index 0000000..9bdde60 --- /dev/null +++ b/packages/local_db/utils.ts @@ -0,0 +1,69 @@ +import { Firestore } from "firebase-admin/firestore"; +import { constants, copyFileSync, existsSync, readFileSync } from "fs"; + +type SeedData = { + version: string; + users: Record; + builds: Record; + events: Record; + config: Record; + cohorts: Record; + notifications: Record; +}; + +async function importCollectionData( + database: Firestore, + collectionName: string, + data: Record, +) { + for (const [id, docData] of Object.entries(data)) { + await database.collection(collectionName).doc(id).set(docData); + } +} + +export const importSeed = async (database: Firestore) => { + const SEED_PATH = "./seed.json"; + const SEED_EXAMPLE_PATH = "./seed.sample.json"; + + const args = process.argv.slice(2); + const flags = args.filter((arg) => arg.startsWith("--")); + const isReset = flags.includes("--reset"); + + const existingCollections = await database.listCollections(); + if (existingCollections.length > 0) { + if (!isReset) { + console.log("*** Local Firestore is not empty. Skipping seed import..."); + console.log("To reset the local Firestore, run `yarn seed --reset`"); + return; + } + } + + if (!existsSync(SEED_PATH)) { + copyFileSync(SEED_EXAMPLE_PATH, SEED_PATH, constants.COPYFILE_EXCL); + } + + const exampleSeed: SeedData = JSON.parse( + readFileSync(SEED_EXAMPLE_PATH, "utf8"), + ); + const currentSeed: SeedData = JSON.parse(readFileSync(SEED_PATH, "utf8")); + + const needsToUpdateDbVersion = exampleSeed.version !== currentSeed.version; + if (needsToUpdateDbVersion) { + console.log("New local db version: overwriting existing seed file"); + copyFileSync(SEED_EXAMPLE_PATH, SEED_PATH); + } + + const seedToImport = needsToUpdateDbVersion ? exampleSeed : currentSeed; + console.log("Importing seed to Firestore emulator...."); + + await Promise.all([ + importCollectionData(database, "users", seedToImport.users), + importCollectionData(database, "builds", seedToImport.builds), + importCollectionData(database, "events", seedToImport.events), + importCollectionData(database, "config", seedToImport.config), + importCollectionData(database, "cohorts", seedToImport.cohorts), + importCollectionData(database, "notifications", seedToImport.notifications), + ]); + + console.log("Seed completed successfully! 🌱"); +}; diff --git a/packages/nextjs/.env.example b/packages/nextjs/.env.example index b7cf202..0ebdc8c 100644 --- a/packages/nextjs/.env.example +++ b/packages/nextjs/.env.example @@ -8,3 +8,6 @@ GOOGLE_APPLICATION_CREDENTIALS="////firebaseServiceAccountKey.json" # If you want to connect to the firebase emulator FIRESTORE_EMULATOR_HOST=localhost:8080 + +# Setup you project id for firebase +FIREBASE_PROJECT_ID="buidlguidl-v3" diff --git a/packages/nextjs/services/database/firestoreDB.ts b/packages/nextjs/services/database/firestoreDB.ts index a7c82cb..0685a05 100644 --- a/packages/nextjs/services/database/firestoreDB.ts +++ b/packages/nextjs/services/database/firestoreDB.ts @@ -17,7 +17,7 @@ const getFirestoreConnector = () => { // ToDo. Something is not working. Getting "Error: Could not load the default credentials." console.log("Initializing local Firestore instance"); initializeApp({ - projectId: "buidlguidl-v3", + projectId: process.env.FIREBASE_PROJECT_ID, }); } diff --git a/yarn.lock b/yarn.lock index c465e75..b62ee8f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -329,6 +329,167 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/aix-ppc64@npm:0.19.12" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-arm64@npm:0.19.12" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-arm@npm:0.19.12" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-x64@npm:0.19.12" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/darwin-arm64@npm:0.19.12" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/darwin-x64@npm:0.19.12" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/freebsd-arm64@npm:0.19.12" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/freebsd-x64@npm:0.19.12" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-arm64@npm:0.19.12" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-arm@npm:0.19.12" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-ia32@npm:0.19.12" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-loong64@npm:0.19.12" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-mips64el@npm:0.19.12" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-ppc64@npm:0.19.12" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-riscv64@npm:0.19.12" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-s390x@npm:0.19.12" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-x64@npm:0.19.12" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/netbsd-x64@npm:0.19.12" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/openbsd-x64@npm:0.19.12" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/sunos-x64@npm:0.19.12" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-arm64@npm:0.19.12" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-ia32@npm:0.19.12" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-x64@npm:0.19.12" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -2121,6 +2282,18 @@ __metadata: languageName: unknown linkType: soft +"@se-2/local_db@workspace:packages/local_db": + version: 0.0.0-use.local + resolution: "@se-2/local_db@workspace:packages/local_db" + dependencies: + "@types/node": ^20.11.16 + dotenv: ^16.4.1 + firebase-admin: ^11.11.1 + tsx: ^4.7.0 + typescript: ^5.3.3 + languageName: unknown + linkType: soft + "@se-2/nextjs@workspace:packages/nextjs": version: 0.0.0-use.local resolution: "@se-2/nextjs@workspace:packages/nextjs" @@ -2924,7 +3097,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": +"@types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0, @types/node@npm:^20.11.16": version: 20.11.16 resolution: "@types/node@npm:20.11.16" dependencies: @@ -6327,6 +6500,13 @@ __metadata: languageName: node linkType: hard +"dotenv@npm:^16.4.1": + version: 16.4.1 + resolution: "dotenv@npm:16.4.1" + checksum: a343f0a1d156deef8c60034f797969867af4dbccfacedd4ac15fad04547e7ffe0553b58fc3b27a5837950f0d977e38e9234943fbcec4aeced4e3d044309a76ab + languageName: node + linkType: hard + "duplexify@npm:^4.0.0, duplexify@npm:^4.1.2": version: 4.1.2 resolution: "duplexify@npm:4.1.2" @@ -6852,6 +7032,86 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:~0.19.10": + version: 0.19.12 + resolution: "esbuild@npm:0.19.12" + dependencies: + "@esbuild/aix-ppc64": 0.19.12 + "@esbuild/android-arm": 0.19.12 + "@esbuild/android-arm64": 0.19.12 + "@esbuild/android-x64": 0.19.12 + "@esbuild/darwin-arm64": 0.19.12 + "@esbuild/darwin-x64": 0.19.12 + "@esbuild/freebsd-arm64": 0.19.12 + "@esbuild/freebsd-x64": 0.19.12 + "@esbuild/linux-arm": 0.19.12 + "@esbuild/linux-arm64": 0.19.12 + "@esbuild/linux-ia32": 0.19.12 + "@esbuild/linux-loong64": 0.19.12 + "@esbuild/linux-mips64el": 0.19.12 + "@esbuild/linux-ppc64": 0.19.12 + "@esbuild/linux-riscv64": 0.19.12 + "@esbuild/linux-s390x": 0.19.12 + "@esbuild/linux-x64": 0.19.12 + "@esbuild/netbsd-x64": 0.19.12 + "@esbuild/openbsd-x64": 0.19.12 + "@esbuild/sunos-x64": 0.19.12 + "@esbuild/win32-arm64": 0.19.12 + "@esbuild/win32-ia32": 0.19.12 + "@esbuild/win32-x64": 0.19.12 + 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: 2936e29107b43e65a775b78b7bc66ddd7d76febd73840ac7e825fb22b65029422ff51038a08d19b05154f543584bd3afe7d1ef1c63900429475b17fbe61cb61f + languageName: node + linkType: hard + "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" @@ -8139,7 +8399,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: @@ -8158,7 +8418,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@~2.3.2#~builtin": +"fsevents@patch:fsevents@~2.3.2#~builtin, fsevents@patch:fsevents@~2.3.3#~builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" dependencies: @@ -8335,7 +8595,7 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.5.0": +"get-tsconfig@npm:^4.5.0, get-tsconfig@npm:^4.7.2": version: 4.7.2 resolution: "get-tsconfig@npm:4.7.2" dependencies: @@ -14695,6 +14955,22 @@ __metadata: languageName: node linkType: hard +"tsx@npm:^4.7.0": + version: 4.7.0 + resolution: "tsx@npm:4.7.0" + dependencies: + esbuild: ~0.19.10 + fsevents: ~2.3.3 + get-tsconfig: ^4.7.2 + dependenciesMeta: + fsevents: + optional: true + bin: + tsx: dist/cli.mjs + checksum: a3a17fa8a40dbe0aff26fb2bc71a069e568152e0685b0bd9a31ea1091806274ba14882551433ed01efa7eae16f1aa965e2e47f3075ec1e914c42cf5dfce1f924 + languageName: node + linkType: hard + "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" @@ -14890,6 +15166,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.3.3": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 2007ccb6e51bbbf6fde0a78099efe04dc1c3dfbdff04ca3b6a8bc717991862b39fd6126c0c3ebf2d2d98ac5e960bcaa873826bb2bb241f14277034148f41f6a2 + languageName: node + linkType: hard + "typescript@patch:typescript@4.9.5#~builtin": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=a1c5e5" @@ -14910,6 +15196,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@^5.3.3#~builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#~builtin::version=5.3.3&hash=a1c5e5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: f61375590b3162599f0f0d5b8737877ac0a7bc52761dbb585d67e7b8753a3a4c42d9a554c4cc929f591ffcf3a2b0602f65ae3ce74714fd5652623a816862b610 + languageName: node + linkType: hard + "typical@npm:^4.0.0": version: 4.0.0 resolution: "typical@npm:4.0.0"