| 1 | const TOKEN = /(-?[\w-]+):("[^"]*"|\S+)|("[^"]*"|\S+)/g; |
| 2 | |
| 3 | /** GitHub's issue search syntax, as far as Ghost's issue filters reach. Qualifiers Ghost cannot apply are dropped, as GitHub drops unknown ones. */ |
| 4 | export function parseIssueSearch(query |
| 5 | const result = |
| 6 | repo: null as { |
| 7 | state: 'all' as |
| 8 | isPullRequest: null as boolean |
| 9 | /** `is:merged` true, `is:unmerged` false; either one means pull requests only. */ |
| 10 | merged: null as boolean |
| 11 | author: undefined as string |
| 12 | assignee: undefined as string |
| 13 | reviewRequested: undefined as string |
| 14 | labels: [] as string |
| 15 | text: '', |
| 16 | }; |
| 17 | const words: |
| 18 | for (const [, |
| 19 | if (bare) { |
| 20 | words.push(bare |
| 21 | continue; |
| 22 | } |
| 23 | const value = |
| 24 | switch (key) { |
| 25 | case 'repo': { |
| 26 | const [owner, |
| 27 | if (owner && |
| 28 | break; |
| 29 | } |
| 30 | case 'is': |
| 31 | if (value === |
| 32 | if (value === |
| 33 | if (value === |
| 34 | if (value === |
| 35 | result.isPullRequest = |
| 36 | result.merged = |
| 37 | } |
| 38 | break; |
| 39 | case 'state': |
| 40 | if (value === |
| 41 | break; |
| 42 | case 'type': |
| 43 | if (value === |
| 44 | if (value === |
| 45 | break; |
| 46 | case 'author': |
| 47 | result.author = |
| 48 | break; |
| 49 | case 'assignee': |
| 50 | result.assignee = |
| 51 | break; |
| 52 | case 'review-requested': |
| 53 | result.reviewRequested = |
| 54 | break; |
| 55 | case 'label': |
| 56 | result.labels.push |
| 57 | break; |
| 58 | } |
| 59 | } |
| 60 | result.text = |
| 61 | return result; |
| 62 | } |