Compare commits
9 Commits
v2.0.0
...
v1.1.0-nex
Author | SHA1 | Date | |
---|---|---|---|
|
17e7434940 | ||
|
feff4b4d2a | ||
|
91f90aedbe | ||
|
cd1c89b2ef | ||
|
52bf53cb39 | ||
|
a8b657735b | ||
|
7fb87741a2 | ||
|
602befcb54 | ||
|
791de9ab50 |
21
.github/workflows/merge.yml
vendored
Normal file
21
.github/workflows/merge.yml
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
name: Run tests
|
||||
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest]
|
||||
node-version: [16.x]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- run: npm it
|
24
.github/workflows/release.yml
vendored
24
.github/workflows/release.yml
vendored
@@ -3,7 +3,26 @@ name: Release
|
||||
on: [workflow_dispatch]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest]
|
||||
node-version: [16.x]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm it
|
||||
|
||||
release:
|
||||
needs: [test]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/setup-node@v3
|
||||
@@ -11,8 +30,7 @@ jobs:
|
||||
node-version: 16
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.GH_TOKEN }}
|
||||
persist-credentials: false
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm i
|
||||
@@ -23,6 +41,6 @@ jobs:
|
||||
- name: Semantic release
|
||||
uses: codfish/semantic-release-action@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GIT_AUTHOR_NAME: '${{ github.actor }}'
|
||||
GIT_COMMITTER_NAME: '${{ github.actor }}'
|
||||
|
@@ -10,12 +10,7 @@
|
||||
[
|
||||
"@semantic-release/git",
|
||||
{
|
||||
"assets": [
|
||||
"index.js",
|
||||
"CHANGELOG.md",
|
||||
"package.json",
|
||||
"package-lock.json"
|
||||
]
|
||||
"assets": ["CHANGELOG.md", "package.json", "package-lock.json"]
|
||||
}
|
||||
],
|
||||
"@semantic-release/github",
|
||||
|
27
CHANGELOG.md
27
CHANGELOG.md
@@ -1,30 +1,3 @@
|
||||
# [2.0.0](https://github.com/simonecorsi/mawesome/compare/v1.0.45...v2.0.0) (2022-05-11)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* fixes default template path ([6cd9c30](https://github.com/simonecorsi/mawesome/commit/6cd9c30b20acb0789668b9fd4cdbace2cb52d3ce))
|
||||
* fixes tsc build ([ec10b79](https://github.com/simonecorsi/mawesome/commit/ec10b79a91bc5894d35b80026d3e216420e0721a))
|
||||
* normalize template file loadup ([445f562](https://github.com/simonecorsi/mawesome/commit/445f562fb50567d995f0d080d4267fc8d494731b))
|
||||
* pre-tags ([d1d4edd](https://github.com/simonecorsi/mawesome/commit/d1d4edd104affc69984905c8408e859c25c58443))
|
||||
* removes unused tests ([a141d23](https://github.com/simonecorsi/mawesome/commit/a141d23972c31b3dbd7e9841168219ad42fa7a18))
|
||||
* reworking files ([19c4c8f](https://github.com/simonecorsi/mawesome/commit/19c4c8f761b244ddccbc445cc34078bf932559d2))
|
||||
* updates gh-star-fetch ([3ec4b7c](https://github.com/simonecorsi/mawesome/commit/3ec4b7cd53c1fe885a51fb64279047a201d535dc))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* release major ([51a4359](https://github.com/simonecorsi/mawesome/commit/51a4359d983be4c842410f0c62104fca1b28252f))
|
||||
* update to node16 ([e1f37af](https://github.com/simonecorsi/mawesome/commit/e1f37af978ebcb7f770949476ac7d6bc788a1fc2))
|
||||
* updates deps ([7ade95d](https://github.com/simonecorsi/mawesome/commit/7ade95df8566a59145652165400cddfd1afa4bed))
|
||||
* using gh-star-fetch ([346ba5d](https://github.com/simonecorsi/mawesome/commit/346ba5d4b7ba6a71bab99f2dbe3c2d010beb67d5))
|
||||
* **template:** adds templates ([2c742b8](https://github.com/simonecorsi/mawesome/commit/2c742b820558fd715de987178303c460f5871c29)), closes [#14](https://github.com/simonecorsi/mawesome/issues/14)
|
||||
|
||||
|
||||
### BREAKING CHANGES
|
||||
|
||||
* refactored code
|
||||
|
||||
# [1.1.0-next.2](https://github.com/simonecorsi/mawesome/compare/v1.1.0-next.1...v1.1.0-next.2) (2022-05-09)
|
||||
|
||||
|
||||
|
24
README.md
24
README.md
@@ -8,6 +8,7 @@ You can see an example of the output at my own [simonecorsi/awesome](https://git
|
||||
|
||||
<!-- toc -->
|
||||
|
||||
- [Table of Contents](#table-of-contents)
|
||||
- [Documentation](#documentation)
|
||||
- [Requirements](#requirements)
|
||||
- [Configuration](#configuration)
|
||||
@@ -20,34 +21,32 @@ You can see an example of the output at my own [simonecorsi/awesome](https://git
|
||||
|
||||
### Requirements
|
||||
|
||||
- An empty repository
|
||||
- A personal github api key
|
||||
- An empty repository
|
||||
- A personal github api key
|
||||
|
||||
### Configuration
|
||||
|
||||
The service can be configured setting the appropriate environment variables or writing an `.env` file.
|
||||
|
||||
| Variable | Description | Default |
|
||||
| ----------------- | -------------------------------------------------------------------- | -------------------------------- |
|
||||
| `api-token` | Personal github api token. | `${{ secrets.API_TOKEN }}` |
|
||||
| `github-token` | Action Token | `${{ secrets.GITHUB_TOKEN }}` |
|
||||
| `github-name` | Name used for the commit, default to action | Github Action |
|
||||
| `github-email` | email used for commit, default to action | actions@users.noreply.github.com |
|
||||
| `template-path` | Custom output template file ([EJS](https://ejs.co/) template engine) | [TEMPLATE.ejs](./TEMPLATE.ejs) |
|
||||
| `output-filename` | Output filename | `README.md` |
|
||||
| Variable | Description | Default |
|
||||
| -------------- | ------------------------------------------- | -------------------------------- |
|
||||
| `api-token` | Personal github api token. | `${{ secrets.API_TOKEN }}` |
|
||||
| `github-token` | Action Token | `${{ secrets.GITHUB_TOKEN }}` |
|
||||
| `github-name` | Name used for the commit, default to action | Github Action |
|
||||
| `github-email` | email used for commit, default to action | actions@users.noreply.github.com |
|
||||
|
||||
#### `api-token`
|
||||
|
||||
The Personal API Access Token is mandatory to fetch stars from the API without incurring in Rate Limits.
|
||||
|
||||
You'll have to generate a [personal api token](https://github.com/settings/tokens/new) and then add
|
||||
You'll have to generate a [personal api token](https://github.com/settings/tokens/new) and then add
|
||||
|
||||
## Example workflow
|
||||
|
||||
```yml
|
||||
name: Update awesome list
|
||||
|
||||
on:
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
@@ -64,4 +63,5 @@ jobs:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
github-email: ${{ secrets.USER_EMAIL }}
|
||||
github-name: ${{ github.repository_owner }}
|
||||
|
||||
```
|
||||
|
@@ -27,5 +27,5 @@ inputs:
|
||||
required: false
|
||||
default: 'README.md'
|
||||
runs:
|
||||
using: 'node16'
|
||||
using: 'node12'
|
||||
main: 'index.js'
|
||||
|
7
ava.config.js
Normal file
7
ava.config.js
Normal file
@@ -0,0 +1,7 @@
|
||||
/* eslint-disable node/no-unsupported-features/es-syntax */
|
||||
|
||||
export default {
|
||||
files: ['!templates/**/*'],
|
||||
extensions: ['ts'],
|
||||
require: ['ts-node/register/transpile-only'],
|
||||
};
|
6271
package-lock.json
generated
6271
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
48
package.json
48
package.json
@@ -1,15 +1,18 @@
|
||||
{
|
||||
"name": "mawesome",
|
||||
"version": "2.0.0-0",
|
||||
"version": "1.1.0-next.1",
|
||||
"description": "Generate awesome list from user starred repositories",
|
||||
"main": "index.js",
|
||||
"author": "Simone Corsi<simonecorsi.dev@gmail.com>",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"test": "nyc --reporter=lcov --reporter=text-summary ava -s -v",
|
||||
"test:watch": "ava -w",
|
||||
"style:lint": "eslint src --ext .ts",
|
||||
"style:prettier": "prettier \"src/**/*.ts\" --list-different --write",
|
||||
"build": "./node_modules/.bin/ncc build src/index.ts -o ./",
|
||||
"dev": "ts-node-dev src/index.ts",
|
||||
"prerelease": "npm run build",
|
||||
"prepare": "node prepare.js || echo 'Skipping prepare'"
|
||||
},
|
||||
"keywords": [
|
||||
@@ -22,8 +25,8 @@
|
||||
"javascript"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^16.2.4",
|
||||
"@commitlint/config-conventional": "^16.2.4",
|
||||
"@commitlint/cli": "^16.2.3",
|
||||
"@commitlint/config-conventional": "^16.2.1",
|
||||
"@octokit/rest": "^18.12.0",
|
||||
"@octokit/types": "^6.2.1",
|
||||
"@saithodev/semantic-release-backmerge": "^2.1.2",
|
||||
@@ -32,34 +35,35 @@
|
||||
"@semantic-release/git": "^10.0.1",
|
||||
"@semantic-release/github": "^8.0.4",
|
||||
"@semantic-release/release-notes-generator": "^10.0.3",
|
||||
"@types/ejs": "^3.1.0",
|
||||
"@types/ejs": "^3.0.5",
|
||||
"@types/got": "^9.6.12",
|
||||
"@types/node": "^17.0.32",
|
||||
"@types/sinon": "^10.0.11",
|
||||
"@typescript-eslint/eslint-plugin": "^5.23.0",
|
||||
"@typescript-eslint/parser": "^5.23.0",
|
||||
"@vercel/ncc": "^0.33.4",
|
||||
"eslint": "^8.15.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"@types/node": "^14.14.5",
|
||||
"@types/sinon": "^9.0.10",
|
||||
"@typescript-eslint/eslint-plugin": "^5.22.0",
|
||||
"@typescript-eslint/parser": "^5.22.0",
|
||||
"@vercel/ncc": "^0.33.3",
|
||||
"ava": "^3.8.2",
|
||||
"eslint": "^7.17.0",
|
||||
"eslint-config-prettier": "^7.1.0",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-prettier": "^4.0.0",
|
||||
"husky": "^8.0.1",
|
||||
"lint-staged": "^12.4.1",
|
||||
"eslint-plugin-prettier": "^3.3.1",
|
||||
"husky": "^7.0.4",
|
||||
"lint-staged": "^12.3.7",
|
||||
"markdown-toc": "^1.2.0",
|
||||
"nyc": "^15.0.1",
|
||||
"prettier": "^2.6.2",
|
||||
"sinon": "^14.0.0",
|
||||
"ts-node-dev": "^1.1.8",
|
||||
"prettier": "^2.0.5",
|
||||
"sinon": "^9.2.3",
|
||||
"ts-node-dev": "^1.1.1",
|
||||
"typescript": "^4.6.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.8.0",
|
||||
"@actions/core": "^1.2.6",
|
||||
"@actions/exec": "^1.1.1",
|
||||
"ejs": "^3.1.7",
|
||||
"gh-star-fetch": "^1.3.0",
|
||||
"ejs": "^3.1.6",
|
||||
"gh-star-fetch": "^1.1.0",
|
||||
"got": "^11.8.1",
|
||||
"remark": "^14.0.2",
|
||||
"remark-toc": "^8.0.1"
|
||||
"remark": "^13.0.0",
|
||||
"remark-toc": "^7.0.0"
|
||||
},
|
||||
"volta": {
|
||||
"node": "16.14.2",
|
||||
|
21
src/git.ts
21
src/git.ts
@@ -2,17 +2,10 @@
|
||||
|
||||
import * as core from '@actions/core';
|
||||
import * as exec from '@actions/exec';
|
||||
import fs from 'fs/promises';
|
||||
|
||||
const { GITHUB_REPOSITORY, GITHUB_REF } = process.env;
|
||||
|
||||
const branch = GITHUB_REF?.replace('refs/heads/', '');
|
||||
|
||||
type File = {
|
||||
filename: string;
|
||||
data: string;
|
||||
};
|
||||
|
||||
class Git {
|
||||
constructor() {
|
||||
const githubToken = core.getInput('github-token', { required: true });
|
||||
@@ -96,20 +89,6 @@ class Git {
|
||||
updateOrigin = (repo: string) => this.exec(`remote set-url origin ${repo}`);
|
||||
|
||||
createTag = (tag: string) => this.exec(`tag -a ${tag} -m "${tag}"`);
|
||||
|
||||
async pushNewFiles(files: File[] = []): Promise<any> {
|
||||
if (!files.length) return;
|
||||
|
||||
await this.pull();
|
||||
|
||||
await Promise.all(
|
||||
files.map(({ filename, data }) => fs.writeFile(filename, data))
|
||||
);
|
||||
|
||||
await this.add(files.map(({ filename }) => filename));
|
||||
await this.commit(`chore(updates): updated entries in files`);
|
||||
await this.push();
|
||||
}
|
||||
}
|
||||
|
||||
export default new Git();
|
||||
|
@@ -1,11 +1,17 @@
|
||||
import fs from 'fs';
|
||||
import ejs from 'ejs';
|
||||
import * as core from '@actions/core';
|
||||
import { remark } from 'remark';
|
||||
import remark from 'remark';
|
||||
import toc from 'remark-toc';
|
||||
import git from './git';
|
||||
|
||||
import type { PaginationLink, ApiGetStarResponse, Stars, Star } from './types';
|
||||
|
||||
export const REPO_USERNAME = process.env.GITHUB_REPOSITORY?.split('/')[0];
|
||||
export const API_STARRED_URL = `${process.env.GITHUB_API_URL}/users/${REPO_USERNAME}/starred`;
|
||||
|
||||
const fsp = fs.promises;
|
||||
|
||||
export async function renderer(
|
||||
data: { [key: string]: any },
|
||||
templateString: string
|
||||
@@ -34,3 +40,22 @@ export function generateMd(data: string): Promise<string> {
|
||||
}
|
||||
|
||||
export const MARKDOWN_FILENAME: string = core.getInput('output-filename');
|
||||
|
||||
type File = {
|
||||
filename: string;
|
||||
data: string;
|
||||
};
|
||||
|
||||
export async function pushNewFiles(files: File[] = []): Promise<any> {
|
||||
if (!files.length) return;
|
||||
|
||||
await git.pull();
|
||||
|
||||
await Promise.all(
|
||||
files.map(({ filename, data }) => fsp.writeFile(filename, data))
|
||||
);
|
||||
|
||||
await git.add(files.map(({ filename }) => filename));
|
||||
await git.commit(`chore(updates): updated entries in files`);
|
||||
await git.push();
|
||||
}
|
||||
|
24
src/index.ts
24
src/index.ts
@@ -1,37 +1,35 @@
|
||||
import path from 'path';
|
||||
import * as core from '@actions/core';
|
||||
import { readFile } from 'fs/promises';
|
||||
import { readdir, readFile } from 'fs/promises';
|
||||
import ghStarFetch from 'gh-star-fetch';
|
||||
|
||||
import {
|
||||
renderer,
|
||||
REPO_USERNAME,
|
||||
generateMd,
|
||||
pushNewFiles,
|
||||
MARKDOWN_FILENAME,
|
||||
} from './helpers';
|
||||
import git from './git';
|
||||
import MD_TEMPLATE from './template';
|
||||
|
||||
export async function main() {
|
||||
// set default template
|
||||
let template = await readFile(
|
||||
path.resolve(__dirname, './TEMPLATE.ejs'),
|
||||
'utf8'
|
||||
);
|
||||
let template = MD_TEMPLATE;
|
||||
|
||||
// get template if found in the repo
|
||||
const customTemplatePath = core.getInput('template-path');
|
||||
core.info(`check if customTemplatePath: ${customTemplatePath} exists`);
|
||||
console.log(`check if customTemplatePath: ${customTemplatePath} exists`);
|
||||
try {
|
||||
template = await readFile(customTemplatePath, 'utf8');
|
||||
const dir = await readdir('./');
|
||||
console.log(dir.join('\n'));
|
||||
template = await readFile('TEMPLATE.ejs', 'utf8');
|
||||
} catch {
|
||||
core.info("Couldn't find template file, using default");
|
||||
console.log("Couldn't find template file, using default");
|
||||
}
|
||||
|
||||
const sortedByLanguages = await ghStarFetch({
|
||||
accessToken: core.getInput('api-token', { required: true }),
|
||||
compactByLanguage: true,
|
||||
});
|
||||
console.log('sortedByLanguages :>> ', sortedByLanguages);
|
||||
|
||||
const rendered = await renderer(
|
||||
{
|
||||
@@ -44,7 +42,7 @@ export async function main() {
|
||||
|
||||
const markdown: string = await generateMd(rendered);
|
||||
|
||||
await git.pushNewFiles([
|
||||
await pushNewFiles([
|
||||
{
|
||||
filename: MARKDOWN_FILENAME,
|
||||
data: markdown,
|
||||
@@ -56,7 +54,7 @@ export async function main() {
|
||||
]);
|
||||
}
|
||||
|
||||
export async function run(): Promise<void> {
|
||||
export async function run(): Promise<any> {
|
||||
try {
|
||||
await main();
|
||||
} catch (error) {
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# <%= username %> Awesome List [](https://github.com/sindresorhus/awesome)
|
||||
export default `# <%= username %> Awesome List [](https://github.com/sindresorhus/awesome)
|
||||
|
||||
> :star: generated with [simonecorsi/mawesome](https://github.com/simonecorsi/mawesome)
|
||||
|
||||
@@ -11,3 +11,4 @@
|
||||
<% } %>
|
||||
|
||||
<% } %>
|
||||
`;
|
52
test/helpers.spec.ts
Normal file
52
test/helpers.spec.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import test from 'ava';
|
||||
import * as sinon from 'sinon';
|
||||
import fs from 'fs';
|
||||
|
||||
import * as core from '@actions/core';
|
||||
sinon.replace(core, 'getInput', sinon.fake());
|
||||
|
||||
import Git from '../src/git';
|
||||
const pull = sinon.fake();
|
||||
sinon.replace(Git, 'pull', pull);
|
||||
const add = sinon.fake();
|
||||
sinon.replace(Git, 'add', add);
|
||||
const commit = sinon.fake();
|
||||
sinon.replace(Git, 'commit', commit);
|
||||
const push = sinon.fake();
|
||||
sinon.replace(Git, 'push', push);
|
||||
sinon.replace(Git, 'config', sinon.fake());
|
||||
sinon.replace(Git, 'updateOrigin', sinon.fake());
|
||||
|
||||
const fsp = fs.promises;
|
||||
const writeFile = sinon.fake();
|
||||
sinon.replace(fsp, 'writeFile', writeFile);
|
||||
|
||||
import { renderer, generateMd, pushNewFiles } from '../src/helpers';
|
||||
|
||||
test('renderer should render', async (t) => {
|
||||
const output = await renderer({ variable: 123 }, 'Test: <%= variable %>');
|
||||
t.is(output, 'Test: 123');
|
||||
});
|
||||
|
||||
test('generateMd should create TOC', async (t) => {
|
||||
const tpl = `# title
|
||||
|
||||
## Table of Contents
|
||||
|
||||
## Javascript
|
||||
`;
|
||||
const result = await generateMd(tpl);
|
||||
t.is(
|
||||
result,
|
||||
`# title\n\n## Table of Contents\n\n* [Javascript](#javascript)\n\n## Javascript\n`
|
||||
);
|
||||
});
|
||||
|
||||
test('should push', async (t) => {
|
||||
await pushNewFiles([{ filename: 'README.md', data: '# title' }]);
|
||||
t.true(writeFile.called);
|
||||
t.true(pull.called);
|
||||
t.true(add.called);
|
||||
t.true(commit.called);
|
||||
t.true(push.called);
|
||||
});
|
Reference in New Issue
Block a user