├── .github └── FUNDING.yml ├── .gitignore ├── .prettierrc ├── CHANGELOG.md ├── README.md ├── circle.yml ├── demo ├── .gitignore ├── package.json ├── pages │ ├── _posts │ │ ├── my-first-post.md │ │ └── my-first-post.png │ ├── about.md │ ├── index.md │ └── posts.md ├── saber-config.js └── yarn.lock ├── lerna.json ├── package.json ├── packages ├── create-portfolio │ ├── CHANGELOG.md │ ├── README.md │ ├── lib │ │ ├── cli.js │ │ └── index.js │ ├── package.json │ ├── template │ │ ├── README.md │ │ ├── _gitignore │ │ ├── pages │ │ │ ├── _posts │ │ │ │ └── my-first-post.md │ │ │ ├── about.md │ │ │ ├── index.md │ │ │ └── posts.md │ │ └── saber-config.js │ └── yarn.lock └── saber-theme-portfolio │ ├── .gitignore │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── postcss.config.js │ └── src │ ├── components │ ├── Disqus.vue │ ├── HomePosts.vue │ ├── HomeProfile.vue │ ├── HomeProjects.vue │ ├── HomeSection.vue │ ├── HomeSkills.vue │ ├── PostCard.vue │ ├── PostMeta.vue │ ├── ProjectCard.vue │ └── SkillCard.vue │ ├── css │ ├── global.css │ ├── highlight.css │ └── variables.css │ ├── layouts │ ├── home.vue │ ├── page.vue │ ├── post.vue │ ├── posts.vue │ └── tag.vue │ ├── saber-browser.js │ └── saber-node.js └── yarn.lock /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: egoist 5 | open_collective: saber 6 | ko_fi: support_egoist 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | custom: # Replace with a single custom sponsorship URL 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | *.log 4 | public -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true 4 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. 5 | 6 | # [0.3.0](https://github.com/saberland/create-portfolio/compare/v0.2.2...v0.3.0) (2020-03-24) 7 | 8 | ### Features 9 | 10 | - **Post:** Implement asset cover feature ([#124](https://github.com/saberland/create-portfolio/issues/124)) ([0c46134](https://github.com/saberland/create-portfolio/commit/0c46134)) 11 | 12 | ## [0.2.2](https://github.com/saberland/create-portfolio/compare/v0.2.1...v0.2.2) (2019-09-16) 13 | 14 | ### Bug Fixes 15 | 16 | - **deps:** bump sabar and sabar-plugin-query-posts ([#66](https://github.com/saberland/create-portfolio/issues/66)) ([0a10a9d](https://github.com/saberland/create-portfolio/commit/0a10a9d)) 17 | 18 | ## [0.2.1](https://github.com/egoist/create-portfolio/compare/v0.2.0...v0.2.1) (2019-07-25) 19 | 20 | ### Bug Fixes 21 | 22 | - add siteConfig.url in saber config, fix [#63](https://github.com/egoist/create-portfolio/issues/63) ([3d98910](https://github.com/egoist/create-portfolio/commit/3d98910)) 23 | 24 | # [0.2.0](https://github.com/egoist/create-portfolio/compare/v0.1.11...v0.2.0) (2019-06-27) 25 | 26 | ### Bug Fixes 27 | 28 | - **theme:** Added twitter:card to all pages ([#34](https://github.com/egoist/create-portfolio/issues/34)) ([c785617](https://github.com/egoist/create-portfolio/commit/c785617)) 29 | - add missing css for page content ([#41](https://github.com/egoist/create-portfolio/issues/41)) ([6523081](https://github.com/egoist/create-portfolio/commit/6523081)) 30 | 31 | ### Features 32 | 33 | - add saber-plugin-feed to create-portfolio ([#39](https://github.com/egoist/create-portfolio/issues/39)) ([ae068da](https://github.com/egoist/create-portfolio/commit/ae068da)) 34 | 35 | ## [0.1.11](https://github.com/egoist/create-portfolio/compare/v0.1.10...v0.1.11) (2019-06-25) 36 | 37 | ### Bug Fixes 38 | 39 | - fallback to empty array for users with no repos ([#26](https://github.com/egoist/create-portfolio/issues/26)) ([a33fc51](https://github.com/egoist/create-portfolio/commit/a33fc51)) 40 | 41 | ### Features 42 | 43 | - updated meta tags ([#30](https://github.com/egoist/create-portfolio/issues/30)) ([f0a1cb7](https://github.com/egoist/create-portfolio/commit/f0a1cb7)) 44 | 45 | ## [0.1.10](https://github.com/egoist/create-portfolio/compare/v0.1.9...v0.1.10) (2019-06-06) 46 | 47 | ### Bug Fixes 48 | 49 | - **theme:** ensure post width ([91c3fe2](https://github.com/egoist/create-portfolio/commit/91c3fe2)) 50 | 51 | ## [0.1.9](https://github.com/egoist/create-portfolio/compare/v0.1.8...v0.1.9) (2019-06-01) 52 | 53 | ### Bug Fixes 54 | 55 | - prevent from styling highlighted code, closes [#13](https://github.com/egoist/create-portfolio/issues/13) ([edea9bd](https://github.com/egoist/create-portfolio/commit/edea9bd)) 56 | 57 | ## [0.1.8](https://github.com/egoist/create-portfolio/compare/v0.1.7...v0.1.8) (2019-05-31) 58 | 59 | ### Bug Fixes 60 | 61 | - **deps:** [security] bump axios from 0.18.0 to 0.19.0 ([#12](https://github.com/egoist/create-portfolio/issues/12)) ([cea701f](https://github.com/egoist/create-portfolio/commit/cea701f)) 62 | - **deps:** bump saber-highlight-css from 0.0.4 to 0.0.5 ([#10](https://github.com/egoist/create-portfolio/issues/10)) ([95dba7f](https://github.com/egoist/create-portfolio/commit/95dba7f)) 63 | - **deps:** bump saber-plugin-prismjs from 0.2.0 to 0.2.1 ([#9](https://github.com/egoist/create-portfolio/issues/9)) ([bba91ff](https://github.com/egoist/create-portfolio/commit/bba91ff)) 64 | 65 | ### Features 66 | 67 | - Add disqus support ([#11](https://github.com/egoist/create-portfolio/issues/11)) ([b9a8fa9](https://github.com/egoist/create-portfolio/commit/b9a8fa9)) 68 | 69 | ## [0.1.7](https://github.com/egoist/create-portfolio/compare/v0.1.6...v0.1.7) (2019-05-29) 70 | 71 | ### Features 72 | 73 | - support using GitHub pinned repositories ([#8](https://github.com/egoist/create-portfolio/issues/8)) ([7a4e90a](https://github.com/egoist/create-portfolio/commit/7a4e90a)) 74 | 75 | ## [0.1.6](https://github.com/egoist/create-portfolio/compare/v0.1.5...v0.1.6) (2019-05-28) 76 | 77 | ### Bug Fixes 78 | 79 | - **theme:** code padding ([9d98e05](https://github.com/egoist/create-portfolio/commit/9d98e05)) 80 | 81 | ## [0.1.5](https://github.com/egoist/create-portfolio/compare/v0.1.4...v0.1.5) (2019-05-28) 82 | 83 | ### Features 84 | 85 | - support code highlighting ([9485783](https://github.com/egoist/create-portfolio/commit/9485783)) 86 | 87 | ## [0.1.4](https://github.com/egoist/create-portfolio/compare/v0.1.3...v0.1.4) (2019-05-28) 88 | 89 | ### Features 90 | 91 | - add README in template ([6d71891](https://github.com/egoist/create-portfolio/commit/6d71891)) 92 | 93 | ## [0.1.3](https://github.com/egoist/create-portfolio/compare/v0.1.2...v0.1.3) (2019-05-28) 94 | 95 | ### Bug Fixes 96 | 97 | - **pkg:** add missing README ([2cfa0e4](https://github.com/egoist/create-portfolio/commit/2cfa0e4)) 98 | - add noopener noreferrer ([a06fe39](https://github.com/egoist/create-portfolio/commit/a06fe39)) 99 | - open skills in new tab ([#5](https://github.com/egoist/create-portfolio/issues/5)) ([195583a](https://github.com/egoist/create-portfolio/commit/195583a)) 100 | 101 | ## [0.1.2](https://github.com/egoist/create-portfolio/compare/v0.1.1...v0.1.2) (2019-05-28) 102 | 103 | ### Bug Fixes 104 | 105 | - add update notifier ([d0a4d32](https://github.com/egoist/create-portfolio/commit/d0a4d32)) 106 | 107 | ## [0.1.1](https://github.com/egoist/create-portfolio/compare/v0.1.0...v0.1.1) (2019-05-28) 108 | 109 | ### Bug Fixes 110 | 111 | - **template:** add npm scripts ([a0cea34](https://github.com/egoist/create-portfolio/commit/a0cea34)) 112 | - ensure project language ([fd3ae7d](https://github.com/egoist/create-portfolio/commit/fd3ae7d)) 113 | - package metadata ([69c7bd2](https://github.com/egoist/create-portfolio/commit/69c7bd2)) 114 | 115 | ### Features 116 | 117 | - showcase skills, fix [#2](https://github.com/egoist/create-portfolio/issues/2) ([54303d9](https://github.com/egoist/create-portfolio/commit/54303d9)) 118 | 119 | # 0.1.0 (2019-05-28) 120 | 121 | ### Features 122 | 123 | - init ([83a2f72](https://github.com/egoist/create-portfolio/commit/83a2f72)) 124 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | create-portfolio-preview 3 | 4 | 5 | ## Introduction 6 | 7 | Create Portfolio helps you kickstart a personal website that showcases your work as a software developer. It will automatically render a webpage with the owner's profile information, including a photo, bio, and repositories. 8 | 9 | Your personal website is waiting to be personalized, though. It includes space to highlight your specific areas of interest in software development, like languages or industries. And it's standing by to publish your next great blog post. 10 | 11 | It's all possible using the combination of [Saber](https://saber.land) (for building your website), and GitHub's API (for automatically populating your website with content). 12 | 13 | ## Prerequisite 14 | 15 | You need [Node.js](https://nodejs.org) installed on your machine. 16 | 17 | ## Quick Start 18 | 19 | Create a new project with a single command: 20 | 21 | ```bash 22 | npx create-portfolio my-site 23 | # OR Yarn 24 | yarn create portfolio my-site 25 | ``` 26 | 27 | Alternatively, you can install `create-portfolio` globally: 28 | 29 | ```bash 30 | npm i -g create-portfolio 31 | create-portfolio my-site 32 | ``` 33 | 34 | Change into your new directory: 35 | 36 | ```bash 37 | cd my-site 38 | ``` 39 | 40 | Install dependencies: 41 | 42 | ```bash 43 | npm install 44 | ``` 45 | 46 | Run the website locally: 47 | 48 | ```bash 49 | npm run dev 50 | ``` 51 | 52 | Now browse to http://localhost:3000 you should see your page. 53 | 54 | ## Build for Production 55 | 56 | Run `npm run build` to create a production build of your app, generated files can be found at `./public` folder, then it can be [deployed as a static website](https://saber.land/docs/deployment.html). 57 | 58 | ## Creating a Post 59 | 60 | Check out [the example post](./packages/create-portfolio/template/pages/_posts/my-first-post.md). 61 | 62 | ### Adding a Social Media Cover Photo 63 | 64 | By default, all posts will use your GitHub profile picture when embedded on social media. Should you wish to use a different image you can add under `assets.cover`: 65 | 66 | ```markdown 67 | --- 68 | title: My First Post 69 | layout: post 70 | date: 2019-05-26 20:23:00 71 | assets: 72 | cover: @/images/cover.png 73 | tags: 74 | - life 75 | --- 76 | ``` 77 | 78 | ## Site Configuration 79 | 80 | Use `siteConfig` option in `saber-config.js` for site configuration. 81 | 82 | ### Site Title 83 | 84 | It defaults to your GitHub name, you can customize it in `saber-config.js`: 85 | 86 | ```js 87 | module.exports = { 88 | siteConfig: { 89 | title: 'A Custom Title' 90 | } 91 | } 92 | ``` 93 | 94 | ### Site Description 95 | 96 | It defaults to your GitHub bio, you can customize it in `saber-config.js`: 97 | 98 | ```js 99 | module.exports = { 100 | siteConfig: { 101 | description: 'Introduce yourself...' 102 | } 103 | } 104 | ``` 105 | 106 | ## Theme Configuration 107 | 108 | Use `themeConfig` option in `saber-config.js` for theme configuration. 109 | 110 | ### Projects 111 | 112 | By default we fetch your top 6 starred repositories from GitHub, if set to `pinned-project`, it will use pinned repositories instead: 113 | 114 | ```js 115 | module.exports = { 116 | themeConfig: { 117 | projects: 'pinned-repos' 118 | } 119 | } 120 | ``` 121 | 122 | ### Style 123 | 124 | By default it uses `dark` style: 125 | 126 | ```js 127 | module.exports = { 128 | themeConfig: { 129 | style: 'dark' 130 | } 131 | } 132 | ``` 133 | 134 | Available styles: 135 | 136 | - `dark` 137 | - `light` 138 | 139 | ### GitHub 140 | 141 | This is required, we fetch data for this user. 142 | 143 | ```js 144 | module.exports = { 145 | themeConfig: { 146 | // Your GitHub Username 147 | github: 'egoist' 148 | } 149 | } 150 | ``` 151 | 152 | ### Twitter 153 | 154 | Show the link to your Twitter profile. 155 | 156 | ```js 157 | module.exports = { 158 | themeConfig: { 159 | // Twitter handle 160 | twitter: '_egoistlily' 161 | } 162 | } 163 | ``` 164 | 165 | ### Sponsor 166 | 167 | Add a _Sponsor_ button: 168 | 169 | ```js 170 | module.exports = { 171 | themeConfig: { 172 | // Link to the donation page 173 | sponsorLink: 'https://patreon.com/egoist', 174 | // The tip to show when you hover the sponsor button 175 | sponsorTip: 'Support me' 176 | } 177 | } 178 | ``` 179 | 180 | ### Skills 181 | 182 | Showcase your skills: 183 | 184 | ```js 185 | module.exports = { 186 | themeConfig: { 187 | skills: [ 188 | { 189 | topic: 'nodejs', 190 | description: `I'm a Node.js core contributor`, 191 | // `image` is optional, by default we load from GitHub 192 | image: 'https://...' 193 | } 194 | ] 195 | } 196 | } 197 | ``` 198 | 199 | The `topic` should be a valid [GitHub topic](https://github.com/topics), if the topic doesn't have a image by default on GitHub, you need to provide one yourself. 200 | 201 | You can check if the image exists by visiting `https://github.com/github/explore/tree/master/topics/{topic}` (replace `{topic}` with actual topic). 202 | 203 | ### Comments 204 | 205 | You can use Disqus for comments: 206 | 207 | ```yml 208 | themeConfig: 209 | disqus: disqus-short-name 210 | 211 | # Note that `siteConfig.url` is required for Disqus 212 | siteConfig: 213 | url: https://example.com 214 | ``` 215 | 216 | Comments are only enabled for `post` layout, to disable comments in specific page, you can use the page attribute `comments`: 217 | 218 | ```markdown 219 | --- 220 | title: Hello 221 | layout: post 222 | date: 2018-08-12 223 | comments: false 224 | --- 225 | 226 | Hello World! 227 | ``` 228 | 229 | ## License 230 | 231 | MIT © [EGOIST](https://github.com/egoist) 232 | -------------------------------------------------------------------------------- /circle.yml: -------------------------------------------------------------------------------- 1 | 2 | version: 2 3 | jobs: 4 | build: 5 | docker: 6 | - image: circleci/node:latest 7 | branches: 8 | ignore: 9 | - gh-pages # list of branches to ignore 10 | - /release\/.*/ # or ignore regexes 11 | steps: 12 | - checkout 13 | - restore_cache: 14 | key: dependency-cache-{{ checksum "yarn.lock" }} 15 | - run: 16 | name: install dependences 17 | command: yarn 18 | - save_cache: 19 | key: dependency-cache-{{ checksum "yarn.lock" }} 20 | paths: 21 | - ./node_modules 22 | - run: 23 | name: test 24 | command: yarn test -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | .DS_Store 4 | 5 | # Saber output 6 | public 7 | .saber 8 | -------------------------------------------------------------------------------- /demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "demo", 4 | "license": "MIT", 5 | "scripts": { 6 | "dev": "saber", 7 | "build": "saber build" 8 | }, 9 | "devDependencies": { 10 | "saber": "^0.9.0", 11 | "saber-plugin-feed": "^0.4.2", 12 | "saber-plugin-query-posts": "^0.4.2" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /demo/pages/_posts/my-first-post.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: My First Post 3 | layout: post 4 | assets: 5 | cover: "./my-first-post.png" 6 | date: 2019-05-26 20:23:00 7 | tags: 8 | - life 9 | --- 10 | 11 | ## Text 12 | 13 | ```markdown 14 | It's very easy to make some words **bold** and other words _italic_ with Markdown. 15 | You can even [link to Google!](http://google.com) 16 | ``` 17 | 18 | It's very easy to make some words **bold** and other words _italic_ with Markdown. 19 | You can even [link to Google!](http://google.com) 20 | 21 | ## Lists 22 | 23 | ```markdown 24 | Sometimes you want numbered lists: 25 | 26 | 1. One 27 | 2. Two 28 | 3. Three 29 | 30 | Sometimes you want bullet points: 31 | 32 | - Start a line with a star 33 | - Profit! 34 | 35 | Alternatively, 36 | 37 | - Dashes work just as well 38 | - And if you have sub points, put two spaces before the dash or star: 39 | - Like this 40 | - And this 41 | ``` 42 | 43 | Sometimes you want numbered lists: 44 | 45 | 1. One 46 | 2. Two 47 | 3. Three 48 | 49 | Sometimes you want bullet points: 50 | 51 | - Start a line with a star 52 | - Profit! 53 | 54 | Alternatively, 55 | 56 | - Dashes work just as well 57 | - And if you have sub points, put two spaces before the dash or star: 58 | - Like this 59 | - And this 60 | 61 | ## Images 62 | 63 | If you want to embed images, this is how you do it: 64 | 65 | ```markdown 66 | ![Image of Yaktocat](https://octodex.github.com/images/yaktocat.png) 67 | ``` 68 | 69 | ![Image of Yaktocat](https://octodex.github.com/images/yaktocat.png) 70 | 71 | ## Blockquotes 72 | 73 | If you'd like to quote someone, use the > character before the line: 74 | 75 | ```markdown 76 | > Coffee. The finest organic suspension ever devised... I beat the Borg with it. - Captain Janeway 77 | ``` 78 | 79 | > Coffee. The finest organic suspension ever devised... I beat the Borg with it. - Captain Janeway 80 | 81 | ## Code 82 | 83 | And if you'd like to use syntax highlighting, optionally include the language: 84 | 85 | ````markdown 86 | ```javascript 87 | if (isAwesome) { 88 | return true 89 | } 90 | ``` 91 | ```` 92 | 93 | ```javascript 94 | if (isAwesome) { 95 | return true 96 | } 97 | ``` 98 | 99 | ## Task Lists 100 | 101 | But I have to admit, tasks lists are my favorite: 102 | 103 | ```markdown 104 | - [x] This is a complete item 105 | - [ ] This is an incomplete item 106 | ``` 107 | 108 | - [x] This is a complete item 109 | - [ ] This is an incomplete item 110 | -------------------------------------------------------------------------------- /demo/pages/_posts/my-first-post.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saberland/create-portfolio/1bbd4687871f1cb3f0e1687ed02871c53319eb29/demo/pages/_posts/my-first-post.png -------------------------------------------------------------------------------- /demo/pages/about.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: About 3 | layout: page 4 | --- 5 | 6 | ## Prerequisite 7 | 8 | You need [Node.js](https://nodejs.org) installed on your machine. 9 | 10 | ## Quick Start 11 | 12 | Create a new project with a single command: 13 | 14 | ```bash 15 | npx create-portfolio my-site 16 | # OR Yarn 17 | yarn create portfolio my-site 18 | ``` 19 | 20 | Alternatively, you can install `create-portfolio` globally: 21 | 22 | ```bash 23 | npm i -g create-portfolio 24 | create-portfolio my-site 25 | ``` 26 | 27 | Change into your new directory: 28 | 29 | ```bash 30 | cd my-site 31 | ``` 32 | 33 | Install dependencies: 34 | 35 | ```bash 36 | npm install 37 | ``` 38 | 39 | Run the website locally: 40 | 41 | ```bash 42 | npm run dev 43 | ``` 44 | 45 | Now browse to http://localhost:3000 you should see your page. 46 | 47 | ## Build for Production 48 | 49 | Run `npm run build` to create a production build of your app, generated files can be found at `./public` folder, then it can be [deployed as a static website](https://saber.land/docs/deployment.html). 50 | -------------------------------------------------------------------------------- /demo/pages/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: home 3 | 4 | # Inject blog posts as `page.posts` 5 | injectAllPosts: 6 | perPage: 6 7 | --- 8 | -------------------------------------------------------------------------------- /demo/pages/posts.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Posts 3 | layout: posts 4 | 5 | # Inject posts as `page.posts` 6 | injectAllPosts: 7 | perPage: 30 8 | 9 | # Ensure the permalink 10 | # So even if you change `permalinks` in saber-config.js 11 | # It won't break saber-theme-portfolio 12 | permalink: /posts 13 | --- 14 | -------------------------------------------------------------------------------- /demo/saber-config.js: -------------------------------------------------------------------------------- 1 | // Saber config file 2 | // https://saber.land/docs/saber-config.html 3 | 4 | module.exports = { 5 | siteConfig: { 6 | description: 'An unsung artist.', 7 | url: 'https://create-portfolio-demo.saber.land' 8 | }, 9 | 10 | // Use the package `saber-theme-portfolio` 11 | // More: https://saber.land/docs/themes.html 12 | theme: '../packages/saber-theme-portfolio/src', 13 | 14 | // Configure the theme 15 | themeConfig: { 16 | projects: 'pinned-repos', 17 | style: 'dark', 18 | github: 'egoist', 19 | twitter: '_egoistlily', 20 | sponsorLink: 'https://patreon.com/egoist', 21 | sponsorTip: 'Support my work', 22 | disqus: 'create-portfolio', 23 | nav: [ 24 | { 25 | text: 'Home', 26 | link: '/' 27 | }, 28 | { 29 | text: 'About', 30 | link: '/about' 31 | } 32 | ], 33 | skills: [ 34 | { 35 | topic: 'nodejs', 36 | description: `I love Node.js and I use it every single day.` 37 | }, 38 | { 39 | topic: 'vue', 40 | description: `I contribute to Vue ecosytem every a few days` 41 | }, 42 | { 43 | topic: 'webpack', 44 | description: `I'm pretty good at webpack, probably` 45 | } 46 | ] 47 | }, 48 | 49 | permalinks: { 50 | page: '/:slug', 51 | post: '/posts/:slug' 52 | }, 53 | 54 | plugins: [ 55 | { 56 | resolve: 'saber-plugin-query-posts' 57 | }, 58 | { 59 | resolve: 'saber-plugin-feed', 60 | options: { 61 | atomFeed: true 62 | } 63 | } 64 | ] 65 | } 66 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": ["packages/*"], 3 | "version": "0.3.0" 4 | } 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "create-portfolio", 4 | "version": "0.0.0", 5 | "license": "MIT", 6 | "scripts": { 7 | "test": "xo && lerna run test" 8 | }, 9 | "devDependencies": { 10 | "eslint-config-prettier": "^6.0.0", 11 | "eslint-config-rem": "^4.0.0", 12 | "eslint-plugin-prettier": "^3.1.0", 13 | "eslint-plugin-vue": "^5.2.2", 14 | "husky": "^3.0.0", 15 | "lerna": "^3.14.1", 16 | "lint-staged": "^9.0.0", 17 | "prettier": "^1.17.1", 18 | "xo": "^0.24.0" 19 | }, 20 | "workspaces": [ 21 | "packages/*" 22 | ], 23 | "xo": { 24 | "extensions": [ 25 | "vue" 26 | ], 27 | "extends": [ 28 | "rem", 29 | "plugin:vue/recommended", 30 | "prettier/vue", 31 | "plugin:prettier/recommended" 32 | ], 33 | "rules": { 34 | "import/no-unassigned-import": "off", 35 | "unicorn/filename-case": "off" 36 | } 37 | }, 38 | "lint-staged": { 39 | "*.{json,md}": [ 40 | "prettier --write", 41 | "git add" 42 | ], 43 | "*.{js,vue}": [ 44 | "xo --fix", 45 | "git add" 46 | ] 47 | }, 48 | "husky": { 49 | "hooks": { 50 | "pre-commit": "lint-staged" 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /packages/create-portfolio/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. 5 | 6 | # [0.3.0](https://github.com/saberland/create-portfolio/compare/v0.2.2...v0.3.0) (2020-03-24) 7 | 8 | **Note:** Version bump only for package create-portfolio 9 | 10 | ## [0.2.2](https://github.com/saberland/create-portfolio/compare/v0.2.1...v0.2.2) (2019-09-16) 11 | 12 | ### Bug Fixes 13 | 14 | - **deps:** bump sabar and sabar-plugin-query-posts ([#66](https://github.com/saberland/create-portfolio/issues/66)) ([0a10a9d](https://github.com/saberland/create-portfolio/commit/0a10a9d)) 15 | 16 | ## [0.2.1](https://github.com/saberland/create-portfolio/compare/v0.2.0...v0.2.1) (2019-07-25) 17 | 18 | ### Bug Fixes 19 | 20 | - add siteConfig.url in saber config, fix [#63](https://github.com/saberland/create-portfolio/issues/63) ([3d98910](https://github.com/saberland/create-portfolio/commit/3d98910)) 21 | 22 | # [0.2.0](https://github.com/saberland/create-portfolio/compare/v0.1.11...v0.2.0) (2019-06-27) 23 | 24 | ### Features 25 | 26 | - add saber-plugin-feed to create-portfolio ([#39](https://github.com/saberland/create-portfolio/issues/39)) ([ae068da](https://github.com/saberland/create-portfolio/commit/ae068da)) 27 | 28 | ## [0.1.11](https://github.com/saberland/create-portfolio/compare/v0.1.10...v0.1.11) (2019-06-25) 29 | 30 | **Note:** Version bump only for package create-portfolio 31 | 32 | ## [0.1.4](https://github.com/saberland/create-portfolio/compare/v0.1.3...v0.1.4) (2019-05-28) 33 | 34 | ### Features 35 | 36 | - add README in template ([6d71891](https://github.com/saberland/create-portfolio/commit/6d71891)) 37 | 38 | ## [0.1.3](https://github.com/saberland/create-portfolio/compare/v0.1.2...v0.1.3) (2019-05-28) 39 | 40 | ### Bug Fixes 41 | 42 | - **pkg:** add missing README ([2cfa0e4](https://github.com/saberland/create-portfolio/commit/2cfa0e4)) 43 | 44 | ## [0.1.2](https://github.com/saberland/create-portfolio/compare/v0.1.1...v0.1.2) (2019-05-28) 45 | 46 | ### Bug Fixes 47 | 48 | - add update notifier ([d0a4d32](https://github.com/saberland/create-portfolio/commit/d0a4d32)) 49 | 50 | ## [0.1.1](https://github.com/saberland/create-portfolio/compare/v0.1.0...v0.1.1) (2019-05-28) 51 | 52 | ### Bug Fixes 53 | 54 | - package metadata ([69c7bd2](https://github.com/saberland/create-portfolio/commit/69c7bd2)) 55 | - **template:** add npm scripts ([a0cea34](https://github.com/saberland/create-portfolio/commit/a0cea34)) 56 | 57 | # 0.1.0 (2019-05-28) 58 | 59 | ### Features 60 | 61 | - init ([83a2f72](https://github.com/egoist/create-portfolio/commit/83a2f72)) 62 | -------------------------------------------------------------------------------- /packages/create-portfolio/README.md: -------------------------------------------------------------------------------- 1 | # Create Portfolio 2 | 3 | See the [GitHub repo](https://github.com/saberland/create-portfolio) for more information 4 | -------------------------------------------------------------------------------- /packages/create-portfolio/lib/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | const { cac } = require('cac') 3 | const update = require('update-notifier') 4 | const pkg = require('../package') 5 | 6 | const cli = cac('create-portfolio') 7 | 8 | cli 9 | .command('[directory]', 'Create your portfolio') 10 | .option('--overwrite', 'Overwrite exiting files') 11 | .action((dir, options) => { 12 | if (!dir) { 13 | return cli.outputHelp() 14 | } 15 | 16 | return require('.')(dir, options) 17 | }) 18 | 19 | process.on('unhandledRejection', err => { 20 | console.error(err.stack) 21 | process.exit(1) 22 | }) 23 | 24 | update({ pkg }).notify() 25 | 26 | cli.parse() 27 | -------------------------------------------------------------------------------- /packages/create-portfolio/lib/index.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const { spawnSync } = require('child_process') 3 | const fs = require('fs-extra') 4 | const majo = require('majo') 5 | const Enquirer = require('enquirer') 6 | const ejs = require('ejs') 7 | const colors = require('chalk') 8 | const themeVersion = require('../package').version 9 | 10 | module.exports = async (dir, options) => { 11 | dir = path.resolve(dir) 12 | 13 | if (!options.overwrite) { 14 | const notEmpty = await fs.pathExists(dir).then(exists => { 15 | return exists && fs.readdir(dir).then(files => files.length > 0) 16 | }) 17 | if (notEmpty) { 18 | throw new Error(`Directory ${dir} isn't empty!`) 19 | } 20 | } 21 | 22 | const enquirer = new Enquirer() 23 | const questions = [ 24 | { 25 | name: 'github', 26 | message: 'What is your GitHub username', 27 | type: 'input', 28 | validate(value) { 29 | if (!value) { 30 | return 'This field is required!' 31 | } 32 | 33 | return true 34 | } 35 | }, 36 | { 37 | name: 'twitter', 38 | message: 'What is your Twitter username', 39 | type: 'input' 40 | }, 41 | { 42 | name: 'sponsorLink', 43 | message: 'What is the URL to your donation page', 44 | type: 'input' 45 | } 46 | ] 47 | const answers = await enquirer.prompt(questions) 48 | 49 | const templateDir = path.join(__dirname, '../template') 50 | const stream = majo() 51 | stream.source('**', { baseDir: templateDir, dotFiles: true }) 52 | 53 | stream.use(stream => { 54 | for (const file of stream.fileList) { 55 | // Rename _gitignore to .gitignore 56 | if (file === '_gitignore') { 57 | stream.createFile('.gitignore', stream.file(file)) 58 | stream.deleteFile(file) 59 | } 60 | } 61 | }) 62 | 63 | const projectName = path.basename(dir) 64 | 65 | let npmClient = 'npm' 66 | try { 67 | const { status } = spawnSync('yarn', ['--version']) 68 | if (status === 0) { 69 | npmClient = 'yarn' 70 | } 71 | } catch (error) { 72 | /* Ignore */ 73 | } 74 | 75 | // Render templates with ejs 76 | stream.use(stream => { 77 | for (const file of stream.fileList) { 78 | stream.writeContents( 79 | file, 80 | ejs.render( 81 | stream.fileContents(file), 82 | Object.assign( 83 | { 84 | projectName, 85 | npmClient 86 | }, 87 | answers 88 | ) 89 | ) 90 | ) 91 | } 92 | }) 93 | 94 | // Create package.json 95 | stream.use(stream => { 96 | stream.createFile('package.json', { 97 | contents: Buffer.from( 98 | JSON.stringify( 99 | { 100 | private: true, 101 | name: projectName, 102 | license: 'MIT', 103 | scripts: { 104 | dev: 'saber', 105 | build: 'saber build' 106 | }, 107 | devDependencies: { 108 | saber: '^0.9.0', 109 | 'saber-theme-portfolio': `^${themeVersion}`, 110 | 'saber-plugin-query-posts': '^0.4.2', 111 | 'saber-plugin-feed': '^0.4.2' 112 | } 113 | }, 114 | null, 115 | 2 116 | ) 117 | ) 118 | }) 119 | }) 120 | 121 | await stream.dest(dir) 122 | 123 | console.log() 124 | console.log(colors.bold(' To run the website locally:')) 125 | console.log(` ${colors.cyan('cd')} ${projectName}`) 126 | console.log(` ${colors.cyan(npmClient)} install`) 127 | console.log(` ${colors.cyan(npmClient)} run dev`) 128 | console.log() 129 | console.log(colors.bold(' To build the website for production:')) 130 | console.log(` ${colors.cyan('cd')} ${projectName}`) 131 | console.log(` ${colors.cyan(npmClient)} install`) 132 | console.log(` ${colors.cyan(npmClient)} run build`) 133 | console.log() 134 | console.log( 135 | colors.dim( 136 | ` For more usages, check out ${colors.underline( 137 | 'https://git.io/create-portfolio' 138 | )}` 139 | ) 140 | ) 141 | console.log() 142 | } 143 | -------------------------------------------------------------------------------- /packages/create-portfolio/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-portfolio", 3 | "version": "0.3.0", 4 | "files": [ 5 | "lib", 6 | "template" 7 | ], 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/saberland/create-portfolio.git", 11 | "directory": "packages/create-portfolio" 12 | }, 13 | "bin": "lib/cli.js", 14 | "license": "MIT", 15 | "dependencies": { 16 | "cac": "^6.5.1", 17 | "chalk": "^2.4.2", 18 | "ejs": "^2.6.1", 19 | "enquirer": "^2.3.0", 20 | "fs-extra": "^8.0.1", 21 | "majo": "^0.8.0", 22 | "update-notifier": "^3.0.0" 23 | }, 24 | "xo": false 25 | } 26 | -------------------------------------------------------------------------------- /packages/create-portfolio/template/README.md: -------------------------------------------------------------------------------- 1 | # <%= projectName %> 2 | 3 | ## Scripts 4 | 5 | ### `<%= npmClient %> run dev` 6 | 7 | Run the website locally. 8 | 9 | ### `<%= npmClient %> run build` 10 | 11 | Create a production build of the website, the generated files can be found at `./public` folder, you can [deploy it as a static website](https://saber.land/docs/deployment.html). 12 | 13 | --- 14 | 15 | Created by [Create Portfolio](https://github.com/saberland/create-portfolio) 16 | -------------------------------------------------------------------------------- /packages/create-portfolio/template/_gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | .DS_Store 4 | 5 | # Saber output 6 | public 7 | .saber 8 | -------------------------------------------------------------------------------- /packages/create-portfolio/template/pages/_posts/my-first-post.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: My First Post 3 | layout: post 4 | date: 2019-05-26 20:23:00 5 | tags: 6 | - life 7 | --- 8 | 9 | Consectetur nostrud elit do do do nisi quis. Cillum commodo Lorem sunt non sit velit nostrud fugiat. Et ad anim sint veniam occaecat nulla eu id irure occaecat nulla excepteur elit sint. Tempor dolor dolore aute excepteur nisi Lorem incididunt excepteur magna sint proident in voluptate dolore. Anim eiusmod ea sint velit enim irure est enim duis eiusmod. Culpa ea ea duis anim esse culpa anim laborum proident deserunt quis nisi. Laborum in irure aute consectetur enim cillum incididunt mollit. 10 | 11 | Ullamco non incididunt adipisicing duis. Laborum consectetur occaecat veniam nisi amet consectetur laborum cupidatat culpa aute dolor id. Velit consectetur officia commodo elit. Qui officia adipisicing irure laboris non ullamco est cupidatat eu non Lorem excepteur. Ex cupidatat aliqua eu amet consequat Lorem excepteur reprehenderit consectetur. 12 | 13 | Adipisicing nulla sunt ipsum ipsum ea Lorem aliquip et incididunt cillum eiusmod aliquip Lorem culpa. Voluptate laborum id eu exercitation esse aliqua id reprehenderit enim consequat dolor eu excepteur. Qui ut est ex aute ullamco exercitation id. Commodo reprehenderit exercitation et incididunt officia aute eu nostrud nisi eiusmod ipsum. 14 | 15 | Do occaecat consectetur nisi proident excepteur pariatur esse nisi. Aute magna proident consectetur mollit Lorem non est ad ea non proident. Anim reprehenderit ut adipisicing commodo veniam sit. Nostrud eu sint labore culpa proident laborum do adipisicing nostrud esse. Nostrud anim adipisicing irure aliquip incididunt ea ea. 16 | 17 | Cupidatat id occaecat proident officia. Laboris in incididunt ut dolor in qui amet nostrud ad exercitation minim nulla consectetur. Occaecat dolor labore eu nostrud nulla nulla ex dolore. 18 | -------------------------------------------------------------------------------- /packages/create-portfolio/template/pages/about.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: About 3 | layout: page 4 | --- 5 | 6 | Nostrud et dolor aliquip qui magna adipisicing cillum cillum nisi culpa aliquip exercitation. Dolor reprehenderit sint laborum in nisi deserunt culpa ea irure do sit veniam fugiat. Sit ipsum esse excepteur ad sunt reprehenderit in duis. Et non voluptate esse eu elit duis nulla esse veniam. 7 | 8 | Culpa sit sit cupidatat nulla sit minim fugiat. Cupidatat tempor ut ut Lorem aliqua id pariatur ex velit enim occaecat cupidatat elit tempor. Voluptate officia exercitation ullamco ullamco incididunt irure reprehenderit deserunt occaecat. Minim excepteur aliquip ullamco elit sint exercitation laboris. Ad deserunt ipsum enim exercitation sint culpa ad cillum culpa nostrud nulla ullamco amet deserunt. Consequat voluptate cillum culpa sunt. 9 | 10 | Lorem fugiat consectetur nostrud elit aute do ad duis adipisicing ullamco labore officia dolore. Reprehenderit incididunt incididunt eu sint pariatur minim magna. Ipsum Lorem tempor non est commodo id officia. Exercitation mollit incididunt proident veniam veniam aute. Reprehenderit deserunt magna tempor adipisicing sit dolor non exercitation ut. Exercitation sint dolor ullamco veniam non do deserunt excepteur non nisi. Labore irure culpa esse dolor dolor quis dolore exercitation ad. 11 | 12 | Mollit mollit incididunt aute do fugiat mollit. Proident exercitation mollit culpa sint sit enim laborum. Ut do magna ad Lorem. Exercitation cillum dolor Lorem nisi cillum proident aliquip pariatur mollit. Proident est qui duis ullamco duis eu tempor tempor nostrud velit exercitation reprehenderit aliqua Lorem. 13 | 14 | Nulla ad fugiat quis in veniam minim adipisicing. Magna fugiat tempor ut esse quis cupidatat quis exercitation officia. Sit laboris enim aliquip in exercitation elit et eu incididunt nostrud exercitation culpa culpa est. Occaecat ea fugiat proident non esse in aliqua occaecat ea labore quis velit deserunt. Irure nostrud nostrud dolor incididunt velit. 15 | 16 | Sint velit Lorem occaecat consectetur eu irure anim incididunt et mollit eu. Adipisicing fugiat tempor excepteur cupidatat cupidatat adipisicing aliqua officia. Tempor veniam commodo laborum et sunt. Ea pariatur ullamco et labore dolor do ad eiusmod magna. Veniam voluptate amet ea sunt aute elit incididunt. Magna deserunt laborum cupidatat commodo mollit in id id ut adipisicing amet. 17 | -------------------------------------------------------------------------------- /packages/create-portfolio/template/pages/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: home 3 | 4 | # Inject blog posts as `page.posts` 5 | injectAllPosts: 6 | perPage: 6 7 | --- 8 | -------------------------------------------------------------------------------- /packages/create-portfolio/template/pages/posts.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Posts 3 | layout: posts 4 | 5 | # Inject posts as `page.posts` 6 | injectAllPosts: 7 | perPage: 30 8 | 9 | # Ensure the permalink 10 | # So even if you change `permalinks` in saber-config.js 11 | # It won't break saber-theme-portfolio 12 | permalink: /posts 13 | --- 14 | -------------------------------------------------------------------------------- /packages/create-portfolio/template/saber-config.js: -------------------------------------------------------------------------------- 1 | // Saber config file 2 | // https://saber.land/docs/saber-config.html 3 | 4 | module.exports = { 5 | siteConfig: { 6 | // Change this to the production URL of your website 7 | url: 'https://example.com' 8 | }, 9 | 10 | // Use the package `saber-theme-portfolio` 11 | // More: https://saber.land/docs/themes.html 12 | theme: 'portfolio', 13 | 14 | // Configure the theme 15 | themeConfig: { 16 | style: 'dark', 17 | github: '<%= github %>', 18 | twitter: '<%= twitter %>', 19 | sponsorLink: '<%= sponsorLink %>', 20 | sponsorTip: 'Support my work', 21 | nav: [ 22 | { 23 | text: 'Home', 24 | link: '/' 25 | }, 26 | { 27 | text: 'About', 28 | link: '/about' 29 | } 30 | ] 31 | }, 32 | 33 | permalinks: { 34 | page: '/:slug', 35 | post: '/posts/:slug' 36 | }, 37 | 38 | plugins: [ 39 | { 40 | resolve: 'saber-plugin-query-posts' 41 | }, 42 | { 43 | resolve: 'saber-plugin-feed', 44 | options: { 45 | atomFeed: true 46 | } 47 | } 48 | ] 49 | } 50 | -------------------------------------------------------------------------------- /packages/create-portfolio/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@mrmlnc/readdir-enhanced@^2.2.1": 6 | version "2.2.1" 7 | resolved "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" 8 | integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== 9 | dependencies: 10 | call-me-maybe "^1.0.1" 11 | glob-to-regexp "^0.3.0" 12 | 13 | "@nodelib/fs.stat@^1.1.2": 14 | version "1.1.3" 15 | resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" 16 | integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== 17 | 18 | ansi-colors@^3.2.1: 19 | version "3.2.4" 20 | resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" 21 | integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== 22 | 23 | arr-diff@^4.0.0: 24 | version "4.0.0" 25 | resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 26 | integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= 27 | 28 | arr-flatten@^1.1.0: 29 | version "1.1.0" 30 | resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 31 | integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== 32 | 33 | arr-union@^3.1.0: 34 | version "3.1.0" 35 | resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 36 | integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= 37 | 38 | array-unique@^0.3.2: 39 | version "0.3.2" 40 | resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 41 | integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= 42 | 43 | assign-symbols@^1.0.0: 44 | version "1.0.0" 45 | resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 46 | integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 47 | 48 | atob@^2.1.1: 49 | version "2.1.2" 50 | resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 51 | integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 52 | 53 | base@^0.11.1: 54 | version "0.11.2" 55 | resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 56 | integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== 57 | dependencies: 58 | cache-base "^1.0.1" 59 | class-utils "^0.3.5" 60 | component-emitter "^1.2.1" 61 | define-property "^1.0.0" 62 | isobject "^3.0.1" 63 | mixin-deep "^1.2.0" 64 | pascalcase "^0.1.1" 65 | 66 | braces@^2.3.1: 67 | version "2.3.2" 68 | resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 69 | integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== 70 | dependencies: 71 | arr-flatten "^1.1.0" 72 | array-unique "^0.3.2" 73 | extend-shallow "^2.0.1" 74 | fill-range "^4.0.0" 75 | isobject "^3.0.1" 76 | repeat-element "^1.1.2" 77 | snapdragon "^0.8.1" 78 | snapdragon-node "^2.0.1" 79 | split-string "^3.0.2" 80 | to-regex "^3.0.1" 81 | 82 | cac@^6.5.1: 83 | version "6.5.1" 84 | resolved "https://registry.npmjs.org/cac/-/cac-6.5.1.tgz#c5685ebc20a8448558191d70a2a76636640308a0" 85 | integrity sha512-mqKv0Ub/nXSoqlACRvrso3k7+nCdzUNimdh+3l0ywDNt27d/x5s/zEg2Ubf1MrsV5Q/DncxtXhNJLrJN6zq1jQ== 86 | 87 | cache-base@^1.0.1: 88 | version "1.0.1" 89 | resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 90 | integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== 91 | dependencies: 92 | collection-visit "^1.0.0" 93 | component-emitter "^1.2.1" 94 | get-value "^2.0.6" 95 | has-value "^1.0.0" 96 | isobject "^3.0.1" 97 | set-value "^2.0.0" 98 | to-object-path "^0.3.0" 99 | union-value "^1.0.0" 100 | unset-value "^1.0.0" 101 | 102 | call-me-maybe@^1.0.1: 103 | version "1.0.1" 104 | resolved "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" 105 | integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= 106 | 107 | class-utils@^0.3.5: 108 | version "0.3.6" 109 | resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 110 | integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== 111 | dependencies: 112 | arr-union "^3.1.0" 113 | define-property "^0.2.5" 114 | isobject "^3.0.0" 115 | static-extend "^0.1.1" 116 | 117 | collection-visit@^1.0.0: 118 | version "1.0.0" 119 | resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 120 | integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= 121 | dependencies: 122 | map-visit "^1.0.0" 123 | object-visit "^1.0.0" 124 | 125 | component-emitter@^1.2.1: 126 | version "1.3.0" 127 | resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" 128 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 129 | 130 | copy-descriptor@^0.1.0: 131 | version "0.1.1" 132 | resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 133 | integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= 134 | 135 | debug@^2.2.0, debug@^2.3.3: 136 | version "2.6.9" 137 | resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 138 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 139 | dependencies: 140 | ms "2.0.0" 141 | 142 | decode-uri-component@^0.2.0: 143 | version "0.2.0" 144 | resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 145 | integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 146 | 147 | define-property@^0.2.5: 148 | version "0.2.5" 149 | resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 150 | integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= 151 | dependencies: 152 | is-descriptor "^0.1.0" 153 | 154 | define-property@^1.0.0: 155 | version "1.0.0" 156 | resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 157 | integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= 158 | dependencies: 159 | is-descriptor "^1.0.0" 160 | 161 | define-property@^2.0.2: 162 | version "2.0.2" 163 | resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 164 | integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== 165 | dependencies: 166 | is-descriptor "^1.0.2" 167 | isobject "^3.0.1" 168 | 169 | ejs@^2.6.1: 170 | version "2.6.1" 171 | resolved "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" 172 | integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== 173 | 174 | enquirer@^2.3.0: 175 | version "2.3.0" 176 | resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.0.tgz#c362c9d84984ebe854def63caaf12983a16af552" 177 | integrity sha512-RNGUbRVlfnjmpxV+Ed+7CGu0rg3MK7MmlW+DW0v7V2zdAUBC1s4BxCRiIAozbYB2UJ+q4D+8tW9UFb11kF72/g== 178 | dependencies: 179 | ansi-colors "^3.2.1" 180 | 181 | expand-brackets@^2.1.4: 182 | version "2.1.4" 183 | resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 184 | integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= 185 | dependencies: 186 | debug "^2.3.3" 187 | define-property "^0.2.5" 188 | extend-shallow "^2.0.1" 189 | posix-character-classes "^0.1.0" 190 | regex-not "^1.0.0" 191 | snapdragon "^0.8.1" 192 | to-regex "^3.0.1" 193 | 194 | extend-shallow@^2.0.1: 195 | version "2.0.1" 196 | resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 197 | integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 198 | dependencies: 199 | is-extendable "^0.1.0" 200 | 201 | extend-shallow@^3.0.0, extend-shallow@^3.0.2: 202 | version "3.0.2" 203 | resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 204 | integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= 205 | dependencies: 206 | assign-symbols "^1.0.0" 207 | is-extendable "^1.0.1" 208 | 209 | extglob@^2.0.4: 210 | version "2.0.4" 211 | resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 212 | integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== 213 | dependencies: 214 | array-unique "^0.3.2" 215 | define-property "^1.0.0" 216 | expand-brackets "^2.1.4" 217 | extend-shallow "^2.0.1" 218 | fragment-cache "^0.2.1" 219 | regex-not "^1.0.0" 220 | snapdragon "^0.8.1" 221 | to-regex "^3.0.1" 222 | 223 | fast-glob@^2.2.3: 224 | version "2.2.7" 225 | resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" 226 | integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== 227 | dependencies: 228 | "@mrmlnc/readdir-enhanced" "^2.2.1" 229 | "@nodelib/fs.stat" "^1.1.2" 230 | glob-parent "^3.1.0" 231 | is-glob "^4.0.0" 232 | merge2 "^1.2.3" 233 | micromatch "^3.1.10" 234 | 235 | fill-range@^4.0.0: 236 | version "4.0.0" 237 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 238 | integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= 239 | dependencies: 240 | extend-shallow "^2.0.1" 241 | is-number "^3.0.0" 242 | repeat-string "^1.6.1" 243 | to-regex-range "^2.1.0" 244 | 245 | for-in@^1.0.2: 246 | version "1.0.2" 247 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 248 | integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= 249 | 250 | fragment-cache@^0.2.1: 251 | version "0.2.1" 252 | resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 253 | integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= 254 | dependencies: 255 | map-cache "^0.2.2" 256 | 257 | fs-extra@^7.0.0: 258 | version "7.0.1" 259 | resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" 260 | integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== 261 | dependencies: 262 | graceful-fs "^4.1.2" 263 | jsonfile "^4.0.0" 264 | universalify "^0.1.0" 265 | 266 | fs-extra@^8.0.1: 267 | version "8.0.1" 268 | resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.0.1.tgz#90294081f978b1f182f347a440a209154344285b" 269 | integrity sha512-W+XLrggcDzlle47X/XnS7FXrXu9sDo+Ze9zpndeBxdgv88FHLm1HtmkhEwavruS6koanBjp098rUpHs65EmG7A== 270 | dependencies: 271 | graceful-fs "^4.1.2" 272 | jsonfile "^4.0.0" 273 | universalify "^0.1.0" 274 | 275 | get-value@^2.0.3, get-value@^2.0.6: 276 | version "2.0.6" 277 | resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 278 | integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= 279 | 280 | glob-parent@^3.1.0: 281 | version "3.1.0" 282 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 283 | integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= 284 | dependencies: 285 | is-glob "^3.1.0" 286 | path-dirname "^1.0.0" 287 | 288 | glob-to-regexp@^0.3.0: 289 | version "0.3.0" 290 | resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" 291 | integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= 292 | 293 | graceful-fs@^4.1.2, graceful-fs@^4.1.6: 294 | version "4.1.15" 295 | resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 296 | integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== 297 | 298 | has-value@^0.3.1: 299 | version "0.3.1" 300 | resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 301 | integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= 302 | dependencies: 303 | get-value "^2.0.3" 304 | has-values "^0.1.4" 305 | isobject "^2.0.0" 306 | 307 | has-value@^1.0.0: 308 | version "1.0.0" 309 | resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 310 | integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= 311 | dependencies: 312 | get-value "^2.0.6" 313 | has-values "^1.0.0" 314 | isobject "^3.0.0" 315 | 316 | has-values@^0.1.4: 317 | version "0.1.4" 318 | resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 319 | integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= 320 | 321 | has-values@^1.0.0: 322 | version "1.0.0" 323 | resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 324 | integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= 325 | dependencies: 326 | is-number "^3.0.0" 327 | kind-of "^4.0.0" 328 | 329 | is-accessor-descriptor@^0.1.6: 330 | version "0.1.6" 331 | resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 332 | integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= 333 | dependencies: 334 | kind-of "^3.0.2" 335 | 336 | is-accessor-descriptor@^1.0.0: 337 | version "1.0.0" 338 | resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 339 | integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== 340 | dependencies: 341 | kind-of "^6.0.0" 342 | 343 | is-buffer@^1.1.5: 344 | version "1.1.6" 345 | resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 346 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 347 | 348 | is-data-descriptor@^0.1.4: 349 | version "0.1.4" 350 | resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 351 | integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= 352 | dependencies: 353 | kind-of "^3.0.2" 354 | 355 | is-data-descriptor@^1.0.0: 356 | version "1.0.0" 357 | resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 358 | integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== 359 | dependencies: 360 | kind-of "^6.0.0" 361 | 362 | is-descriptor@^0.1.0: 363 | version "0.1.6" 364 | resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 365 | integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== 366 | dependencies: 367 | is-accessor-descriptor "^0.1.6" 368 | is-data-descriptor "^0.1.4" 369 | kind-of "^5.0.0" 370 | 371 | is-descriptor@^1.0.0, is-descriptor@^1.0.2: 372 | version "1.0.2" 373 | resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 374 | integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== 375 | dependencies: 376 | is-accessor-descriptor "^1.0.0" 377 | is-data-descriptor "^1.0.0" 378 | kind-of "^6.0.2" 379 | 380 | is-extendable@^0.1.0, is-extendable@^0.1.1: 381 | version "0.1.1" 382 | resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 383 | integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= 384 | 385 | is-extendable@^1.0.1: 386 | version "1.0.1" 387 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 388 | integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== 389 | dependencies: 390 | is-plain-object "^2.0.4" 391 | 392 | is-extglob@^2.1.0, is-extglob@^2.1.1: 393 | version "2.1.1" 394 | resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 395 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 396 | 397 | is-glob@^3.1.0: 398 | version "3.1.0" 399 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 400 | integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= 401 | dependencies: 402 | is-extglob "^2.1.0" 403 | 404 | is-glob@^4.0.0: 405 | version "4.0.1" 406 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 407 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 408 | dependencies: 409 | is-extglob "^2.1.1" 410 | 411 | is-number@^3.0.0: 412 | version "3.0.0" 413 | resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 414 | integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= 415 | dependencies: 416 | kind-of "^3.0.2" 417 | 418 | is-plain-object@^2.0.1, is-plain-object@^2.0.3: 419 | version "2.0.4" 420 | resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 421 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 422 | dependencies: 423 | isobject "^3.0.1" 424 | 425 | is-plain-object@^2.0.4: 426 | version "2.0.4" 427 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 428 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 429 | dependencies: 430 | isobject "^3.0.1" 431 | 432 | is-windows@^1.0.2: 433 | version "1.0.2" 434 | resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 435 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 436 | 437 | isarray@1.0.0: 438 | version "1.0.0" 439 | resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 440 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 441 | 442 | isobject@^2.0.0: 443 | version "2.1.0" 444 | resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 445 | integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= 446 | dependencies: 447 | isarray "1.0.0" 448 | 449 | isobject@^3.0.0: 450 | version "3.0.1" 451 | resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 452 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 453 | 454 | isobject@^3.0.1: 455 | version "3.0.1" 456 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 457 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 458 | 459 | jsonfile@^4.0.0: 460 | version "4.0.0" 461 | resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 462 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 463 | optionalDependencies: 464 | graceful-fs "^4.1.6" 465 | 466 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 467 | version "3.2.2" 468 | resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 469 | integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= 470 | dependencies: 471 | is-buffer "^1.1.5" 472 | 473 | kind-of@^4.0.0: 474 | version "4.0.0" 475 | resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 476 | integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= 477 | dependencies: 478 | is-buffer "^1.1.5" 479 | 480 | kind-of@^5.0.0: 481 | version "5.1.0" 482 | resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 483 | integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== 484 | 485 | kind-of@^6.0.0, kind-of@^6.0.2: 486 | version "6.0.2" 487 | resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 488 | integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== 489 | 490 | majo@^0.7.1: 491 | version "0.7.1" 492 | resolved "https://registry.npmjs.org/majo/-/majo-0.7.1.tgz#ade9f6dae47107362c1c22376f19f19d211f618d" 493 | integrity sha512-+hHYX4hXGPe+xXeI2s2DVzWU+57W2BYupwnsZ+KD39J1s2ZBGYjQwZ73JBhilZvLb8fYK+jLdsMbLlNxNyG+2w== 494 | dependencies: 495 | fast-glob "^2.2.3" 496 | fs-extra "^7.0.0" 497 | 498 | map-cache@^0.2.2: 499 | version "0.2.2" 500 | resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 501 | integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= 502 | 503 | map-visit@^1.0.0: 504 | version "1.0.0" 505 | resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 506 | integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= 507 | dependencies: 508 | object-visit "^1.0.0" 509 | 510 | merge2@^1.2.3: 511 | version "1.2.3" 512 | resolved "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" 513 | integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== 514 | 515 | micromatch@^3.1.10: 516 | version "3.1.10" 517 | resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 518 | integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== 519 | dependencies: 520 | arr-diff "^4.0.0" 521 | array-unique "^0.3.2" 522 | braces "^2.3.1" 523 | define-property "^2.0.2" 524 | extend-shallow "^3.0.2" 525 | extglob "^2.0.4" 526 | fragment-cache "^0.2.1" 527 | kind-of "^6.0.2" 528 | nanomatch "^1.2.9" 529 | object.pick "^1.3.0" 530 | regex-not "^1.0.0" 531 | snapdragon "^0.8.1" 532 | to-regex "^3.0.2" 533 | 534 | mixin-deep@1.3.2, mixin-deep@^1.2.0: 535 | version "1.3.2" 536 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" 537 | integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== 538 | dependencies: 539 | for-in "^1.0.2" 540 | is-extendable "^1.0.1" 541 | 542 | ms@2.0.0: 543 | version "2.0.0" 544 | resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 545 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 546 | 547 | nanomatch@^1.2.9: 548 | version "1.2.13" 549 | resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" 550 | integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== 551 | dependencies: 552 | arr-diff "^4.0.0" 553 | array-unique "^0.3.2" 554 | define-property "^2.0.2" 555 | extend-shallow "^3.0.2" 556 | fragment-cache "^0.2.1" 557 | is-windows "^1.0.2" 558 | kind-of "^6.0.2" 559 | object.pick "^1.3.0" 560 | regex-not "^1.0.0" 561 | snapdragon "^0.8.1" 562 | to-regex "^3.0.1" 563 | 564 | object-copy@^0.1.0: 565 | version "0.1.0" 566 | resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 567 | integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= 568 | dependencies: 569 | copy-descriptor "^0.1.0" 570 | define-property "^0.2.5" 571 | kind-of "^3.0.3" 572 | 573 | object-visit@^1.0.0: 574 | version "1.0.1" 575 | resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 576 | integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= 577 | dependencies: 578 | isobject "^3.0.0" 579 | 580 | object.pick@^1.3.0: 581 | version "1.3.0" 582 | resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 583 | integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= 584 | dependencies: 585 | isobject "^3.0.1" 586 | 587 | pascalcase@^0.1.1: 588 | version "0.1.1" 589 | resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 590 | integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= 591 | 592 | path-dirname@^1.0.0: 593 | version "1.0.2" 594 | resolved "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 595 | integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= 596 | 597 | posix-character-classes@^0.1.0: 598 | version "0.1.1" 599 | resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 600 | integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= 601 | 602 | regex-not@^1.0.0, regex-not@^1.0.2: 603 | version "1.0.2" 604 | resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 605 | integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== 606 | dependencies: 607 | extend-shallow "^3.0.2" 608 | safe-regex "^1.1.0" 609 | 610 | repeat-element@^1.1.2: 611 | version "1.1.3" 612 | resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 613 | integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== 614 | 615 | repeat-string@^1.6.1: 616 | version "1.6.1" 617 | resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 618 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 619 | 620 | resolve-url@^0.2.1: 621 | version "0.2.1" 622 | resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 623 | integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 624 | 625 | ret@~0.1.10: 626 | version "0.1.15" 627 | resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 628 | integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 629 | 630 | safe-regex@^1.1.0: 631 | version "1.1.0" 632 | resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 633 | integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= 634 | dependencies: 635 | ret "~0.1.10" 636 | 637 | set-value@^0.4.3: 638 | version "0.4.3" 639 | resolved "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" 640 | integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= 641 | dependencies: 642 | extend-shallow "^2.0.1" 643 | is-extendable "^0.1.1" 644 | is-plain-object "^2.0.1" 645 | to-object-path "^0.3.0" 646 | 647 | set-value@^2.0.0: 648 | version "2.0.0" 649 | resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" 650 | integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== 651 | dependencies: 652 | extend-shallow "^2.0.1" 653 | is-extendable "^0.1.1" 654 | is-plain-object "^2.0.3" 655 | split-string "^3.0.1" 656 | 657 | snapdragon-node@^2.0.1: 658 | version "2.1.1" 659 | resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 660 | integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== 661 | dependencies: 662 | define-property "^1.0.0" 663 | isobject "^3.0.0" 664 | snapdragon-util "^3.0.1" 665 | 666 | snapdragon-util@^3.0.1: 667 | version "3.0.1" 668 | resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 669 | integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== 670 | dependencies: 671 | kind-of "^3.2.0" 672 | 673 | snapdragon@^0.8.1: 674 | version "0.8.2" 675 | resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 676 | integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== 677 | dependencies: 678 | base "^0.11.1" 679 | debug "^2.2.0" 680 | define-property "^0.2.5" 681 | extend-shallow "^2.0.1" 682 | map-cache "^0.2.2" 683 | source-map "^0.5.6" 684 | source-map-resolve "^0.5.0" 685 | use "^3.1.0" 686 | 687 | source-map-resolve@^0.5.0: 688 | version "0.5.2" 689 | resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" 690 | integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== 691 | dependencies: 692 | atob "^2.1.1" 693 | decode-uri-component "^0.2.0" 694 | resolve-url "^0.2.1" 695 | source-map-url "^0.4.0" 696 | urix "^0.1.0" 697 | 698 | source-map-url@^0.4.0: 699 | version "0.4.0" 700 | resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 701 | integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= 702 | 703 | source-map@^0.5.6: 704 | version "0.5.7" 705 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 706 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 707 | 708 | split-string@^3.0.1, split-string@^3.0.2: 709 | version "3.1.0" 710 | resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 711 | integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== 712 | dependencies: 713 | extend-shallow "^3.0.0" 714 | 715 | static-extend@^0.1.1: 716 | version "0.1.2" 717 | resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 718 | integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= 719 | dependencies: 720 | define-property "^0.2.5" 721 | object-copy "^0.1.0" 722 | 723 | to-object-path@^0.3.0: 724 | version "0.3.0" 725 | resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 726 | integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= 727 | dependencies: 728 | kind-of "^3.0.2" 729 | 730 | to-regex-range@^2.1.0: 731 | version "2.1.1" 732 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 733 | integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= 734 | dependencies: 735 | is-number "^3.0.0" 736 | repeat-string "^1.6.1" 737 | 738 | to-regex@^3.0.1, to-regex@^3.0.2: 739 | version "3.0.2" 740 | resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 741 | integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== 742 | dependencies: 743 | define-property "^2.0.2" 744 | extend-shallow "^3.0.2" 745 | regex-not "^1.0.2" 746 | safe-regex "^1.1.0" 747 | 748 | union-value@^1.0.0: 749 | version "1.0.0" 750 | resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" 751 | integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= 752 | dependencies: 753 | arr-union "^3.1.0" 754 | get-value "^2.0.6" 755 | is-extendable "^0.1.1" 756 | set-value "^0.4.3" 757 | 758 | universalify@^0.1.0: 759 | version "0.1.2" 760 | resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 761 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 762 | 763 | unset-value@^1.0.0: 764 | version "1.0.0" 765 | resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 766 | integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= 767 | dependencies: 768 | has-value "^0.3.1" 769 | isobject "^3.0.0" 770 | 771 | urix@^0.1.0: 772 | version "0.1.0" 773 | resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 774 | integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 775 | 776 | use@^3.1.0: 777 | version "3.1.1" 778 | resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 779 | integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 780 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/.gitignore: -------------------------------------------------------------------------------- 1 | dist -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. 5 | 6 | # [0.3.0](https://github.com/saberland/create-portfolio/compare/v0.2.2...v0.3.0) (2020-03-24) 7 | 8 | ### Features 9 | 10 | - **Post:** Implement asset cover feature ([#124](https://github.com/saberland/create-portfolio/issues/124)) ([0c46134](https://github.com/saberland/create-portfolio/commit/0c46134)) 11 | 12 | ## [0.2.2](https://github.com/saberland/create-portfolio/compare/v0.2.1...v0.2.2) (2019-09-16) 13 | 14 | ### Bug Fixes 15 | 16 | - **deps:** bump sabar and sabar-plugin-query-posts ([#66](https://github.com/saberland/create-portfolio/issues/66)) ([0a10a9d](https://github.com/saberland/create-portfolio/commit/0a10a9d)) 17 | 18 | ## [0.2.1](https://github.com/saberland/create-portfolio/compare/v0.2.0...v0.2.1) (2019-07-25) 19 | 20 | **Note:** Version bump only for package saber-theme-portfolio 21 | 22 | # [0.2.0](https://github.com/saberland/create-portfolio/compare/v0.1.11...v0.2.0) (2019-06-27) 23 | 24 | ### Bug Fixes 25 | 26 | - **theme:** Added twitter:card to all pages ([#34](https://github.com/saberland/create-portfolio/issues/34)) ([c785617](https://github.com/saberland/create-portfolio/commit/c785617)) 27 | - add missing css for page content ([#41](https://github.com/saberland/create-portfolio/issues/41)) ([6523081](https://github.com/saberland/create-portfolio/commit/6523081)) 28 | 29 | ### Features 30 | 31 | - add saber-plugin-feed to create-portfolio ([#39](https://github.com/saberland/create-portfolio/issues/39)) ([ae068da](https://github.com/saberland/create-portfolio/commit/ae068da)) 32 | 33 | ## [0.1.11](https://github.com/saberland/create-portfolio/compare/v0.1.10...v0.1.11) (2019-06-25) 34 | 35 | ### Bug Fixes 36 | 37 | - fallback to empty array for users with no repos ([#26](https://github.com/saberland/create-portfolio/issues/26)) ([a33fc51](https://github.com/saberland/create-portfolio/commit/a33fc51)) 38 | 39 | ### Features 40 | 41 | - updated meta tags ([#30](https://github.com/saberland/create-portfolio/issues/30)) ([f0a1cb7](https://github.com/saberland/create-portfolio/commit/f0a1cb7)) 42 | 43 | ## [0.1.10](https://github.com/saberland/create-portfolio/compare/v0.1.9...v0.1.10) (2019-06-06) 44 | 45 | ### Bug Fixes 46 | 47 | - **theme:** ensure post width ([91c3fe2](https://github.com/saberland/create-portfolio/commit/91c3fe2)) 48 | 49 | ## [0.1.9](https://github.com/saberland/create-portfolio/compare/v0.1.8...v0.1.9) (2019-06-01) 50 | 51 | ### Bug Fixes 52 | 53 | - prevent from styling highlighted code, closes [#13](https://github.com/saberland/create-portfolio/issues/13) ([edea9bd](https://github.com/saberland/create-portfolio/commit/edea9bd)) 54 | 55 | ## [0.1.8](https://github.com/saberland/create-portfolio/compare/v0.1.7...v0.1.8) (2019-05-31) 56 | 57 | ### Bug Fixes 58 | 59 | - **deps:** [security] bump axios from 0.18.0 to 0.19.0 ([#12](https://github.com/saberland/create-portfolio/issues/12)) ([cea701f](https://github.com/saberland/create-portfolio/commit/cea701f)) 60 | - **deps:** bump saber-highlight-css from 0.0.4 to 0.0.5 ([#10](https://github.com/saberland/create-portfolio/issues/10)) ([95dba7f](https://github.com/saberland/create-portfolio/commit/95dba7f)) 61 | 62 | ### Features 63 | 64 | - Add disqus support ([#11](https://github.com/saberland/create-portfolio/issues/11)) ([b9a8fa9](https://github.com/saberland/create-portfolio/commit/b9a8fa9)) 65 | 66 | ## [0.1.7](https://github.com/saberland/create-portfolio/compare/v0.1.6...v0.1.7) (2019-05-29) 67 | 68 | ### Features 69 | 70 | - support using GitHub pinned repositories ([#8](https://github.com/saberland/create-portfolio/issues/8)) ([7a4e90a](https://github.com/saberland/create-portfolio/commit/7a4e90a)) 71 | 72 | ## [0.1.6](https://github.com/saberland/create-portfolio/compare/v0.1.5...v0.1.6) (2019-05-28) 73 | 74 | ### Bug Fixes 75 | 76 | - **theme:** code padding ([9d98e05](https://github.com/saberland/create-portfolio/commit/9d98e05)) 77 | 78 | ## [0.1.5](https://github.com/saberland/create-portfolio/compare/v0.1.4...v0.1.5) (2019-05-28) 79 | 80 | ### Features 81 | 82 | - support code highlighting ([9485783](https://github.com/saberland/create-portfolio/commit/9485783)) 83 | 84 | ## [0.1.3](https://github.com/saberland/create-portfolio/compare/v0.1.2...v0.1.3) (2019-05-28) 85 | 86 | ### Bug Fixes 87 | 88 | - **pkg:** add missing README ([2cfa0e4](https://github.com/saberland/create-portfolio/commit/2cfa0e4)) 89 | - add noopener noreferrer ([a06fe39](https://github.com/saberland/create-portfolio/commit/a06fe39)) 90 | - open skills in new tab ([#5](https://github.com/saberland/create-portfolio/issues/5)) ([195583a](https://github.com/saberland/create-portfolio/commit/195583a)) 91 | 92 | ## [0.1.1](https://github.com/saberland/create-portfolio/compare/v0.1.0...v0.1.1) (2019-05-28) 93 | 94 | ### Bug Fixes 95 | 96 | - ensure project language ([fd3ae7d](https://github.com/saberland/create-portfolio/commit/fd3ae7d)) 97 | - package metadata ([69c7bd2](https://github.com/saberland/create-portfolio/commit/69c7bd2)) 98 | 99 | ### Features 100 | 101 | - showcase skills, fix [#2](https://github.com/saberland/create-portfolio/issues/2) ([54303d9](https://github.com/saberland/create-portfolio/commit/54303d9)) 102 | 103 | # 0.1.0 (2019-05-28) 104 | 105 | ### Features 106 | 107 | - init ([83a2f72](https://github.com/egoist/create-portfolio/commit/83a2f72)) 108 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/README.md: -------------------------------------------------------------------------------- 1 | # Create Portfolio 2 | 3 | See the [GitHub repo](https://github.com/saberland/create-portfolio) for more information 4 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "saber-theme-portfolio", 3 | "version": "0.3.0", 4 | "files": [ 5 | "dist" 6 | ], 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/saberland/create-portfolio.git", 10 | "directory": "packages/saber-theme-portfolio" 11 | }, 12 | "scripts": { 13 | "build": "vue-compile src -o dist", 14 | "prepublishOnly": "yarn build" 15 | }, 16 | "license": "MIT", 17 | "dependencies": { 18 | "axios": "^0.19.0", 19 | "grid.css": "^0.6.1", 20 | "jump.js": "^1.0.2", 21 | "normalize.css": "^8.0.1", 22 | "prismjs": "^1.16.0", 23 | "saber-highlight-css": "^0.1.1", 24 | "saber-plugin-prismjs": "^0.2.0", 25 | "typeface-source-sans-pro": "^0.0.75", 26 | "vue-feather-icons": "^5.0.0" 27 | }, 28 | "devDependencies": { 29 | "postcss-import": "^12.0.1", 30 | "postcss-preset-env": "^6.6.0", 31 | "vue-compile": "^0.6.0" 32 | }, 33 | "peerDependencies": { 34 | "saber": ">=0.6.10" 35 | }, 36 | "xo": false 37 | } 38 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require('postcss-import')(), 4 | require('postcss-preset-env')({ 5 | stage: 0, 6 | features: { 7 | 'custom-properties': false 8 | } 9 | }) 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/components/Disqus.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 37 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/components/HomePosts.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 40 | 41 | 57 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/components/HomeProfile.vue: -------------------------------------------------------------------------------- 1 | 60 | 61 | 80 | 81 | 220 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/components/HomeProjects.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 36 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/components/HomeSection.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 21 | 22 | 38 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/components/HomeSkills.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/components/PostCard.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 53 | 54 | 86 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/components/PostMeta.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 33 | 34 | 49 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/components/ProjectCard.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 40 | 41 | 73 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/components/SkillCard.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 37 | 38 | 50 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/css/global.css: -------------------------------------------------------------------------------- 1 | @import "./variables.css"; 2 | @import "./highlight.css"; 3 | 4 | body { 5 | font: 16px/1.6 "Source Sans Pro", serif; 6 | background: var(--bg); 7 | color: var(--text-color); 8 | } 9 | 10 | *, *:before, *:after { 11 | box-sizing: border-box; 12 | } 13 | 14 | a { 15 | text-decoration: none; 16 | color: var(--link-color); 17 | } 18 | 19 | .container { 20 | margin: 0 auto; 21 | } 22 | 23 | .sticky { 24 | position: sticky; 25 | height: fit-content; 26 | } 27 | 28 | .wrap { 29 | padding: 60px; 30 | 31 | @media (max-width:768px) { 32 | padding: 20px; 33 | } 34 | } 35 | 36 | .wrap > .container { 37 | display: flex; 38 | 39 | @media (max-width:768px) { 40 | flex-direction: column; 41 | } 42 | } 43 | 44 | .main { 45 | width: calc(100% - var(--profile-width)); 46 | padding-left: 30px; 47 | 48 | @media (max-width:768px) { 49 | padding-left: 0; 50 | width: 100%; 51 | } 52 | } 53 | 54 | .post-cover { 55 | overflow: hidden; 56 | width: 100%; 57 | margin-bottom: 30px; 58 | border-radius: 3px; 59 | align-content: center; 60 | display: flex; 61 | } 62 | 63 | .post-card .post-cover { 64 | height: 250px; 65 | border-radius: 3px 3px 0 0; 66 | margin-bottom: 0; 67 | } 68 | 69 | .post-cover .post-cover__image { 70 | width: 100%; 71 | object-fit: cover; 72 | } 73 | 74 | .page-title { 75 | font-size: 3rem; 76 | font-weight: 400; 77 | margin: 0 0 20px 0; 78 | line-height: 1.4; 79 | 80 | & svg { 81 | width: 1.6rem; 82 | height: 1.6rem; 83 | } 84 | } 85 | 86 | .page-content { 87 | font-size: 1.125rem; 88 | 89 | & p { 90 | margin: 0 0 16px 0; 91 | } 92 | 93 | &>*:first-child { 94 | margin-top: 0; 95 | } 96 | 97 | & h2, 98 | & h3, 99 | & h4, 100 | & h5, 101 | & h6 { 102 | font-weight: 400; 103 | } 104 | 105 | & h2 { 106 | font-size: 2.4rem; 107 | } 108 | 109 | & h3 { 110 | font-size: 2.1rem; 111 | } 112 | 113 | & h4 { 114 | font-size: 1.8rem; 115 | } 116 | 117 | & h5 { 118 | font-size: 1.5rem; 119 | } 120 | 121 | & h6 { 122 | font-size: 1.2rem; 123 | } 124 | 125 | & a:hover { 126 | text-decoration: underline; 127 | } 128 | 129 | & blockquote { 130 | background: var(--blockquote-bg); 131 | border-left: 8px solid var(--blockquote-border-color); 132 | margin: 20px 0; 133 | padding: 14px 16px; 134 | color: var(--blockquote-color); 135 | 136 | &>*:first-child { 137 | margin-top: 0; 138 | } 139 | 140 | &>*:last-child { 141 | margin-bottom: 0; 142 | } 143 | } 144 | 145 | & img { 146 | max-width: 100%; 147 | } 148 | 149 | & ul, & ol { 150 | padding-left: 20px; 151 | 152 | &.task-list { 153 | list-style: none; 154 | padding-left: 0; 155 | 156 | & input { 157 | margin-right: 5px; 158 | } 159 | } 160 | } 161 | } 162 | 163 | .card { 164 | display: block; 165 | padding: 20px; 166 | border-radius: 3px; 167 | color: var(--text-color); 168 | background-color: var(--card-bg); 169 | 170 | &:hover { 171 | box-shadow: inset 0 0 0 1px var(--border-color); 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/css/highlight.css: -------------------------------------------------------------------------------- 1 | .saber-highlight { 2 | background-color: var(--card-bg); 3 | } 4 | 5 | .saber-highlight:before { 6 | color: var(--code-language-color); 7 | } 8 | 9 | :not(pre) > code { 10 | background-color: var(--card-bg); 11 | border-radius: 3px; 12 | padding: 3px; 13 | font-size: .875rem; 14 | } -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/css/variables.css: -------------------------------------------------------------------------------- 1 | .is-dark-style { 2 | --bg: #000; 3 | --card-bg: rgb(20, 20, 20); 4 | --text-color: #fff; 5 | --text-color-lighter: #ccc; 6 | --link-color: #0096cf; 7 | --profile-width: 400px; 8 | --border-color: #4e4e4e; 9 | --hover-border-color: rgb(156, 156, 156); 10 | --nav-link-color: rgb(102, 102, 102); 11 | --nav-link-active-color: #fff; 12 | --nav-link-hover-color: #ccc; 13 | --button-border-color: #4e4e4e; 14 | --button-hover-border-color: rgb(156, 156, 156); 15 | --code-language-color: rgb(94, 92, 92); 16 | --profile-link-color: #fff; 17 | --profile-link-hover-color: #ccc; 18 | --blockquote-bg: var(--card-bg); 19 | --blockquote-border-color: var(--border-color); 20 | --blockquote-color: #c1c2c5; 21 | } 22 | 23 | .is-light-style { 24 | --bg: #fff; 25 | --card-bg: #f9f9f9; 26 | --text-color: #333; 27 | --text-color-lighter: rgb(187, 187, 187); 28 | --link-color: #0096cf; 29 | --profile-width: 400px; 30 | --border-color: #e2e2e2; 31 | --hover-border-color: #ccc; 32 | --nav-link-color: rgb(177, 174, 174); 33 | --nav-link-active-color: #000; 34 | --nav-link-hover-color: rgb(85, 85, 85); 35 | --button-border-color: #e2e2e2; 36 | --button-hover-border-color: #ccc; 37 | --code-language-color: #ccc; 38 | --blockquote-bg: #f1f1f1; 39 | --blockquote-border-color: #ccc; 40 | --blockquote-color: #6a737d; 41 | } -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/layouts/home.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 54 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/layouts/page.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 53 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/layouts/post.vue: -------------------------------------------------------------------------------- 1 | 54 | 55 | 100 | 101 | 173 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/layouts/posts.vue: -------------------------------------------------------------------------------- 1 | 49 | 50 | 93 | 94 | 119 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/layouts/tag.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/saber-browser.js: -------------------------------------------------------------------------------- 1 | /* globals __PORTFOLIO_STYLE__ */ 2 | import 'normalize.css/normalize.css' 3 | import 'typeface-source-sans-pro/index.css' 4 | import 'grid.css/grid.css' 5 | import HomeSection from './components/HomeSection.vue' 6 | 7 | if (__PORTFOLIO_STYLE__ === 'dark') { 8 | require('prismjs/themes/prism-tomorrow.css') 9 | } else if (__PORTFOLIO_STYLE__ === 'light') { 10 | require('prismjs/themes/prism.css') 11 | } 12 | 13 | require('saber-highlight-css/default.css') 14 | require('./css/global.css') 15 | 16 | export default ({ Vue, setHead }) => { 17 | Vue.component(HomeSection.name, HomeSection) 18 | 19 | setHead(vm => { 20 | const { style } = vm.$themeConfig 21 | return { 22 | bodyAttrs: { 23 | class: `is-${style}-style` 24 | }, 25 | meta: [ 26 | { 27 | name: 'description', 28 | content: vm.$siteConfig.description 29 | }, 30 | { 31 | name: 'twitter:card', 32 | content: 'summary' 33 | }, 34 | vm.$themeConfig.twitter && { 35 | name: 'twitter:creator', 36 | content: `@${vm.$themeConfig.twitter}` 37 | } 38 | ], 39 | link: [ 40 | vm.$feed && { 41 | rel: 'alternate', 42 | type: 43 | vm.$feed.type === 'atom' 44 | ? 'application/atom+xml' 45 | : vm.$feed.type === 'json' 46 | ? 'application/json' 47 | : 'application/rss+xml', 48 | href: vm.$feed.permalink 49 | } 50 | ].filter(Boolean) 51 | } 52 | }) 53 | } 54 | -------------------------------------------------------------------------------- /packages/saber-theme-portfolio/src/saber-node.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | 3 | exports.beforePlugins = async function() { 4 | const { github, projects } = this.config.themeConfig 5 | const usePinnedRepos = projects === 'pinned-repos' 6 | 7 | this.log.info(`Fetching GitHub data for ${github}..`) 8 | const [userResult, projectsResult] = await Promise.all([ 9 | axios({ 10 | method: 'GET', 11 | url: `https://api.github.com/users/${github}` 12 | }), 13 | axios({ 14 | method: 'GET', 15 | url: usePinnedRepos 16 | ? `https://gh-pinned-repos.now.sh/?username=${github}` 17 | : `https://api.github.com/search/repositories?q=user:${github}&sort:stars&per_page=6` 18 | }).catch(error => { 19 | if (usePinnedRepos) { 20 | throw error 21 | } 22 | 23 | // No repos 24 | if ( 25 | error.response && 26 | error.response.status === 422 && 27 | error.response.data && 28 | error.response.data.message === 'Validation Failed' 29 | ) { 30 | return { data: { items: [] } } 31 | } 32 | 33 | throw error 34 | }) 35 | ]) 36 | 37 | const updateConfig = () => { 38 | this.config.siteConfig = Object.assign( 39 | { 40 | title: userResult.data.name || userResult.data.login, 41 | description: userResult.data.bio, 42 | email: userResult.data.email, 43 | author: userResult.data.name || userResult.data.login 44 | }, 45 | this.config.siteConfig 46 | ) 47 | this.config.themeConfig = Object.assign( 48 | { 49 | coverLayout: 'minimal', 50 | hireable: userResult.data.hireable, 51 | profilePicture: userResult.data.avatar_url 52 | }, 53 | this.config.themeConfig, 54 | { 55 | projects: usePinnedRepos 56 | ? projectsResult.data.map(item => { 57 | return { 58 | name: item.repo, 59 | url: `https://github.com/${item.owner}/${item.repo}`, 60 | description: item.description, 61 | language: item.language, 62 | stars: item.stars 63 | } 64 | }) 65 | : projectsResult.data.items.map(item => { 66 | return { 67 | name: item.name, 68 | url: item.html_url, 69 | description: item.description, 70 | language: item.language, 71 | stars: item.stargazers_count 72 | } 73 | }) 74 | } 75 | ) 76 | } 77 | 78 | updateConfig() 79 | this.hooks.onUpdateConfigFile.tap('theme-node-api', () => { 80 | updateConfig() 81 | }) 82 | 83 | this.applyPlugin(require('saber-plugin-prismjs')) 84 | } 85 | 86 | exports.chainWebpack = function(config) { 87 | config.plugin('constants').tap(([constants]) => [ 88 | Object.assign(constants, { 89 | __PORTFOLIO_STYLE__: JSON.stringify(this.config.themeConfig.style) 90 | }) 91 | ]) 92 | } 93 | --------------------------------------------------------------------------------