mirror of
https://github.com/type-challenges/type-challenges.git
synced 2026-02-01 15:47:22 +00:00
feat: support zh-cn for new challenges
This commit is contained in:
parent
ab7c0ec2f1
commit
352685a55f
13
.github/ISSUE_TEMPLATE/new.md
vendored
13
.github/ISSUE_TEMPLATE/new.md
vendored
@ -13,6 +13,8 @@ labels: new-challenge
|
||||
|
||||
## Info
|
||||
|
||||
Basic info of your challenge questions,
|
||||
|
||||
```yaml
|
||||
difficulty: easy # medium / hard / extreme
|
||||
title: Your Question Name
|
||||
@ -23,22 +25,25 @@ title: Your Question Name
|
||||
|
||||
<!--question-start-->
|
||||
|
||||
Describe your question and give some examples.
|
||||
Describe your question and give some examples. Markdown is supported here.
|
||||
|
||||
<!--question-end-->
|
||||
|
||||
## Template
|
||||
|
||||
This is the template for challenger to start the coding, basically you just need to change the name of your generic/function and leave to implementation `any`.
|
||||
|
||||
```ts
|
||||
type YourType = any
|
||||
```
|
||||
|
||||
## Test Cases
|
||||
|
||||
```ts
|
||||
import { Equal, Expect } from '@type-challenges/utils'
|
||||
Provide some test cases for your challenge, you can use some utils from `@type-challenges/utils` for assetion.
|
||||
|
||||
```ts
|
||||
import { Equal, Expect, ExpectFalse, NotEqual } from '@type-challenges/utils'
|
||||
|
||||
// your test cases
|
||||
type cases = [
|
||||
Expect<Equal<true, true>>
|
||||
]
|
||||
|
||||
52
.github/ISSUE_TEMPLATE/new.zh-CN.md
vendored
Normal file
52
.github/ISSUE_TEMPLATE/new.zh-CN.md
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
---
|
||||
name: 🇨🇳 新题目
|
||||
about: 新题目提案,PR 会根据 Issue 自动生成。
|
||||
title: "新题目"
|
||||
labels: new-challenge, zh-CN
|
||||
---
|
||||
|
||||
> 请按照以下的模版填充相应的内容,一个 PR 会自动生成并保持与本 Issue 的内容同步。
|
||||
|
||||
> 你不需要提供详细的答案或教学,但请保证题目可解。
|
||||
|
||||
|
||||
## 基本信息
|
||||
|
||||
```yaml
|
||||
# 题目难度
|
||||
difficulty: easy # medium / hard / extreme
|
||||
|
||||
# 题目标题
|
||||
title: 你的题目
|
||||
|
||||
# 题目标签
|
||||
#tags: union, array # separate by comma
|
||||
```
|
||||
|
||||
## 题目
|
||||
|
||||
<!--question-start-->
|
||||
|
||||
在这里描述你的题目并给出一些例子。支持使用 Markdown。
|
||||
|
||||
<!--question-end-->
|
||||
|
||||
## 题目模版
|
||||
|
||||
以下是给予挑战者开始做题的代码模版,在大部分情况下你只需要修改类型名称使其符合你的题目与判题测试,实现的部分保持 `any` 即可。
|
||||
|
||||
```ts
|
||||
type YourType = any
|
||||
```
|
||||
|
||||
## 判题测试
|
||||
|
||||
请为你的题目提供一些判题测试,你可以使用 `@type-challenges/utils` 中提供的一些工具进行判断。
|
||||
|
||||
```ts
|
||||
import { Equal, Expect, ExpectFalse, NotEqual } from '@type-challenges/utils'
|
||||
|
||||
type cases = [
|
||||
Expect<Equal<true, true>>
|
||||
]
|
||||
```
|
||||
@ -5,6 +5,23 @@ const YAML = require('js-yaml')
|
||||
const slug = require('slug')
|
||||
const { PushCommit } = require('@type-challenges/octokit-create-pull-request')
|
||||
|
||||
const Messages = {
|
||||
en: {
|
||||
info: 'Info',
|
||||
template: 'Template',
|
||||
tests: 'Test Cases',
|
||||
issue_reply: 'Pull Request created at #{0}',
|
||||
issue_invalid_reply: 'Failed to parse the issue, please follow the template.',
|
||||
},
|
||||
'zh-CN': {
|
||||
info: '基本信息',
|
||||
template: '题目模版',
|
||||
tests: '判题测试',
|
||||
issue_reply: 'PR 已自动生成 #{0}',
|
||||
issue_invalid_reply: 'Issue 格式不正确,请按照依照模版修正',
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ReturnType<typeof import('@actions/github').getOctokit>} github
|
||||
* @param {typeof import('@actions/github').context} context
|
||||
@ -24,10 +41,12 @@ module.exports = async(github, context, core) => {
|
||||
|
||||
// create pr for new challenge
|
||||
if (labels.includes('new-challenge')) {
|
||||
const locale = labels.includes('zh-CN') ? 'zh-CN' : 'en'
|
||||
|
||||
const body = issue.body || ''
|
||||
const infoRaw = getCodeBlock(body, 'Info', 'yaml')
|
||||
const template = getCodeBlock(body, 'Template', 'ts')
|
||||
const tests = getCodeBlock(body, 'Test Cases', 'ts')
|
||||
const infoRaw = getCodeBlock(body, Messages[locale].info, 'yaml')
|
||||
const template = getCodeBlock(body, Messages[locale].template, 'ts')
|
||||
const tests = getCodeBlock(body, Messages[locale].tests, 'ts')
|
||||
const question = getCommentRange(body, 'question')
|
||||
|
||||
/** @type {any} */
|
||||
@ -53,15 +72,25 @@ module.exports = async(github, context, core) => {
|
||||
}, null, 2),
|
||||
)
|
||||
|
||||
if (!question || !template || !tests || !info)
|
||||
return // TODO: warn user
|
||||
// invalid issue
|
||||
if (!question || !template || !tests || !info) {
|
||||
await updateComment(
|
||||
github,
|
||||
context,
|
||||
Messages[locale].issue_invalid_reply,
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
const { data: user } = await github.users.getByUsername({ username: issue.user.login })
|
||||
|
||||
info.author = info.author || {}
|
||||
info.author.github = issue.user.login
|
||||
if (user)
|
||||
info.author.name = user.name
|
||||
// allow user to override the author info when filled in the Issue
|
||||
if (!info.author) {
|
||||
info.author = info.author || {}
|
||||
info.author.github = issue.user.login
|
||||
if (user)
|
||||
info.author.name = user.name
|
||||
}
|
||||
|
||||
const { data: pulls } = await github.pulls.list({
|
||||
owner: context.repo.owner,
|
||||
@ -114,12 +143,11 @@ module.exports = async(github, context, core) => {
|
||||
core.info(JSON.stringify(pr, null, 2))
|
||||
|
||||
if (pr) {
|
||||
await github.issues.createComment({
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: `Pull Request created at #${pr.number}!`,
|
||||
})
|
||||
await updateComment(
|
||||
github,
|
||||
context,
|
||||
Messages[locale].issue_reply.replace('{0}', pr.number.toString()),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -128,6 +156,41 @@ module.exports = async(github, context, core) => {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ReturnType<typeof import('@actions/github').getOctokit>} github
|
||||
* @param {typeof import('@actions/github').context} context
|
||||
* @param {string} body
|
||||
*/
|
||||
async function updateComment(github, context, body) {
|
||||
const { data: comments } = await github.issues.listComments({
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
})
|
||||
|
||||
const existing_comment = comments.find(i =>
|
||||
i.user.login === 'github-actions[bot]',
|
||||
)
|
||||
|
||||
if (existing_comment) {
|
||||
return await github.issues.updateComment({
|
||||
comment_id: existing_comment.id,
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body,
|
||||
})
|
||||
}
|
||||
else {
|
||||
return await github.issues.createComment({
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} text
|
||||
* @param {string} title
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user