create-a-theme-checklist.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. const theme = process.argv[2];
  2. if (!theme) {
  3. console.error('\x1b[41m', 'You must specify a theme!');
  4. return;
  5. }
  6. const { Octokit } = require('octokit');
  7. const octokit = new Octokit({ auth: `PUT YOUR TOKEN HERE` });
  8. async function createLabel() {
  9. try {
  10. return await octokit.request('POST /repos/Automattic/themes/labels', {
  11. name: '[Theme] ' + theme,
  12. color: 'c1f4a1',
  13. description: 'Automatically generated label for ' + theme + '.',
  14. });
  15. } catch (error) {
  16. console.log(error);
  17. }
  18. }
  19. async function createMilestone() {
  20. try {
  21. return await octokit.request(
  22. 'POST /repos/Automattic/themes/milestones',
  23. {
  24. title: theme,
  25. description:
  26. 'Automatically generated milestone for ' + theme + '.',
  27. }
  28. );
  29. } catch (error) {
  30. console.error('\x1b[41m', 'Milestone already created.');
  31. }
  32. }
  33. async function createIssues(milestoneNumber) {
  34. const issues = [
  35. 'Create base theme',
  36. 'Create a demo site on dotcom',
  37. 'theme.json: Typography settings',
  38. 'theme.json: Color palette',
  39. 'theme.json: Margin/spacing settings + content layout',
  40. 'Templates: Page templates - Index',
  41. 'Templates: Page templates - Search',
  42. 'Templates: Page templates - 404',
  43. 'Templates: Page templates - Archive',
  44. 'Templates: Post templates - Single',
  45. 'Templates: page.html',
  46. 'Templates: Header template part',
  47. 'Templates: Footer template part',
  48. 'Block patterns',
  49. 'Comment form styles (dotcom and dotorg)',
  50. 'theme.json: Core block settings',
  51. 'Pre-launch: readme.txt',
  52. 'Pre-launch: screenshot.png',
  53. 'Pre-launch: style.css tags',
  54. ];
  55. issues.forEach(async (issue) => {
  56. try {
  57. return await octokit
  58. .request('POST /repos/Automattic/themes/issues', {
  59. title: theme + ': ' + issue,
  60. labels: ['[Theme] ' + theme],
  61. milestone: milestoneNumber,
  62. })
  63. .then((issueData) => {
  64. addIssueToProject(issueData);
  65. });
  66. } catch (error) {
  67. console.log(error);
  68. }
  69. });
  70. }
  71. async function addIssueToProject(issueData) {
  72. try {
  73. return await octokit.request('POST /projects/columns/11021541/cards', {
  74. note: null,
  75. content_id: issueData.data.id,
  76. content_url: issueData.data.url,
  77. content_type: 'Issue',
  78. mediaType: {
  79. previews: ['inertia'],
  80. },
  81. });
  82. } catch (error) {
  83. console.log(error);
  84. }
  85. }
  86. createLabel().then(() => {
  87. createMilestone().then((milestoneData) => {
  88. const milestoneNumber = milestoneData.data.number;
  89. createIssues(milestoneNumber);
  90. });
  91. });