Mirror: TypeScript LSP plugin that finds GraphQL documents in your code and provides diagnostics, auto-complete and hover-information.

chore(actions): Add Discord message release hook (#295)

Changed files
+273 -8
.github
actions
discord-message
workflows
+85
.github/actions/discord-message/action.mjs
···
+
import * as core from '@actions/core';
+
import * as github from '@actions/github';
+
+
const GITHUB_TOKEN = process.env.GITHUB_TOKEN;
+
const WEBHOOK_URL = process.env.DISCORD_WEBHOOK_URL;
+
+
const octokit = github.getOctokit(GITHUB_TOKEN);
+
+
const formatBody = (input) => {
+
const titleRe = /(?:^|\n)#+[^\n]+/g;
+
const updatedDepsRe = /\n-\s*Updated dependencies[\s\S]+\n(\n\s+-[\s\S]+)*/gi;
+
const markdownLinkRe = /\[([^\]]+)\]\(([^\)]+)\)/g;
+
const creditRe = new RegExp(`Submitted by (?:undefined|${markdownLinkRe.source})`, 'ig');
+
const repeatedNewlineRe = /(\n[ ]*)+/g;
+
return input
+
.replace(titleRe, '')
+
.replace(updatedDepsRe, '')
+
.replace(creditRe, (_match, text, url) => {
+
if (!text || /@kitten|@JoviDeCroock/i.test(text)) return '';
+
return `Submitted by [${text}](${url})`;
+
})
+
.replace(markdownLinkRe, (_match, text, url) => {
+
return `[${text}](<${url}>)`;
+
})
+
.replace(repeatedNewlineRe, '\n')
+
.trim();
+
};
+
+
async function getReleaseBody(name, version) {
+
const tag = `${name}@${version}`;
+
const result = await octokit.rest.repos.getReleaseByTag({
+
owner: 'urql-graphql',
+
repo: 'urql',
+
tag,
+
});
+
+
const release = result.status === 200 ? result.data : undefined;
+
if (!release || !release.body) return;
+
+
const title = `:package: [${tag}](<${release.html_url}>)`;
+
const body = formatBody(release.body);
+
if (!body) return;
+
+
return `${title}\n${body}`;
+
}
+
+
async function main() {
+
const inputPackages = core.getInput('publishedPackages');
+
let packages;
+
+
try {
+
packages = JSON.parse(inputPackages);
+
} catch (e) {
+
console.error('invalid JSON in publishedPackages input.');
+
return;
+
}
+
+
// Get releases
+
const releasePromises = packages.map((entry) => {
+
return getReleaseBody(entry.name, entry.version);
+
});
+
+
const content = (await Promise.allSettled(releasePromises))
+
.map((x) => x.status === 'fulfilled' && x.value)
+
.filter(Boolean)
+
.join('\n\n');
+
+
// Send message through a discord webhook or bot
+
const response = fetch(WEBHOOK_URL, {
+
method: 'POST',
+
headers: {
+
'Content-Type': 'application/json',
+
},
+
body: JSON.stringify({ content }),
+
});
+
+
if (!response.ok) {
+
console.log('Something went wrong while sending the discord webhook.');
+
return;
+
}
+
+
return response;
+
}
+
+
main().then().catch(console.error);
+9
.github/actions/discord-message/action.yml
···
+
name: 'Send a discord message'
+
description: 'Send a discord message as a result of a gql.tada publish.'
+
inputs:
+
publishedPackages:
+
description: >
+
A JSON array to present the published packages. The format is `[{"name": "@xx/xx", "version": "1.2.0"}, {"name": "@xx/xy", "version": "0.8.9"}]`
+
runs:
+
using: 'node20'
+
main: 'action.mjs'
+1 -1
.github/workflows/ci.yaml
···
- name: Setup Node
uses: actions/setup-node@v4
with:
-
node-version: '18'
+
node-version: 20
- name: Setup pnpm
uses: pnpm/action-setup@v3
+12 -1
.github/workflows/release.yaml
···
- name: Setup Node
uses: actions/setup-node@v4
with:
-
node-version: 18
+
node-version: 20
- name: Setup pnpm
uses: pnpm/action-setup@v3
···
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+
- name: Notify discord
+
id: discord-msg
+
if: steps.changesets.outputs.published == 'true'
+
uses: ./.github/actions/discord-message
+
with:
+
publishedPackages: ${{ steps.changesets.outputs.publishedPackages }}
+
env:
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
+2
package.json
···
}
},
"devDependencies": {
+
"@actions/core": "^1.10.0",
+
"@actions/github": "^5.1.1",
"@babel/plugin-transform-block-scoping": "^7.23.4",
"@babel/plugin-transform-typescript": "^7.23.6",
"@changesets/cli": "^2.26.2",
+164 -6
pnpm-lock.yaml
···
.:
devDependencies:
+
'@actions/core':
+
specifier: ^1.10.0
+
version: 1.10.1
+
'@actions/github':
+
specifier: ^5.1.1
+
version: 5.1.1
'@babel/plugin-transform-block-scoping':
specifier: ^7.23.4
version: 7.23.4(@babel/core@7.23.7)
···
dependencies:
graphql: 16.8.1
+
/@actions/core@1.10.1:
+
resolution: {integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==}
+
dependencies:
+
'@actions/http-client': 2.2.1
+
uuid: 8.3.2
+
dev: true
+
+
/@actions/github@5.1.1:
+
resolution: {integrity: sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==}
+
dependencies:
+
'@actions/http-client': 2.2.1
+
'@octokit/core': 3.6.0
+
'@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0)
+
'@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0)
+
transitivePeerDependencies:
+
- encoding
+
dev: true
+
+
/@actions/http-client@2.2.1:
+
resolution: {integrity: sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==}
+
dependencies:
+
tunnel: 0.0.6
+
undici: 5.28.4
+
dev: true
+
/@ampproject/remapping@2.2.1:
resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
engines: {node: '>=6.0.0'}
···
dev: true
optional: true
+
/@fastify/busboy@2.1.1:
+
resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==}
+
engines: {node: '>=14'}
+
dev: true
+
/@gql.tada/cli-utils@0.3.0:
resolution: {integrity: sha512-kDebLVuM5r3/bI1MmlhHr9VKHxXeq8Gxy1wHVTPva4R5ObfbhzxnHsTCvR6MUp8ziy9Pg9MESb8S1YZW8ohM3A==}
dependencies:
···
resolution: {integrity: sha512-8I4Z1zxYYGK66FWdB3yIZBn3cITLPnciEgjChp3K2+Ha1e/AEBGtZv9AUlodraO/RZafDMkpFhoi+tMpluBjeg==}
peerDependencies:
graphql: ^16.8.1
-
typescript: ^5.0.0
+
typescript: ^5.3.3
dependencies:
'@0no-co/graphql.web': 1.0.6(graphql@16.8.1)
graphql: 16.8.1
···
fastq: 1.13.0
dev: true
+
/@octokit/auth-token@2.5.0:
+
resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==}
+
dependencies:
+
'@octokit/types': 6.41.0
+
dev: true
+
+
/@octokit/core@3.6.0:
+
resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==}
+
dependencies:
+
'@octokit/auth-token': 2.5.0
+
'@octokit/graphql': 4.8.0
+
'@octokit/request': 5.6.3
+
'@octokit/request-error': 2.1.0
+
'@octokit/types': 6.41.0
+
before-after-hook: 2.2.3
+
universal-user-agent: 6.0.1
+
transitivePeerDependencies:
+
- encoding
+
dev: true
+
+
/@octokit/endpoint@6.0.12:
+
resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==}
+
dependencies:
+
'@octokit/types': 6.41.0
+
is-plain-object: 5.0.0
+
universal-user-agent: 6.0.1
+
dev: true
+
+
/@octokit/graphql@4.8.0:
+
resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==}
+
dependencies:
+
'@octokit/request': 5.6.3
+
'@octokit/types': 6.41.0
+
universal-user-agent: 6.0.1
+
transitivePeerDependencies:
+
- encoding
+
dev: true
+
+
/@octokit/openapi-types@12.11.0:
+
resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==}
+
dev: true
+
+
/@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0):
+
resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==}
+
peerDependencies:
+
'@octokit/core': '>=2'
+
dependencies:
+
'@octokit/core': 3.6.0
+
'@octokit/types': 6.41.0
+
dev: true
+
+
/@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0):
+
resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==}
+
peerDependencies:
+
'@octokit/core': '>=3'
+
dependencies:
+
'@octokit/core': 3.6.0
+
'@octokit/types': 6.41.0
+
deprecation: 2.3.1
+
dev: true
+
+
/@octokit/request-error@2.1.0:
+
resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==}
+
dependencies:
+
'@octokit/types': 6.41.0
+
deprecation: 2.3.1
+
once: 1.4.0
+
dev: true
+
+
/@octokit/request@5.6.3:
+
resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==}
+
dependencies:
+
'@octokit/endpoint': 6.0.12
+
'@octokit/request-error': 2.1.0
+
'@octokit/types': 6.41.0
+
is-plain-object: 5.0.0
+
node-fetch: 2.6.7
+
universal-user-agent: 6.0.1
+
transitivePeerDependencies:
+
- encoding
+
dev: true
+
+
/@octokit/types@6.41.0:
+
resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==}
+
dependencies:
+
'@octokit/openapi-types': 12.11.0
+
dev: true
+
/@peculiar/asn1-schema@2.3.8:
resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==}
dependencies:
···
peerDependencies:
rollup: ^2.14.0||^3.0.0||^4.0.0
tslib: '*'
-
typescript: '>=3.7.0'
+
typescript: ^5.3.3
peerDependenciesMeta:
rollup:
optional: true
···
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
dev: true
+
/before-after-hook@2.2.3:
+
resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==}
+
dev: true
+
/better-path-resolve@1.0.0:
resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==}
engines: {node: '>=4'}
···
resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
engines: {node: '>=14'}
peerDependencies:
-
typescript: '>=4.9.5'
+
typescript: ^5.3.3
peerDependenciesMeta:
typescript:
optional: true
···
/dependency-graph@0.11.0:
resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==}
engines: {node: '>= 0.6.0'}
+
dev: true
+
+
/deprecation@2.3.1:
+
resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
dev: true
/detect-indent@6.1.0:
···
engines: {node: '>=0.10.0'}
dev: true
+
/is-plain-object@5.0.0:
+
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+
engines: {node: '>=0.10.0'}
+
dev: true
+
/is-reference@1.2.1:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
dependencies:
···
engines: {node: '>=16'}
peerDependencies:
rollup: ^3.29.4 || ^4
-
typescript: ^4.5 || ^5.0
+
typescript: ^5.3.3
dependencies:
magic-string: 0.30.5
rollup: 4.9.5
···
'@swc/core': '>=1.2.50'
'@swc/wasm': '>=1.2.50'
'@types/node': '*'
-
typescript: '>=2.7'
+
typescript: ^5.3.3
peerDependenciesMeta:
'@swc/core':
optional: true
···
yargs: 17.7.1
dev: true
+
/tunnel@0.0.6:
+
resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==}
+
engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'}
+
dev: true
+
/type-detect@4.0.8:
resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
engines: {node: '>=4'}
···
engines: {node: '>=0.10.0'}
dev: true
+
/undici@5.28.4:
+
resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==}
+
engines: {node: '>=14.0'}
+
dependencies:
+
'@fastify/busboy': 2.1.1
+
dev: true
+
+
/universal-user-agent@6.0.1:
+
resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==}
+
dev: true
+
/universalify@0.1.2:
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
engines: {node: '>= 4.0.0'}
···
/util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
dev: true
+
+
/uuid@8.3.2:
+
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+
hasBin: true
dev: true
/v8-compile-cache-lib@3.0.1:
···
id: file:packages/graphqlsp
name: '@0no-co/graphqlsp'
peerDependencies:
-
typescript: ^5.0.0
+
typescript: ^5.3.3
dependencies:
'@gql.tada/internal': 0.1.2(graphql@16.8.1)(typescript@5.3.3)
graphql: 16.8.1