From 0c245c4511204d9aad9ffe59096d16f8d587a46e Mon Sep 17 00:00:00 2001 From: WhiteMind Date: Tue, 23 Jan 2024 14:48:15 +0800 Subject: [PATCH] feat: implement scripts report:update and report:discussion --- .github/workflows/update_report_snapshot.yaml | 58 ++++ packages/scripts/.env.example | 3 + packages/scripts/.eslintrc.cjs | 7 + packages/scripts/.lintstagedrc.cjs | 5 + packages/scripts/package.json | 24 ++ .../scripts/src/create_report_discussion.ts | 4 + packages/scripts/src/prepare.ts | 4 + .../scripts/src/update_report_snapshot.ts | 7 + packages/scripts/src/utils/error.ts | 5 + packages/scripts/src/utils/file.ts | 8 + packages/scripts/src/utils/github.ts | 255 ++++++++++++++++++ packages/scripts/src/utils/report.ts | 170 ++++++++++++ packages/scripts/tsconfig.json | 13 + yarn.lock | 176 ++++++++++++ 14 files changed, 739 insertions(+) create mode 100644 .github/workflows/update_report_snapshot.yaml create mode 100644 packages/scripts/.env.example create mode 100644 packages/scripts/.eslintrc.cjs create mode 100644 packages/scripts/.lintstagedrc.cjs create mode 100644 packages/scripts/package.json create mode 100644 packages/scripts/src/create_report_discussion.ts create mode 100644 packages/scripts/src/prepare.ts create mode 100644 packages/scripts/src/update_report_snapshot.ts create mode 100644 packages/scripts/src/utils/error.ts create mode 100644 packages/scripts/src/utils/file.ts create mode 100644 packages/scripts/src/utils/github.ts create mode 100644 packages/scripts/src/utils/report.ts create mode 100644 packages/scripts/tsconfig.json diff --git a/.github/workflows/update_report_snapshot.yaml b/.github/workflows/update_report_snapshot.yaml new file mode 100644 index 00000000..c8929693 --- /dev/null +++ b/.github/workflows/update_report_snapshot.yaml @@ -0,0 +1,58 @@ +name: Update Report Snapshot + +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * 1' + +jobs: + default: + runs-on: ubuntu-latest + permissions: + # peter-evans/create-pull-request requires the following permissions: + pull-requests: write + contents: write + + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.ref }} + + - name: report:update + id: report_update + env: + # The script requires public_repo, read:org, read:project permissions, and needs a personal access token (classic) to obtain these permissions. + GITHUB_TOKEN: ${{ secrets.REPORT_GITHUB_TOKEN }} + run: | + yarn install + { + echo 'DEVLOG<> $GITHUB_OUTPUT + git add packages/scripts/snapshots + + - name: Set GPG + uses: crazy-max/ghaction-import-gpg@v5 + with: + gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.GPG_PASSPHRASE }} + git_user_signingkey: true + git_commit_gpgsign: true + + - name: Open PR to repo + uses: peter-evans/create-pull-request@v5 + with: + title: Update Report Snapshot + commit-message: 'feat: update report snapshot' + body: ' + After this PR is merged, a corresponding devlog discussion will be automatically created, with the content preview as follows + + + --- + + + ${{ steps.report_update.outputs.DEVLOG }} + ' + committer: ${{ vars.COMMITTER }} + branch: update-report-snapshot diff --git a/packages/scripts/.env.example b/packages/scripts/.env.example new file mode 100644 index 00000000..618c6420 --- /dev/null +++ b/packages/scripts/.env.example @@ -0,0 +1,3 @@ +# For accessing api.github.com +# https://docs.github.com/en/rest/overview/authenticating-to-the-rest-api?apiVersion=2022-11-28 +GITHUB_TOKEN= diff --git a/packages/scripts/.eslintrc.cjs b/packages/scripts/.eslintrc.cjs new file mode 100644 index 00000000..d043dbde --- /dev/null +++ b/packages/scripts/.eslintrc.cjs @@ -0,0 +1,7 @@ +/** @type {import("eslint").Linter.Config} */ +const config = { + root: true, + extends: ['@magickbase-website/eslint-config/next.js'], +} + +module.exports = config diff --git a/packages/scripts/.lintstagedrc.cjs b/packages/scripts/.lintstagedrc.cjs new file mode 100644 index 00000000..cb0463d2 --- /dev/null +++ b/packages/scripts/.lintstagedrc.cjs @@ -0,0 +1,5 @@ +const path = require('path') + +module.exports = { + '*.{js,cjs,mjs,jsx,ts,tsx}': ['prettier --write', 'eslint --fix'], +} diff --git a/packages/scripts/package.json b/packages/scripts/package.json new file mode 100644 index 00000000..41c91e78 --- /dev/null +++ b/packages/scripts/package.json @@ -0,0 +1,24 @@ +{ + "name": "@magickbase-website/scripts", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "report:update": "node --loader ts-node/esm src/update_report_snapshot.ts", + "report:discussion": "node --loader ts-node/esm src/create_report_discussion.ts" + }, + "dependencies": { + "@octokit/plugin-paginate-graphql": "^4.0.0", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/rest": "^19.0.11" + }, + "devDependencies": { + "@magickbase-website/config": "workspace:^", + "@magickbase-website/eslint-config": "workspace:^", + "@types/eslint": "^8.56.0", + "@types/node": "^20.2.5", + "eslint": "^8.56.0", + "ts-node": "^10.9.1", + "typescript": "^5.1.3" + } +} diff --git a/packages/scripts/src/create_report_discussion.ts b/packages/scripts/src/create_report_discussion.ts new file mode 100644 index 00000000..f9471d2a --- /dev/null +++ b/packages/scripts/src/create_report_discussion.ts @@ -0,0 +1,4 @@ +import './prepare' +import { createDevlogDiscussion } from './utils/report' + +await createDevlogDiscussion() diff --git a/packages/scripts/src/prepare.ts b/packages/scripts/src/prepare.ts new file mode 100644 index 00000000..4748ceef --- /dev/null +++ b/packages/scripts/src/prepare.ts @@ -0,0 +1,4 @@ +import pkg from '@next/env' + +const { loadEnvConfig } = pkg +loadEnvConfig(process.cwd(), true) diff --git a/packages/scripts/src/update_report_snapshot.ts b/packages/scripts/src/update_report_snapshot.ts new file mode 100644 index 00000000..05b516b4 --- /dev/null +++ b/packages/scripts/src/update_report_snapshot.ts @@ -0,0 +1,7 @@ +import './prepare' +import { generateDevlogFromSnapshotsDiff, updateSnapshots } from './utils/report' + +await updateSnapshots() +// These outputs are for use with GitHub Actions. +console.log('generateDevlogFromSnapshotsDiff():') +console.log(generateDevlogFromSnapshotsDiff()) diff --git a/packages/scripts/src/utils/error.ts b/packages/scripts/src/utils/error.ts new file mode 100644 index 00000000..979e6008 --- /dev/null +++ b/packages/scripts/src/utils/error.ts @@ -0,0 +1,5 @@ +export function assert(assertion: unknown, msg = 'assertion failed'): asserts assertion { + if (!assertion) { + throw new Error(msg) + } +} diff --git a/packages/scripts/src/utils/file.ts b/packages/scripts/src/utils/file.ts new file mode 100644 index 00000000..a4b8fc6c --- /dev/null +++ b/packages/scripts/src/utils/file.ts @@ -0,0 +1,8 @@ +import { existsSync, mkdirSync } from 'fs' +import { dirname } from 'path' + +export function ensureFileFolderExists(filePath: string) { + const folder = dirname(filePath) + if (existsSync(folder)) return + mkdirSync(folder, { recursive: true }) +} diff --git a/packages/scripts/src/utils/github.ts b/packages/scripts/src/utils/github.ts new file mode 100644 index 00000000..19b7f91e --- /dev/null +++ b/packages/scripts/src/utils/github.ts @@ -0,0 +1,255 @@ +import { Octokit } from '@octokit/rest' +import { paginateRest } from '@octokit/plugin-paginate-rest' +import { paginateGraphql } from '@octokit/plugin-paginate-graphql' +import { assert } from './error' + +const TOKEN = process.env.GITHUB_TOKEN +assert(TOKEN != null && TOKEN !== '', 'GITHUB_TOKEN is required') + +const EnhancedOctokit = Octokit.plugin(paginateRest, paginateGraphql) +const octokit = new EnhancedOctokit({ auth: TOKEN }) + +const GQL_ProjectV2FieldCommon_FIELDS = () => ` + ... on ProjectV2FieldCommon { + name + } +` +const GQL_PROJECTV2ITEMFIELDVALUE_FIELDS = () => ` + ... on ProjectV2ItemFieldTextValue { + text + field {${GQL_ProjectV2FieldCommon_FIELDS()}} + } + ... on ProjectV2ItemFieldNumberValue { + number + field {${GQL_ProjectV2FieldCommon_FIELDS()}} + } + ... on ProjectV2ItemFieldDateValue { + date + field {${GQL_ProjectV2FieldCommon_FIELDS()}} + } + ... on ProjectV2ItemFieldSingleSelectValue { + name + field {${GQL_ProjectV2FieldCommon_FIELDS()}} + } + ... on ProjectV2ItemFieldIterationValue { + title + startDate + duration + field {${GQL_ProjectV2FieldCommon_FIELDS()}} + } + ... on ProjectV2ItemFieldLabelValue { + labels (first: 100) { + nodes { + id + name + description + } + } + field {${GQL_ProjectV2FieldCommon_FIELDS()}} + } + ... on ProjectV2ItemFieldMilestoneValue { + milestone { + title + dueOn + } + field {${GQL_ProjectV2FieldCommon_FIELDS()}} + } + ... on ProjectV2ItemFieldPullRequestValue { + pullRequests(first: 100) { + nodes { + title + url + } + } + field {${GQL_ProjectV2FieldCommon_FIELDS()}} + } + ... on ProjectV2ItemFieldRepositoryValue { + repository { + name + url + } + field {${GQL_ProjectV2FieldCommon_FIELDS()}} + } + ... on ProjectV2ItemFieldReviewerValue { + field {${GQL_ProjectV2FieldCommon_FIELDS()}} + } + ... on ProjectV2ItemFieldUserValue { + field {${GQL_ProjectV2FieldCommon_FIELDS()}} + } +` + +export async function getOrganizationProjects(org: string) { + const res = await octokit.graphql<{ + organization: { + projectsV2: { + nodes: { + id: string + number: number + title: string + }[] + } + } + }>( + ` + query($login: String!) { + organization(login: $login) { + projectsV2(first: 100, query: "is:open") { + totalCount + nodes { + id + number + title + } + } + } + } + `, + { + login: org, + }, + ) + + return res.organization.projectsV2.nodes +} + +export interface ProjectItem { + id: string + content: { title: string; number?: number; url?: string } + fieldValues: { + nodes: { + text?: string + number?: number + date?: unknown + name?: string + title?: string + startDate?: unknown + duration?: unknown + labels?: { nodes: { name: string }[] } + milestone?: { title: string; dueOn: unknown } + pullRequests?: { nodes: { title: string; url: string }[] } + repository?: { name: string; url: string } + field: { name: string } + }[] + } +} + +export async function getProjectItems(id: string) { + const res = await octokit.graphql<{ + node: { + items: { + nodes: ProjectItem[] + } + } + }>( + ` + query($cursor: String, $id: ID!) { + node(id: $id) { + ... on ProjectV2 { + items(first: 5, after: $cursor) { + nodes { + id + content { + ... on DraftIssue { + title + } + ... on Issue { + title + number + url + } + ... on PullRequest { + title + number + url + } + } + fieldValues(first: 100) { + nodes { + ${GQL_PROJECTV2ITEMFIELDVALUE_FIELDS()} + } + } + } + + pageInfo { + hasNextPage + endCursor + } + } + } + } + } + `, + { + id, + }, + ) + + return res.node.items.nodes +} + +export async function createDiscussion( + repoOwner: string, + repoName: string, + category: string, + title: string, + body: string, +) { + const repoRes = await octokit.graphql<{ + repository: { + id: string + discussionCategories: { + nodes: { + id: string + name: string + }[] + } + } + }>( + ` + query($owner: String!, $name: String!) { + repository(owner: $owner, name: $name) { + id + discussionCategories(first: 100) { + nodes { + id + name + } + } + } + } + `, + { + owner: repoOwner, + name: repoName, + }, + ) + + const categoryId = repoRes.repository.discussionCategories.nodes.find(n => n.name === category)?.id + assert(categoryId) + + const createRes = octokit.graphql<{ + createDiscussion: { + discussion: { + id: string + } + } + }>( + ` + mutation($repoId: ID!, $categoryId: ID!, $title: String!, $body: String!) { + createDiscussion(input: {repositoryId: $repoId, categoryId: $categoryId, body: $body, title: $title}) { + discussion { + id + } + } + } + `, + { + repoId: repoRes.repository.id, + categoryId, + title, + body, + }, + ) + + return (await createRes).createDiscussion.discussion +} diff --git a/packages/scripts/src/utils/report.ts b/packages/scripts/src/utils/report.ts new file mode 100644 index 00000000..b85ea39c --- /dev/null +++ b/packages/scripts/src/utils/report.ts @@ -0,0 +1,170 @@ +import { join } from 'path' +import { existsSync, readFileSync, renameSync, writeFileSync } from 'fs' +import { ProjectItem, createDiscussion, getOrganizationProjects, getProjectItems } from './github' +import { assert } from './error' +import { ensureFileFolderExists } from './file' + +const projectNames = ['CKB Explorer'] +const sortedStatusValues = [ + 'πŸ†• New', + 'πŸ“«Hold On', + 'πŸ“‹ Backlog', + 'πŸ“ŒPlanning', + '🎨 Designing', + 'πŸ— In Progress', + 'πŸ”Ž Code Review', + 'πŸ‘€ Testing', + '🚩Pre Release', + 'βœ… Done', +] + +const folder = join(process.cwd(), 'snapshots') +const currentFilepath = join(folder, 'current.json') +const prevFilepath = join(folder, 'prev.json') + +export async function updateSnapshots() { + const projects = await getOrganizationProjects('Magickbase') + const filteredProjects = projects.filter(p => projectNames.includes(p.title)) + assert(filteredProjects.length === projectNames.length) + + const projectItemsMap: Record = {} + for (const project of filteredProjects) { + projectItemsMap[project.title] = await getProjectItems(project.id) + } + + if (existsSync(currentFilepath)) { + renameSync(currentFilepath, prevFilepath) + } + ensureFileFolderExists(currentFilepath) + writeFileSync(currentFilepath, JSON.stringify(projectItemsMap)) +} + +export function generateDevlogFromSnapshotsDiff() { + if (!existsSync(currentFilepath) || !existsSync(prevFilepath)) return null + const currentProjectItemsMap = JSON.parse(readFileSync(currentFilepath).toString()) as Record + const prevProjectItemsMap = JSON.parse(readFileSync(prevFilepath).toString()) as Record + + let devLog = '' + + for (const [title, currentItems] of Object.entries(currentProjectItemsMap)) { + const prevItems = prevProjectItemsMap[title] + if (!prevItems) continue + + const currentMap = itemsToItemMap(currentItems) + const prevMap = itemsToItemMap(prevItems) + + const newItems: ProjectItem[] = [] + const update: ProjectItem[] = [] + const done: ProjectItem[] = [] + + for (const id of Object.keys(currentMap)) { + const currentItem = currentMap[id] + const prevItem = prevMap[id] + assert(currentItem) + + const hasAnyChange = !prevItem || JSON.stringify(currentItem) !== JSON.stringify(prevItem) + const hasStatusChange = !prevItem || getField(currentItem, 'Status')?.name !== getField(prevItem, 'Status')?.name + if (!hasAnyChange) continue + + const currentStatus = getField(currentItem, 'Status')?.name ?? '' + switch (currentStatus) { + case 'πŸ†• New': + newItems.push(currentItem) + break + case '🚩Pre Release': + case 'βœ… Done': + const prevStatus = prevItem == null ? '' : getField(prevItem, 'Status')?.name ?? '' + const prevIsDone = ['🚩Pre Release', 'βœ… Done'].includes(prevStatus) + if (hasStatusChange && !prevIsDone) { + done.push(currentItem) + } + break + default: + update.push(currentItem) + break + } + } + + ;[newItems, update, done].forEach(items => + items.sort((a, b) => { + const aStatus = getField(a, 'Status')?.name ?? '' + const bStatus = getField(b, 'Status')?.name ?? '' + return sortedStatusValues.indexOf(aStatus) - sortedStatusValues.indexOf(bStatus) + }), + ) + + const getStatusChangeLog = (item: ProjectItem) => { + const currentStatus = getField(item, 'Status')?.name + const prevItem = prevMap[item.id] + const prevStatus = prevItem == null ? undefined : getField(prevItem, 'Status')?.name + if (prevStatus == null || currentStatus === prevStatus) return ` [${currentStatus}]` + return ` [${prevStatus} -> ${currentStatus}]` + } + + const getContentURL = (item: ProjectItem) => + item.content.url != null ? ` [#${item.content.number}](${item.content.url})` : '' + + const getDescription = (item: ProjectItem) => { + const desc = getField(item, 'Description')?.text + return desc != null ? ` [${desc}]` : '' + } + + devLog += `# ${title}\n\n` + + if (newItems.length > 0) { + devLog += '## [NEW]\n\n' + newItems.forEach((item, idx) => { + devLog += `${idx + 1}. ${item.content.title}${getContentURL(item)}${getDescription(item)}\n` + }) + devLog += '\n' + } + + if (update.length > 0) { + devLog += '## [UPDATE]\n\n' + update.forEach((item, idx) => { + devLog += `${idx + 1}.${getStatusChangeLog(item)} ${item.content.title}${getContentURL(item)}${getDescription( + item, + )}\n` + }) + devLog += '\n' + } + + if (done.length > 0) { + devLog += '## [DONE]\n\n' + done.forEach((item, idx) => { + devLog += `${idx + 1}. [${getField(item, 'Status')?.name}] ${item.content.title}${getContentURL( + item, + )}${getDescription(item)}\n` + }) + } + + devLog += '\n' + } + + return devLog +} + +export async function createDevlogDiscussion() { + const devLog = generateDevlogFromSnapshotsDiff() + if (devLog == null) return null + + return createDiscussion( + 'Magickbase', + 'shaping', + 'Dev Log', + `Dev Log ${new Date().toISOString().slice(0, 10)}`, + devLog, + ) +} + +function itemsToItemMap(items: ProjectItem[]): Record { + const map: Record = {} + for (const item of items) { + map[item.id] = item + } + return map +} + +function getField(item: ProjectItem, filedName: string) { + return item.fieldValues.nodes.find(n => n.field.name === filedName) +} diff --git a/packages/scripts/tsconfig.json b/packages/scripts/tsconfig.json new file mode 100644 index 00000000..c4ee263b --- /dev/null +++ b/packages/scripts/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "@magickbase-website/config/tsconfig-base.json", + "compilerOptions": { + "module": "esnext", + "moduleResolution": "node" + }, + "ts-node": { + "esm": true, + "experimentalSpecifierResolution": "node" + }, + "include": ["**/*.ts", "**/*.cjs"], + "exclude": ["node_modules"] +} diff --git a/yarn.lock b/yarn.lock index c15db398..2d02892d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1779,6 +1779,15 @@ __metadata: languageName: node linkType: hard +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": 0.3.9 + checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa + languageName: node + linkType: hard + "@csstools/css-parser-algorithms@npm:^2.2.0": version: 2.2.0 resolution: "@csstools/css-parser-algorithms@npm:2.2.0" @@ -2131,6 +2140,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 + languageName: node + linkType: hard + "@jridgewell/set-array@npm:^1.0.1": version: 1.1.2 resolution: "@jridgewell/set-array@npm:1.1.2" @@ -2152,6 +2168,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.18 resolution: "@jridgewell/trace-mapping@npm:0.3.18" @@ -2286,6 +2312,23 @@ __metadata: languageName: unknown linkType: soft +"@magickbase-website/scripts@workspace:packages/scripts": + version: 0.0.0-use.local + resolution: "@magickbase-website/scripts@workspace:packages/scripts" + dependencies: + "@magickbase-website/config": "workspace:^" + "@magickbase-website/eslint-config": "workspace:^" + "@octokit/plugin-paginate-graphql": ^4.0.0 + "@octokit/plugin-paginate-rest": ^6.1.2 + "@octokit/rest": ^19.0.11 + "@types/eslint": ^8.56.0 + "@types/node": ^20.2.5 + eslint: ^8.56.0 + ts-node: ^10.9.1 + typescript: ^5.1.3 + languageName: unknown + linkType: soft + "@magickbase-website/shared@workspace:^, @magickbase-website/shared@workspace:packages/shared": version: 0.0.0-use.local resolution: "@magickbase-website/shared@workspace:packages/shared" @@ -2631,6 +2674,15 @@ __metadata: languageName: node linkType: hard +"@octokit/plugin-paginate-graphql@npm:^4.0.0": + version: 4.0.0 + resolution: "@octokit/plugin-paginate-graphql@npm:4.0.0" + peerDependencies: + "@octokit/core": ">=5" + checksum: 368121d74fc40a4cee96f2febc29ae43abd8f6b7d0b06d3520847827675128028c4fa10d0534c5f0466658e81257d103092154778625c886a9fcdd01c302e50e + languageName: node + linkType: hard + "@octokit/plugin-paginate-rest@npm:^6.1.2": version: 6.1.2 resolution: "@octokit/plugin-paginate-rest@npm:6.1.2" @@ -3669,6 +3721,34 @@ __metadata: languageName: node linkType: hard +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff + languageName: node + linkType: hard + "@types/debug@npm:^4.0.0": version: 4.1.8 resolution: "@types/debug@npm:4.1.8" @@ -4096,6 +4176,22 @@ __metadata: languageName: node linkType: hard +"acorn-walk@npm:^8.1.1": + version: 8.3.2 + resolution: "acorn-walk@npm:8.3.2" + checksum: 3626b9d26a37b1b427796feaa5261faf712307a8920392c8dce9a5739fb31077667f4ad2ec71c7ac6aaf9f61f04a9d3d67ff56f459587206fc04aa31c27ef392 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1": + version: 8.11.3 + resolution: "acorn@npm:8.11.3" + bin: + acorn: bin/acorn + checksum: 76d8e7d559512566b43ab4aadc374f11f563f0a9e21626dd59cb2888444e9445923ae9f3699972767f18af61df89cd89f5eaaf772d1327b055b45cb829b4a88c + languageName: node + linkType: hard + "acorn@npm:^8.9.0": version: 8.11.2 resolution: "acorn@npm:8.11.2" @@ -4279,6 +4375,13 @@ __metadata: languageName: node linkType: hard +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 + languageName: node + linkType: hard + "arg@npm:^5.0.2": version: 5.0.2 resolution: "arg@npm:5.0.2" @@ -5466,6 +5569,13 @@ __metadata: languageName: node linkType: hard +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -5861,6 +5971,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d + languageName: node + linkType: hard + "diff@npm:^5.0.0": version: 5.1.0 resolution: "diff@npm:5.1.0" @@ -9333,6 +9450,13 @@ __metadata: languageName: unknown linkType: soft +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 + languageName: node + linkType: hard + "make-fetch-happen@npm:^10.0.3": version: 10.2.1 resolution: "make-fetch-happen@npm:10.2.1" @@ -14034,6 +14158,44 @@ __metadata: languageName: node linkType: hard +"ts-node@npm:^10.9.1": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": ^0.8.0 + "@tsconfig/node10": ^1.0.7 + "@tsconfig/node12": ^1.0.7 + "@tsconfig/node14": ^1.0.0 + "@tsconfig/node16": ^1.0.2 + acorn: ^8.4.1 + acorn-walk: ^8.1.1 + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + v8-compile-cache-lib: ^3.0.1 + yn: 3.1.1 + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: fde256c9073969e234526e2cfead42591b9a2aec5222bac154b0de2fa9e4ceb30efcd717ee8bc785a56f3a119bdd5aa27b333d9dbec94ed254bd26f8944c67ac + languageName: node + linkType: hard + "tsconfig-paths@npm:^3.14.2": version: 3.14.2 resolution: "tsconfig-paths@npm:3.14.2" @@ -14594,6 +14756,13 @@ __metadata: languageName: node linkType: hard +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 + languageName: node + linkType: hard + "validate-npm-package-license@npm:^3.0.1": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" @@ -15017,6 +15186,13 @@ __metadata: languageName: node linkType: hard +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0"