mirror of
https://github.com/modernweb-dev/rocket.git
synced 2026-03-21 08:51:18 +00:00
Compare commits
24 Commits
@rocket/cl
...
@rocket/cl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98d6aad12a | ||
|
|
ee6b404aaa | ||
|
|
8ba8939c67 | ||
|
|
8e095b792e | ||
|
|
b58ac27658 | ||
|
|
f44a0f4fd4 | ||
|
|
750418bb51 | ||
|
|
bc2698c1ba | ||
|
|
74f7ddf478 | ||
|
|
b5fa7ad9af | ||
|
|
e3abdd956a | ||
|
|
8bdc326e38 | ||
|
|
806fcc0556 | ||
|
|
e7d7945259 | ||
|
|
502347aa8d | ||
|
|
26b558c118 | ||
|
|
8eec69f918 | ||
|
|
078cff26fe | ||
|
|
8896c0655b | ||
|
|
43ef209bad | ||
|
|
f2a4b80f1e | ||
|
|
f343c5030a | ||
|
|
a7b0dbbce0 | ||
|
|
eeb51c830c |
@@ -4,27 +4,27 @@
|
|||||||
|
|
||||||
> Please note that this project is released with a [Contributor Code of Conduct](./CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
|
> Please note that this project is released with a [Contributor Code of Conduct](./CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
|
||||||
|
|
||||||
First, create a fork of the [modernweb-dev/rocket](https://github.com/modernweb-dev/rocket) repo by hitting the `fork` button on the GitHub page.
|
First, create a fork of the [modernweb-dev/rocket](https://github.com/modernweb-dev/rocket) repository by hitting the `fork` button on the GitHub page.
|
||||||
|
|
||||||
Next, clone our repository onto your computer with this command (replacing YOUR_USERNAME with your actual GitHub username)
|
Next, clone our repository onto your computer.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git clone git@github.com:modernweb-dev/rocket.git
|
git clone git@github.com:modernweb-dev/rocket.git
|
||||||
```
|
```
|
||||||
|
|
||||||
Once cloning is complete, change directory to the repo.
|
Once cloning is complete, change directory to the repository.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd rocket
|
cd rocket
|
||||||
```
|
```
|
||||||
|
|
||||||
Now add your fork as a remote
|
Now add your fork as a remote (replacing YOUR_USERNAME with your GitHub username).
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git remote add fork git@github.com:<YOUR_NAME>/rocket.git
|
git remote add fork git@github.com:<YOUR_USERNAME>/rocket.git
|
||||||
```
|
```
|
||||||
|
|
||||||
Create a new local branch
|
Create a new local branch.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git checkout -b my-awesome-fix
|
git checkout -b my-awesome-fix
|
||||||
@@ -32,7 +32,7 @@ git checkout -b my-awesome-fix
|
|||||||
|
|
||||||
## Preparing Your Local Environment for Development
|
## Preparing Your Local Environment for Development
|
||||||
|
|
||||||
Now that you have cloned the repository, ensure you have [yarn](https://classic.yarnpkg.com/lang/en/) installed run the following commands to set up the development environment.
|
Now that you have cloned the repository, ensure you have [yarn](https://classic.yarnpkg.com/lang/en/) installed, then run the following commands to set up the development environment.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
yarn install
|
yarn install
|
||||||
@@ -42,25 +42,25 @@ This will download and install all packages needed.
|
|||||||
|
|
||||||
## Making Your Changes
|
## Making Your Changes
|
||||||
|
|
||||||
Make your changes to the project. Commits are linted using precommit hooks, meaning that any code that raises linting error cannot be committed. In order to help avoid that, we recommend using an IDE or editor with an eslint plugin in order to streamline the development process. Plugins are available for all the popular editors. For more information see [ESLint Integrations](https://eslint.org/docs/user-guide/integrations)
|
Make your changes to the project. Commits are linted using precommit hooks, meaning that any code that raises a linting error cannot be committed. In order to help avoid that, we recommend using an IDE or editor with an ESLint plugin in order to streamline the development process. Plugins are available for all the popular editors. For more information see [ESLint Integrations](https://eslint.org/docs/user-guide/integrations)
|
||||||
|
|
||||||
### Compiling the typescript code
|
### Compiling the TypeScript Code
|
||||||
|
|
||||||
If you're making cross-package changes, you need to compile the typescript code. We recommend executing `tsc:watch` from the root of the package and keeping that running while you make your changes.
|
If you're making cross-package changes, you need to compile the TypeScript code. We recommend executing `tsc:watch` from the root of the package and keeping that running while you make your changes.
|
||||||
|
|
||||||
### Running tests
|
### Running Tests
|
||||||
|
|
||||||
To run the tests of a package, it's recommended to `cd` into the package directory and then using `yarn test` to run them. This way you're only running tests of that specific package.
|
To run the tests of a package, it's recommended to `cd` into the package directory and then using `yarn test` to run them. This way you're only running tests of that specific package.
|
||||||
|
|
||||||
### Integration testing
|
### Integration Testing
|
||||||
|
|
||||||
To see how your changes integrate with everything together you can use the `test-runner` package. There are different commands in this package which you can execute to trigger different scenarios in the test runner.
|
To see how your changes integrate with everything together you can use the `test-runner` package. There are different commands in this package which you can execute to trigger different scenarios in the test runner.
|
||||||
|
|
||||||
## Adding new packages
|
## Adding New Packages
|
||||||
|
|
||||||
For all projects the tsconfig/jsconfig configuration files are auto generated. You need to add an entry to the [./workspace-packages.ts](./workspace-packages.ts) to let it generate a config for you. After adding an entry, run `yarn update-package-configs` to generate the files for you.
|
For all projects the tsconfig/jsconfig configuration files are auto generated. You need to add an entry to the [./workspace-packages.ts](./workspace-packages.ts) to let it generate a config for you. After adding an entry, run `yarn update-package-configs` to generate the files for you.
|
||||||
|
|
||||||
## Create a Changeset
|
## Creating a Changeset
|
||||||
|
|
||||||
If you made changes for which you want to trigger a release, you need to create a changeset.
|
If you made changes for which you want to trigger a release, you need to create a changeset.
|
||||||
This documents your intent to release, and allows you to specify a message that will be put into the changelog(s) of the package(s).
|
This documents your intent to release, and allows you to specify a message that will be put into the changelog(s) of the package(s).
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
> This project is in it's BETA phase
|
> This project is in its BETA phase
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img
|
<img
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
**The modern web setup for static sites with a sprinkle of JavaScript!**
|
**The modern web setup for static sites with a sprinkle of JavaScript!**
|
||||||
|
|
||||||
- **Meta Framework:** Build on top of giants like <a href="https://www.11ty.dev/">eleventy</a>, <a href="https://rollupjs.org/">Rollup</a>, and <a href="https://www.modern-web.dev/">Modern Web</a>.
|
- **Meta Framework:** Build on top of giants like <a href="https://www.11ty.dev/">Eleventy</a>, <a href="https://rollupjs.org/">Rollup</a>, and <a href="https://www.modern-web.dev/">Modern Web</a>.
|
||||||
- **Powerful Default Template:** Provide content and you are ready to go.
|
- **Powerful Default Template:** Provide content and you are ready to go.
|
||||||
- **Small:** No overblown tools or frontend frameworks, add JavaScript and/or Web Components only on pages where needed..
|
- **Small:** No overblown tools or frontend frameworks, add JavaScript and/or Web Components only on pages where needed..
|
||||||
|
|
||||||
@@ -41,12 +41,12 @@
|
|||||||
<a href="https://rocket.modern-web.dev/guides/"><strong>Explore the Rocket Guides ▶</strong></a>
|
<a href="https://rocket.modern-web.dev/guides/"><strong>Explore the Rocket Guides ▶</strong></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
## The goal for Rocket
|
## The Goal for Rocket
|
||||||
|
|
||||||
> Our goal is to provide developers with a meta framework for static websites with a spricle of JavaScript.
|
> Our goal is to provide developers with a meta framework for static websites with a spricle of JavaScript.
|
||||||
|
|
||||||
Get a site up and running in no time and focus on the content.
|
Get a site up and running in no time and focus on the content.
|
||||||
You can still tweak every details of every underlying tool that get's used.
|
You can still tweak every detail of every underlying tool that gets used.
|
||||||
|
|
||||||
Rocket is part of the [Modern Web Family](https://twitter.com/modern_web_dev).
|
Rocket is part of the [Modern Web Family](https://twitter.com/modern_web_dev).
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
layout: 404.njk
|
layout: layout-404
|
||||||
permalink: 404.html
|
permalink: 404.html
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
body[layout='home'] .markdown-body .call-to-action:nth-of-type(2) {
|
body[layout^='layout-home'] .markdown-body .call-to-action:nth-of-type(2) {
|
||||||
--primary-color: #222;
|
--primary-color: #222;
|
||||||
--primary-color-lighter: #333;
|
--primary-color-lighter: #333;
|
||||||
--primary-color-darker: #000;
|
--primary-color-darker: #000;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 1024px) {
|
@media screen and (min-width: 1024px) {
|
||||||
body[layout='home'][home-layout='background'] .page-background {
|
body[layout='layout-home-background'] .page-background {
|
||||||
top: -210px;
|
top: -210px;
|
||||||
right: -463px;
|
right: -463px;
|
||||||
transform: rotate(45deg);
|
transform: rotate(45deg);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
"name": "Follow",
|
"name": "Follow",
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"text": "Github",
|
"text": "GitHub",
|
||||||
"href": "https://github.com/modernweb-dev/rocket"
|
"href": "https://github.com/modernweb-dev/rocket"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ module.exports = async function () {
|
|||||||
dir: 'ltr',
|
dir: 'ltr',
|
||||||
lang: 'en',
|
lang: 'en',
|
||||||
name: 'Rocket',
|
name: 'Rocket',
|
||||||
description: 'Rocket is the way to build fast static websites with a sprinkle of javascript',
|
description: 'Rocket is the way to build fast static websites with a sprinkle of JavaScript',
|
||||||
socialLinks: [
|
socialLinks: [
|
||||||
{
|
{
|
||||||
name: 'GitHub',
|
name: 'GitHub',
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Slack
|
# Slack
|
||||||
|
|
||||||
You can also find us on the Polymer slack in the [#open-wc](https://slack.com/share/IUQNUPWUF/awabyN8iYH4dXX6aGpu16ES9/enQtOTc2Nzc2ODEyOTY3LWM5ZGExNGFiMmM4NDY2YWI2MzYwOGY5ZTNlZjk4OGU4NTFhMGJjNmVhNGI4MzVlNTMwNGRiNGIxNjc4MGJhNDg) channel.
|
You can also find us on the Polymer Slack in the [#open-wc](https://polymer.slack.com/archives/CE6D9DN05) channel.
|
||||||
|
|
||||||
You can join the Polymer slack by visiting https://www.polymer-project.org/slack-invite.
|
You can join the Polymer Slack by visiting [https://www.polymer-project.org/slack-invite](https://www.polymer-project.org/slack-invite).
|
||||||
|
|||||||
@@ -6,4 +6,4 @@ eleventyNavigation:
|
|||||||
|
|
||||||
We currently can only accept sponsoring in the form of services or contributions.
|
We currently can only accept sponsoring in the form of services or contributions.
|
||||||
|
|
||||||
If you are interested in monetary sponsoring please [let as know as](mailto:hello@modern-web.dev).
|
If you are interested in monetary sponsoring please [let us know](mailto:hello@modern-web.dev).
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: Rocket Blog
|
layout: layout-blog-overview
|
||||||
layout: blog
|
|
||||||
eleventyNavigation:
|
eleventyNavigation:
|
||||||
key: Blog
|
key: Blog
|
||||||
order: 30
|
order: 30
|
||||||
@@ -11,4 +10,6 @@ pagination:
|
|||||||
alias: posts
|
alias: posts
|
||||||
---
|
---
|
||||||
|
|
||||||
|
# Rocket Blog
|
||||||
|
|
||||||
Discover articles from the core team and contributors about Rocket, tips and tricks included!
|
Discover articles from the core team and contributors about Rocket, tips and tricks included!
|
||||||
|
|||||||
12
docs/blog/introducing-check-html-links.11tydata.cjs
Normal file
12
docs/blog/introducing-check-html-links.11tydata.cjs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
const { createSocialImage } = require('@rocket/cli');
|
||||||
|
|
||||||
|
module.exports = async function () {
|
||||||
|
const socialMediaImage = await createSocialImage({
|
||||||
|
title: 'Introducing',
|
||||||
|
subTitle: 'check-html-links',
|
||||||
|
footer: 'Rocket Blog',
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
socialMediaImage,
|
||||||
|
};
|
||||||
|
};
|
||||||
206
docs/blog/introducing-check-html-links.md
Normal file
206
docs/blog/introducing-check-html-links.md
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
---
|
||||||
|
title: Introducing Check HTMl Links - no more bad links
|
||||||
|
published: true
|
||||||
|
description: A fast link checker for static HTML
|
||||||
|
tags: [html, javascript, webdev, node]
|
||||||
|
cover_image: https://dev-to-uploads.s3.amazonaws.com/i/an9z6f4hdll2jlne43u3.jpg
|
||||||
|
---
|
||||||
|
|
||||||
|
**TL;DR : I created a standalone tool that can help you fix all the broken links in your websites/documentation. You can check it out [on npm as check-html-links](https://www.npmjs.com/package/check-html-links)**
|
||||||
|
|
||||||
|
In my developer career, I have put live multiple websites and honestly often within a few days, there was always this one issue raised. "This link on xxx is broken". 🤦♂️
|
||||||
|
|
||||||
|
Often these things happen as somewhere a page got moved or renamed and not every location got updated.
|
||||||
|
It's really hard to catch especially if you have a dynamic page like with WordPress or an SPA. And for users, there is nothing worse than landing on your documentation only to find a 404 staring back at them.
|
||||||
|
|
||||||
|
Luckily, with the rise of SSG (Static Site Generators), this problem becomes easier to tackle and can be solved in large part. The reason for that is that with all HTML rendered upfront as static files we can read all of them and check every link.
|
||||||
|
|
||||||
|
## Evaluation and the Decision for a New Tool
|
||||||
|
|
||||||
|
Of course, I am not the first one to come up with that idea and there are multiple tools available on the market already.
|
||||||
|
However, when checking existing solutions I found out that most of them didn't satisfy me in at least one way 😅. Things I noticed: slow to execute, deprecated, large dependency tree, confusing output for the user, ...
|
||||||
|
|
||||||
|
Reviewing these tools I decided to create my own, with the following requirements :
|
||||||
|
|
||||||
|
- Blazing fast
|
||||||
|
- User-focused output
|
||||||
|
- Few dependencies, to keep it lean
|
||||||
|
- Preferably in the Node.js ecosystem
|
||||||
|
|
||||||
|
## Focusing on Useful Output
|
||||||
|
|
||||||
|
Most tools evaluated check files individually and report on their findings individually. That means if you have a broken link in your header or footer, you will get one line (or even multiple lines) of an error message(s) for EVERY page.
|
||||||
|
|
||||||
|
I tested this on the [11ty-website](https://github.com/11ty/11ty-website) and there are currently 516 broken links in 501 files. However, **the source of those 516 broken links is just 13 missing pages/resources**.
|
||||||
|
|
||||||
|
In my implementation, I decided to switch from an "Error in File Focused" method to a "Missing File Focused". Let's see this with examples
|
||||||
|
|
||||||
|
### Error in File Focused
|
||||||
|
|
||||||
|
This is what a lot of current existing solutions implement. Here is part of the output that is being produced:
|
||||||
|
|
||||||
|
```
|
||||||
|
[...]
|
||||||
|
authors/ryzokuken/index.html
|
||||||
|
target does not exist --- authors/ryzokuken/index.html --> /speedlify/
|
||||||
|
authors/alex_kaul/index.html
|
||||||
|
target does not exist --- authors/alex_kaul/index.html --> /speedlify/
|
||||||
|
docs/config/index.html
|
||||||
|
target does not exist --- docs/config/index.html --> /speedlify/
|
||||||
|
hash does not exist --- docs/config/index.html --> /docs/copy/#disabling-passthrough-file-copy
|
||||||
|
authors/cramforce/index.html
|
||||||
|
target does not exist --- authors/cramforce/index.html --> /speedlify/
|
||||||
|
authors/accudio/index.html
|
||||||
|
target does not exist --- authors/accudio/index.html --> /speedlify/
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
We get ~2000 lines of errors for `/speedlify/` as it's not found ~500 times. In the middle of those errors, we also see some other broken links.
|
||||||
|
Because the reporting is focusing first on the files, and then on the actual error **it is difficult to know where most errors originate from**.
|
||||||
|
|
||||||
|
### Missing File Focused
|
||||||
|
|
||||||
|
Let us turn that around and focus on missing references indeed. Here is the output for the same input website :
|
||||||
|
|
||||||
|
```
|
||||||
|
[...]
|
||||||
|
1. missing reference target _site/speedlify/index.html
|
||||||
|
from _site/404.html:1942:13 via href="/speedlify/"
|
||||||
|
from _site/authors/_amorgunov/index.html:2031:13 via href="/speedlify/"
|
||||||
|
from _site/authors/_coolcut/index.html:2031:13 via href="/speedlify/"
|
||||||
|
... 495 more references to this target
|
||||||
|
|
||||||
|
2. missing id="disabling-passthrough-file-copy" in _site/docs/copy/index.html
|
||||||
|
from _site/docs/config/index.html:2527:267 via href="/docs/copy/#disabling-passthrough-file-copy"
|
||||||
|
|
||||||
|
3. missing reference target _site/authors/dkruythoff/github.com/dkruythoff/darius-codes
|
||||||
|
from _site/authors/dkruythoff/index.html:2102:234 via href="github.com/dkruythoff/darius-codes"
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
We get one 5 line error for `/speedlify/` and it tells us it's missing 495 times + 3 examples usages.
|
||||||
|
Afterward, we find very clearly more missing references and where they occurred.
|
||||||
|
|
||||||
|
### A Clear Winner
|
||||||
|
|
||||||
|
Comparing those two outputs makes it pretty clear to me that `Missing File Focused` will make more sense if there is a chance that some links will be broken everywhere. My implementation focuses on missing links in its output. This is crucial because it allows developers to know where to focus their efforts first to get the biggest wins.
|
||||||
|
|
||||||
|
## Focusing on Speed
|
||||||
|
|
||||||
|
Speed is always nice to have but in this case, it's probably vital. I need this to be fast so that I can run it potentially on every save. Speed is also very important in case the tool runs in a CI for example. For projects with extensive documentation, we don't want to hog the CI only to check for documentation.
|
||||||
|
|
||||||
|
Luckily HTML is an awesome language to analyze as it's declarative, which means you can read and analyze it at the same time. This may even mean that the HTML is already processed by the time the file is done reading.
|
||||||
|
|
||||||
|
With this knowledge I was hopeful - but reality didn't deliver 😅. The only tool that could keep up with the speed I needed was implemented in [Go](https://golang.org/).
|
||||||
|
|
||||||
|
It seems that most tools use sophisticated parsers meant to create full syntax trees of your HTML.
|
||||||
|
In reality for link checking all you need to know are the _id_ and the _href_ attributes.
|
||||||
|
|
||||||
|
I have been using [sax-wasm](https://github.com/justinwilaby/sax-wasm) in a few situations before and I knew it supported streaming. I knew that way it could be FAST 🤞!
|
||||||
|
|
||||||
|
How fast are we talking about though?
|
||||||
|
|
||||||
|
As a rule of thumb, I decided that the analysis should be finished within 1s for a small site (up to 200 pages).
|
||||||
|
The main reason is already listed above: To not disturb during writing/development as it will run on every save.
|
||||||
|
For medium sites (200 - 1000 pages), it's reasonable if it takes a little longer - let's aim for less than 5 seconds. This will probably be a breaking point where you execute it only on-demand and in the CI instead of executing it on every save.
|
||||||
|
|
||||||
|
Results are gatherd on January 26, 2021:
|
||||||
|
|
||||||
|
| Website | Pages | Duration |
|
||||||
|
| ----------- | ----- | -------- |
|
||||||
|
| open-wc.org | 90 | ~0.4s |
|
||||||
|
| 11ty.dev | 501 | ~2.5s |
|
||||||
|
| web.dev | 830 | ~3.7s |
|
||||||
|
| eslint.org | 3475 | ~12.4s |
|
||||||
|
|
||||||
|
## Being Part of the Node.js Ecosystem
|
||||||
|
|
||||||
|
My daily workflow is hugely dominated by JavaScript, so it was only natural to want to stay in the same environment if I could reach my earlier requirements with it.
|
||||||
|
On top of this, the end goal is to integrate it within a bigger WIP system called [Rocket](https://github.com/modernweb-dev/rocket) which is node-based so therefore it will need to at least support Node.js. Having it standalone (usable via `npx`) also makes it more versatile and easier to maintain/test.
|
||||||
|
|
||||||
|
## Focusing on a Small Dependency Tree
|
||||||
|
|
||||||
|
The JavaScript and Node.js ecosystem is very active and constantly shifting. Lots of changes/improvements happen all the time. It's often hard to keep up. Therefore having a small dependency tree is something to always thrive for because it will reduce the maintenance burden down the line. And as an added benefit, it makes it smaller and easily embeddable as less stuff has to go down the wire. Lean is king 👑.
|
||||||
|
|
||||||
|
## Solution
|
||||||
|
|
||||||
|
As already mentioned I went on and implement a link checker myself 😅. So far it fits all my requirements so I call it a success 🎉! You can find it [on npm](https://www.npmjs.com/package/check-html-links).
|
||||||
|
|
||||||
|
I called it `check-html-links` and its slogan is "no more broken links or assets".
|
||||||
|
|
||||||
|
The features so far are:
|
||||||
|
|
||||||
|
- extracts every attribute value of id, href, src, srcset
|
||||||
|
- use a Wasm parser (sax-wasm)
|
||||||
|
- streams the HTML for performance
|
||||||
|
- check if file or id within file exist
|
||||||
|
- focus on missing references/sources
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
It checks your final HTML output so you need to execute it after your Static Site Generator.
|
||||||
|
|
||||||
|
```
|
||||||
|
npx check-html-links _site
|
||||||
|
```
|
||||||
|
|
||||||
|
## GitHub Action Usage
|
||||||
|
|
||||||
|
[Julien](https://twitter.com/jlengrand) created a GitHub action available for the tool, so you can easily plug it in your existing CI. You can find it [on the GitHub Marketplace](https://github.com/marketplace/actions/check-html-links-action).
|
||||||
|
|
||||||
|
Here is a complete example workflow that will check the result of the folder `_site` in the root of your repository on each push:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check_html_links_job:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: A job to test check-html-links-action
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: check-html-links-action step
|
||||||
|
id: check-links
|
||||||
|
uses: modernweb-dev/check-html-links-action@v1
|
||||||
|
with:
|
||||||
|
doc-folder: '_site_'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Comparison
|
||||||
|
|
||||||
|
Checking the output of the [11ty-website](https://github.com/11ty/11ty-website) with 13 missing reference targets (used by 516 links) while checking 501 files. (on January 17, 2021)
|
||||||
|
|
||||||
|
| Tool | Lines printed | Duration | Lang | Dependency Tree |
|
||||||
|
| ---------------- | ------------- | -------- | ---- | --------------- |
|
||||||
|
| check-html-links | 38 | ~2.5s | node | 19 |
|
||||||
|
| link-checker | 3000+ | ~11s | node | 106 |
|
||||||
|
| hyperlink | 68 | 4m 20s | node | 481 |
|
||||||
|
| htmltest | 1000+ | ~0.7s | GO | - |
|
||||||
|
|
||||||
|
## Future
|
||||||
|
|
||||||
|
The basic functionality is finished and it's reasonabley fast.
|
||||||
|
|
||||||
|
Topic to work on:
|
||||||
|
|
||||||
|
- Allow to ignore folders (potentially via a cli parameter)
|
||||||
|
- Support for `<base href="/">`
|
||||||
|
- Big Sites Speed improvements (potentially running multiple parsers in parallel for 1000+ pages)
|
||||||
|
- Speed improvements by introducing a "permanent cache" for the parse result (if file did not change, parse result will not change - we still check all links)
|
||||||
|
- Memory consumption check (see if there is room for improvements)
|
||||||
|
- Improve node api
|
||||||
|
- Check external links
|
||||||
|
|
||||||
|
## Acknowledgements
|
||||||
|
|
||||||
|
Thank you for following along on my journey on creating `check-html-links`. You can find the code on [GitHub](https://github.com/modernweb-dev/rocket/tree/main/packages/check-html-links).
|
||||||
|
|
||||||
|
Follow us on [Twitter](https://twitter.com/modern_web_dev), or follow me on my personal [Twitter](https://twitter.com/dakmor).
|
||||||
|
|
||||||
|
Thanks to [Julien](https://twitter.com/jlengrand) for feedback and helping turn my scribbles to a followable story.
|
||||||
|
|
||||||
|
If you think my open source work is valuable then I would like you to check out my personal [GitHub Sponsor Page](https://github.com/sponsors/daKmoR). Or you can support our whole group via the [Modern Web Open Collective](https://opencollective.com/modern-web).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<span>Photo by <a href="https://unsplash.com/@mihaiteslariu0?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Teslariu Mihai</a> on <a href="https://unsplash.com/?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a></span>
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 11 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB |
@@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: Introducing rocket - effective static content with some javascript
|
|
||||||
published: true
|
|
||||||
description: Write Interactive Demos Using Markdown and JavaScript
|
|
||||||
tags: [markdown, javascript, webcomponents, demos]
|
|
||||||
cover_image: /blog/introducing-rocket/images/blog-header.jpg
|
|
||||||
socialMediaImage: /blog/introducing-rocket/images/social-media-image.jpg
|
|
||||||
---
|
|
||||||
|
|
||||||
Welcome to the next level of content creation.
|
|
||||||
|
|
||||||
## Here comes the navigation
|
|
||||||
|
|
||||||
Stuff
|
|
||||||
|
|
||||||
## Another anchor
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
# Configuration >> setupEleventyComputedConfig ||20
|
# Configuration >> Computed Config ||20
|
||||||
|
|
||||||
If you want to add data that depends on other data then you can do it via [11ty's computed data](https://www.11ty.dev/docs/data-computed/).
|
If you want to add data that depends on other data then you can do it via [Eleventy's computed data](https://www.11ty.dev/docs/data-computed/).
|
||||||
|
|
||||||
Rocket exposes it via `setupEleventyComputedConfig`.
|
Rocket exposes it via `setupEleventyComputedConfig`.
|
||||||
|
|
||||||
## Set your own data
|
## Set Your Own Data
|
||||||
|
|
||||||
Let's say you want to add a `Welcome to the contact page` everyhwere. (a filter might be a better choise but it's a good example of the concept)
|
Let's say you want to add a `Welcome to the contact page` everywhere. (A filter might be a better choice, but it's a good example of the concept.)
|
||||||
|
|
||||||
👉 `rocket.config.mjs` (or your theme config file)
|
👉 `rocket.config.mjs` (or your theme config file)
|
||||||
|
|
||||||
@@ -24,9 +24,9 @@ export default config;
|
|||||||
```
|
```
|
||||||
|
|
||||||
{% raw %}
|
{% raw %}
|
||||||
Now you can use everywhere {{ greeting }}.
|
Now you can use {{ greeting }} everywhere.
|
||||||
{% endraw %}
|
{% endraw %}
|
||||||
And it will correctly replaced with a Welcome and the page title.
|
And it will be correctly replaced with a Welcome and the page title.
|
||||||
|
|
||||||
## Default Available Configs
|
## Default Available Configs
|
||||||
|
|
||||||
@@ -37,5 +37,6 @@ And it will correctly replaced with a Welcome and the page title.
|
|||||||
{ name: 'eleventyNavigation', plugin: eleventyNavigationPlugin },
|
{ name: 'eleventyNavigation', plugin: eleventyNavigationPlugin },
|
||||||
{ name: 'section', plugin: sectionPlugin },
|
{ name: 'section', plugin: sectionPlugin },
|
||||||
{ name: 'socialMediaImage', plugin: socialMediaImagePlugin },
|
{ name: 'socialMediaImage', plugin: socialMediaImagePlugin },
|
||||||
|
{ name: 'templateBlocks', plugin: templateBlocksPlugin, options: rocketConfig },
|
||||||
];
|
];
|
||||||
```
|
```
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
The configuration file is `rocket.config.js` or `rocket.config.mjs`.
|
The configuration file is `rocket.config.js` or `rocket.config.mjs`.
|
||||||
|
|
||||||
The config files consists of the following parts:
|
The config files consist of the following parts:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
import { rocketLaunch } from '@rocket/launch';
|
import { rocketLaunch } from '@rocket/launch';
|
||||||
@@ -14,28 +14,28 @@ export default {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
Rocket is primarily build around plugins for each of it's systems.
|
Rocket is primarily build around plugins for each of its systems.
|
||||||
|
|
||||||
New plugins can be added and all default plugins can be adjusted or even removed by using the following functions.
|
New plugins can be added and all default plugins can be adjusted or even removed by using the following functions.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
export default {
|
export default {
|
||||||
// add remark/unified plugin to the markdown processing (e.g. enable special code blocks)
|
// add remark/unified plugin to the Markdown processing (e.g. enable special code blocks)
|
||||||
setupUnifiedPlugins: [],
|
setupUnifiedPlugins: [],
|
||||||
|
|
||||||
// add a rollup plugins to the web dev server (will be wrapped with @web/dev-server-rollup) AND the rollup build (e.g. enable json importing)
|
// add a rollup plugins to the web dev server (will be wrapped with @web/dev-server-rollup) AND the rollup build (e.g. enable json importing)
|
||||||
setupDevAndBuildPlugins: [],
|
setupDevAndBuildPlugins: [],
|
||||||
|
|
||||||
// add a plugin to the web dev server (will not be wrapped) (e.g. esbuild for typescript)
|
// add a plugin to the web dev server (will not be wrapped) (e.g. esbuild for TypeScript)
|
||||||
setupDevPlugins: [],
|
setupDevPlugins: [],
|
||||||
|
|
||||||
// add a plugin to the rollup build (e.g. optimization steps)
|
// add a plugin to the rollup build (e.g. optimization steps)
|
||||||
setupBuildPlugins: [],
|
setupBuildPlugins: [],
|
||||||
|
|
||||||
// add a plugin to eleventy (e.g. a filter packs)
|
// add a plugin to Eleventy (e.g. a filter packs)
|
||||||
setupEleventyPlugins: [],
|
setupEleventyPlugins: [],
|
||||||
|
|
||||||
// add a computedConfig to eleventy (e.g. site wide default variables like socialMediaImage)
|
// add a computedConfig to Eleventy (e.g. site wide default variables like socialMediaImage)
|
||||||
setupEleventyComputedConfig: [],
|
setupEleventyComputedConfig: [],
|
||||||
|
|
||||||
// add a plugin to the cli (e.g. a new command like "rocket my-command")
|
// add a plugin to the cli (e.g. a new command like "rocket my-command")
|
||||||
@@ -51,9 +51,9 @@ For some projects you might want to enable non-standard behaviors like importing
|
|||||||
import data from './data.json';
|
import data from './data.json';
|
||||||
```
|
```
|
||||||
|
|
||||||
You can accomplish this with rollup and dev server plugins. Make sure to add both the dev-server plugin as well as the rollup plugin, so that the behaviors is the same during development as it is in the production build.
|
You can accomplish this with Rollup and dev server plugins. Make sure to add both the dev-server plugin as well as the Rollup plugin, so that the behaviors is the same during development as it is in the production build.
|
||||||
|
|
||||||
For these cases you can use `setupDevAndBuildPlugins`, which will automatically add the plugin for you to both rollup and dev-server:
|
For these cases you can use `setupDevAndBuildPlugins`, which will automatically add the plugin for you to both Rollup and dev-server:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
import json from '@rollup/plugin-json';
|
import json from '@rollup/plugin-json';
|
||||||
@@ -69,8 +69,8 @@ const config = {
|
|||||||
export default config;
|
export default config;
|
||||||
```
|
```
|
||||||
|
|
||||||
This will add the rollup plugin `json` with the id `json` at the top of the plugin list of rollup and the dev server. It needs to be at the top so further plugins down the line can work with json imports.
|
This will add the Rollup plugin `json` with the id `json` at the top of the plugin list of Rollup and the dev server. It needs to be at the top so further plugins down the line can work with JSON imports.
|
||||||
For the Dev Server the plugins are automatically wrapped by `@web/dev-server-rollup`. Note that [not all rollup plugins](https://modern-web.dev/docs/dev-server/plugins/rollup/#compatibility-with-rollup-plugins) will work with the dev-server.
|
For the Dev Server the plugins are automatically wrapped by `@web/dev-server-rollup`. Note that [not all Rollup plugins](https://modern-web.dev/docs/dev-server/plugins/rollup/#compatibility-with-rollup-plugins) will work with the dev-server.
|
||||||
|
|
||||||
## Modifying Options of Plugins
|
## Modifying Options of Plugins
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Eleventy Plugins >> Markdown JavaScript (Mdjs)
|
# Eleventy Plugins >> Markdown JavaScript (mdjs)
|
||||||
|
|
||||||
Use mdjs in your 11ty site.
|
Use mdjs in your Eleventy site.
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
@@ -8,7 +8,7 @@ Use mdjs in your 11ty site.
|
|||||||
npm install @rocket/eleventy-plugin-mdjs
|
npm install @rocket/eleventy-plugin-mdjs
|
||||||
```
|
```
|
||||||
|
|
||||||
Create an 11ty config file `.eleventy.js`
|
Create an Eleventy config file `.eleventy.js`
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const pluginMdjs = require('@rocket/eleventy-plugin-mdjs');
|
const pluginMdjs = require('@rocket/eleventy-plugin-mdjs');
|
||||||
@@ -18,7 +18,7 @@ module.exports = function (eleventyConfig) {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
## Configure a unified or remark plugin with mdjs
|
## Configure a unified or remark Plugin with mdjs
|
||||||
|
|
||||||
By providing a `setupUnifiedPlugins` function as an option to `eleventy-plugin-mdjs` you can set options for all unified/remark plugins.
|
By providing a `setupUnifiedPlugins` function as an option to `eleventy-plugin-mdjs` you can set options for all unified/remark plugins.
|
||||||
|
|
||||||
@@ -43,12 +43,12 @@ module.exports = function (eleventyConfig) {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
## Add a unified or remark plugin
|
## Add a unified or remark Plugin
|
||||||
|
|
||||||
The order of plugins is important in unified as each plugin processes the content and passes on its result.
|
The order of plugins is important in unified as each plugin processes the content and passes on its result.
|
||||||
Some plugins do work with the markdown AST and some with the rehype (e.g. html) AST. In order to get access to the correct AST the plugin needs to be in a specific location in the processing order.
|
Some plugins do work with the Markdown AST and some with the rehype (e.g. HTML) AST. In order to get access to the correct AST the plugin needs to be in a specific location in the processing order.
|
||||||
|
|
||||||
Examples on how to insert a plugin right after creating the markdown AST.
|
Examples on how to insert a plugin right after creating the Markdown AST.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const pluginMdjs = require('@rocket/eleventy-plugin-mdjs');
|
const pluginMdjs = require('@rocket/eleventy-plugin-mdjs');
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Markdown JavaScript >> Overview || 10
|
# Markdown JavaScript >> Overview || 10
|
||||||
|
|
||||||
Markdown JavaScript (Mdjs) is a format that allows you to use JavaScript with Markdown, to create interactive demos. It does so by "annotating" JavaScript that should be executed in Markdown.
|
Markdown JavaScript (mdjs) is a format that allows you to use JavaScript with Markdown, to create interactive demos. It does so by "annotating" JavaScript that should be executed in Markdown.
|
||||||
|
|
||||||
To annotate we use a code block with `js script`.
|
To annotate we use a code block with `js script`.
|
||||||
|
|
||||||
@@ -13,9 +13,9 @@ To annotate we use a code block with `js script`.
|
|||||||
## Web Components
|
## Web Components
|
||||||
|
|
||||||
One very good use case for that can be web components.
|
One very good use case for that can be web components.
|
||||||
HTML already works in markdown so all you need is to load a web components definition file.
|
HTML already works in Markdown so all you need is to load a web components definition file.
|
||||||
|
|
||||||
You could even do so within the same markdown file.
|
You could even do so within the same Markdown file.
|
||||||
|
|
||||||
````md
|
````md
|
||||||
## This is my-card
|
## This is my-card
|
||||||
@@ -52,7 +52,7 @@ customElements.define('my-el', MyEl);
|
|||||||
|
|
||||||
## Demo Support (Story)
|
## Demo Support (Story)
|
||||||
|
|
||||||
mdjs comes with some additional helpers you can choose to import via
|
mdjs comes with some additional helpers you can choose to import:
|
||||||
|
|
||||||
````md
|
````md
|
||||||
```js script
|
```js script
|
||||||
@@ -61,7 +61,7 @@ import '@mdjs/mdjs-preview/mdjs-preview.js';
|
|||||||
```
|
```
|
||||||
````
|
````
|
||||||
|
|
||||||
once loaded you can use them like so.
|
Once loaded you can use them like so:
|
||||||
|
|
||||||
````md
|
````md
|
||||||
```js script
|
```js script
|
||||||
@@ -70,9 +70,7 @@ import '@mdjs/mdjs-preview/mdjs-preview.js';
|
|||||||
```
|
```
|
||||||
````
|
````
|
||||||
|
|
||||||
once loaded you can use them like so.
|
### Story
|
||||||
|
|
||||||
### story
|
|
||||||
|
|
||||||
The code snippet will actually get executed at that place and you will have a live demo
|
The code snippet will actually get executed at that place and you will have a live demo
|
||||||
|
|
||||||
@@ -88,7 +86,7 @@ export const JsStory = () => html` <demo-wc-card>JS Story</demo-wc-card> `;
|
|||||||
```
|
```
|
||||||
````
|
````
|
||||||
|
|
||||||
#### full code support
|
#### Full Code Support
|
||||||
|
|
||||||
````md
|
````md
|
||||||
```js story
|
```js story
|
||||||
@@ -101,7 +99,7 @@ export const JsStory = () => {
|
|||||||
```
|
```
|
||||||
````
|
````
|
||||||
|
|
||||||
### preview story
|
### Preview Story
|
||||||
|
|
||||||
Will become a live demo wrapped in a container with a show code button.
|
Will become a live demo wrapped in a container with a show code button.
|
||||||
|
|
||||||
@@ -146,7 +144,7 @@ Preview your mdjs readme with live demos and auto reload.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- Create a `es-dev-server.config.js` in the root of your repo.
|
- Create a `es-dev-server.config.js` in the root of your repository.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const { mdjsTransformer } = require('@mdjs/core');
|
const { mdjsTransformer } = require('@mdjs/core');
|
||||||
@@ -165,9 +163,9 @@ Please check out [@open-wc/demoing-storybook](https://open-wc.org/demoing/) for
|
|||||||
|
|
||||||
It includes [storybook-addon-markdown-docs](https://open-wc.org/demoing/storybook-addon-markdown-docs.html) which uses mdjs under the hood.
|
It includes [storybook-addon-markdown-docs](https://open-wc.org/demoing/storybook-addon-markdown-docs.html) which uses mdjs under the hood.
|
||||||
|
|
||||||
### Chrome Extension (currently only for Github)
|
### Chrome Extension (currently only for GitHub)
|
||||||
|
|
||||||
See live demos directly inside github page, markdown files, issues, pull requests...
|
See live demos directly inside GitHub pages, Markdown files, issues, pull requests...
|
||||||
|
|
||||||
Please check out [mdjs-viewer](https://github.com/open-wc/mdjs-viewer).
|
Please check out [mdjs-viewer](https://github.com/open-wc/mdjs-viewer).
|
||||||
|
|
||||||
@@ -179,7 +177,7 @@ mdjs offers two more "basic" integrations
|
|||||||
|
|
||||||
#### `mdjsDocPage`
|
#### `mdjsDocPage`
|
||||||
|
|
||||||
Creates a full blown html page by passing in the markdown.
|
Creates a full blown HTML page by passing in the Markdown.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const { mdjsDocPage } = require('@mdjs/core');
|
const { mdjsDocPage } = require('@mdjs/core');
|
||||||
@@ -197,7 +195,7 @@ const page = await mdjsDocPage(markdownString);
|
|||||||
|
|
||||||
#### `mdjsProcess`
|
#### `mdjsProcess`
|
||||||
|
|
||||||
Pass in multiple markdown documents and you get back all the jsCode and rendered html.
|
Pass in multiple Markdown documents and you get back all the JavaScript code and rendered HTML.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const { mdjsProcess } = require('@mdjs/core');
|
const { mdjsProcess } = require('@mdjs/core');
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Presets >> Blog ||30
|
# Presets >> Blog ||40
|
||||||
|
|
||||||
Enable writing blog posts within your rocket site
|
Enable writing blog posts within your Rocket site.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
|||||||
95
docs/docs/presets/joining-blocks.md
Normal file
95
docs/docs/presets/joining-blocks.md
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
# Presets >> Joining Blocks ||10
|
||||||
|
|
||||||
|
The template system allows for a very granular control of how individual parts will be merged, overwritten or reorderd.
|
||||||
|
|
||||||
|
As a preset you may want to add this to your layout.
|
||||||
|
|
||||||
|
{% raw %}
|
||||||
|
|
||||||
|
```
|
||||||
|
<footer id="main-footer">
|
||||||
|
{% for blockName, blockPath in _joiningBlocks.footer %}
|
||||||
|
{% include blockPath %}
|
||||||
|
{% endfor %}
|
||||||
|
</footer>
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endraw %}
|
||||||
|
|
||||||
|
This will now render all templates within `_includes/_joiningBlocks/footer/*`.
|
||||||
|
|
||||||
|
## Adding content without overriding
|
||||||
|
|
||||||
|
Let's assume we have a preset with the following files
|
||||||
|
|
||||||
|
```html
|
||||||
|
<!-- usedPreset/_includes/_joiningBlocks/footer/10-first.njk -->
|
||||||
|
<p>first</p>
|
||||||
|
|
||||||
|
<!-- usedPreset/_includes/_joiningBlocks/footer/20-second.njk -->
|
||||||
|
<p>second</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
And it produces this in your website
|
||||||
|
|
||||||
|
```html
|
||||||
|
<footer>
|
||||||
|
<p>first</p>
|
||||||
|
<p>second</p>
|
||||||
|
</footer>
|
||||||
|
```
|
||||||
|
|
||||||
|
Now we can add a file which will insert content without needing to overwrite any of the preset file.
|
||||||
|
|
||||||
|
```html
|
||||||
|
<!-- docs/_includes/_joiningBlocks/footer/15-in-between.njk -->
|
||||||
|
<p>in-between</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
the final output will be
|
||||||
|
|
||||||
|
```html
|
||||||
|
<footer>
|
||||||
|
<p>first</p>
|
||||||
|
<p>in-between</p>
|
||||||
|
<p>second</p>
|
||||||
|
</footer>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Overriding Content
|
||||||
|
|
||||||
|
Now if you want to overwrite you can use the same filename.
|
||||||
|
|
||||||
|
```html
|
||||||
|
<!-- docs/_includes/_joiningBlocks/footer/10-first.njk -->
|
||||||
|
<p>updated first</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
the final output will be
|
||||||
|
|
||||||
|
```html
|
||||||
|
<footer>
|
||||||
|
<p>updated first</p>
|
||||||
|
<p>second</p>
|
||||||
|
</footer>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Reordering and Overriding
|
||||||
|
|
||||||
|
Sometimes you wanna reorder when you overwrite as well
|
||||||
|
|
||||||
|
```html
|
||||||
|
<!-- docs/_includes/_joiningBlocks/footer/30-first.njk -->
|
||||||
|
<p>first</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
the final output will be
|
||||||
|
|
||||||
|
```html
|
||||||
|
<footer>
|
||||||
|
<p>second</p>
|
||||||
|
<p>first</p>
|
||||||
|
</footer>
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: Reordering always requires you to overwrite as well.
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# Presets >> Launch ||10
|
# Presets >> Launch ||20
|
||||||
|
|
||||||
Rocket comes with a preset you will love. Simple, Responsive and behaving like native it sure is going to be a hit among your users.
|
Rocket comes with a preset you will love. Simple, responsive and behaving like native, it sure is going to be a hit among your users.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ The footer data comes from `footer.json`
|
|||||||
|
|
||||||
Notification are web components that bring in some styles.
|
Notification are web components that bring in some styles.
|
||||||
|
|
||||||
To use them in Markdown you need to write the html tag and have it separated by an empty line.
|
To use them in Markdown you need to write the HTML tag and have it separated by an empty line.
|
||||||
|
|
||||||
```js script
|
```js script
|
||||||
import '@rocket/launch/inline-notification/inline-notification.js';
|
import '@rocket/launch/inline-notification/inline-notification.js';
|
||||||
@@ -62,7 +62,7 @@ I am a tip
|
|||||||
</inline-notification>
|
</inline-notification>
|
||||||
```
|
```
|
||||||
|
|
||||||
### Modify the title
|
### Modify the Title
|
||||||
|
|
||||||
To override the title you can provide a property success.
|
To override the title you can provide a property success.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Presets >> Search ||20
|
# Presets >> Search ||30
|
||||||
|
|
||||||
Add a search for all your static content.
|
Add a search for all your static content.
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,16 @@
|
|||||||
# Tools >> Check Html Links ||30
|
# Tools >> Check HTML Links ||30
|
||||||
|
|
||||||
A fast checker for broken links/references in html.
|
```js
|
||||||
|
import '@rocket/launch/inline-notification/inline-notification.js';
|
||||||
|
```
|
||||||
|
|
||||||
|
A fast checker for broken links/references in HTML.
|
||||||
|
|
||||||
|
<inline-notification type="tip">
|
||||||
|
|
||||||
|
Read the [Introducing Check HTMl Links - no more bad links](../../blog/introducing-check-html-links.md) Blog post to find out how it came to be and how it works.
|
||||||
|
|
||||||
|
</inline-notification>
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
@@ -8,7 +18,7 @@ A fast checker for broken links/references in html.
|
|||||||
- Focuses on the broken reference targets and groups references to it
|
- Focuses on the broken reference targets and groups references to it
|
||||||
- Fast (can process 500-1000 documents in ~2-3 seconds)
|
- Fast (can process 500-1000 documents in ~2-3 seconds)
|
||||||
- Has only 3 dependencies (and 19 in the full tree)
|
- Has only 3 dependencies (and 19 in the full tree)
|
||||||
- Uses [sax-wasm](https://github.com/justinwilaby/sax-wasm) for parsing streamed html
|
- Uses [sax-wasm](https://github.com/justinwilaby/sax-wasm) for parsing streamed HTML
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -16,17 +26,32 @@ A fast checker for broken links/references in html.
|
|||||||
npm i -D check-html-links
|
npm i -D check-html-links
|
||||||
```
|
```
|
||||||
|
|
||||||
## Usage
|
## CLI flags
|
||||||
|
|
||||||
```
|
| Name | Type | Description |
|
||||||
|
| ------------------- | ------- | --------------------------------------------------------------------------------------------------- |
|
||||||
|
| root-dir | string | the root directory to serve files from. Defaults to the current working directory |
|
||||||
|
| ignore-link-pattern | string | do not check links matching the pattern |
|
||||||
|
| continue-on-error | boolean | if present it will not exit with an error code - useful while writing or for temporary passing a ci |
|
||||||
|
|
||||||
|
## Usage Examples
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# check a folder _site
|
||||||
npx check-html-links _site
|
npx check-html-links _site
|
||||||
|
|
||||||
|
# ignore all links like <a href="/users/123">
|
||||||
|
npx check-html-links _site --ignore-link-pattern "/users/*" "/users/**/*"
|
||||||
|
|
||||||
|
# ignore all links like <a href="/users/123"> & <a href="/users/123/details">
|
||||||
|
npx check-html-links _site --ignore-link-pattern "/users/*" "/users/**/*"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Example Output
|
## Example Output
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Comparision
|
## Comparison
|
||||||
|
|
||||||
Checking the output of [11ty-website](https://github.com/11ty/11ty-website) with 13 missing reference targets (used by 516 links) while checking 501 files. (on January 17, 2021)
|
Checking the output of [11ty-website](https://github.com/11ty/11ty-website) with 13 missing reference targets (used by 516 links) while checking 501 files. (on January 17, 2021)
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ var processor = unified().use(markdown).use(toc, { maxDepth: 2 });
|
|||||||
// ...
|
// ...
|
||||||
```
|
```
|
||||||
|
|
||||||
## Problem statement
|
## Problem Statement
|
||||||
|
|
||||||
> Executing or adding a plugin in a special way is a one time process. You can not transparently later change the options of the given plugin.
|
> Executing or adding a plugin in a special way is a one time process. You can not transparently later change the options of the given plugin.
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ This means if you wish to define default plugins and allow your user to override
|
|||||||
|
|
||||||
## Solution
|
## Solution
|
||||||
|
|
||||||
The plugins manager let's you orchestrate a set of "meta plugins" which are defined by
|
The plugins manager lets you orchestrate a set of "meta plugins" which are defined by
|
||||||
|
|
||||||
- name
|
- name
|
||||||
- plugin
|
- plugin
|
||||||
@@ -193,7 +193,7 @@ adjustPluginOptions('json', false);
|
|||||||
// resulting options = false
|
// resulting options = false
|
||||||
```
|
```
|
||||||
|
|
||||||
## Converting metaPlugins to an actual plugin
|
## Converting metaPlugins to an Actual Plugin
|
||||||
|
|
||||||
To execute all setup function you can use this little helper
|
To execute all setup function you can use this little helper
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
# Tools >> Rollup Config ||20
|
# Tools >> Rollup Config ||20
|
||||||
|
|
||||||
Rollup configuration to help you get started building modern web applications.
|
Rollup configuration to help you get started building modern web applications.
|
||||||
You write modern javascript using the latest browser-features, rollup will optimize your code for production and ensure it runs on all supported browsers.
|
You write modern JavaScript using the latest browser features. Rollup will optimize your code for production and ensure it runs on all supported browsers.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- Set HTML or JS as input and/or output
|
- Set HTML or JavaScript as input and/or output
|
||||||
- Optimized for browsers which support modules
|
- Optimized for browsers which support modules
|
||||||
- Loads polyfills using feature detection
|
- Loads polyfills using feature detection
|
||||||
- Generates a service worker
|
- Generates a service worker
|
||||||
- Minifies JS
|
- Minifies JavaScript
|
||||||
- Minifies lit-html templates
|
- Minifies lit-html templates
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
@@ -25,7 +25,7 @@ You write modern javascript using the latest browser-features, rollup will optim
|
|||||||
```js
|
```js
|
||||||
import { createSpaConfig } from '@rocket/building-rollup';
|
import { createSpaConfig } from '@rocket/building-rollup';
|
||||||
// use `import { createBasicConfig }` to do regular JS to JS bundling
|
// use `import { createBasicConfig }` to do regular JS to JS bundling
|
||||||
// use `import { createMpaConfig }` to bundle multiple html files
|
// use `import { createMpaConfig }` to bundle multiple HTML files
|
||||||
|
|
||||||
export default createSpaConfig({
|
export default createSpaConfig({
|
||||||
input: 'index.html',
|
input: 'index.html',
|
||||||
@@ -54,7 +54,7 @@ Our config sets you up with good defaults for most projects. Additionally you ca
|
|||||||
|
|
||||||
We use the [plugins-manager](./plugins-manager.md) for it.
|
We use the [plugins-manager](./plugins-manager.md) for it.
|
||||||
|
|
||||||
### Customizing the babel config
|
### Customizing the Babel Config
|
||||||
|
|
||||||
You can define custom babel plugins to be loaded by adding a `.babelrc` or `babel.config.js` to your project. See [babeljs config](https://babeljs.io/docs/en/configuration) for more information.
|
You can define custom babel plugins to be loaded by adding a `.babelrc` or `babel.config.js` to your project. See [babeljs config](https://babeljs.io/docs/en/configuration) for more information.
|
||||||
|
|
||||||
@@ -66,9 +66,9 @@ For example to add support for class properties:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Customizing default plugins
|
### Customizing Default Plugins
|
||||||
|
|
||||||
Our config creators install a number of rollup plugins by default:
|
Our config creators install a number of Rollup plugins by default:
|
||||||
|
|
||||||
Basic, SPA and MPA plugins:
|
Basic, SPA and MPA plugins:
|
||||||
|
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ export default /** @type {Partial<import('@rocket/cli').RocketCliOptions>} */ ({
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
The Plugins Manager helps you register and execute your plugins across the various Rocket components - rollup, dev-server, eleventy, and markdown. It replaces the specific registration/execution call in a given plugin system by an intent to use that plugin.
|
The Plugins Manager helps you register and execute your plugins across the various Rocket components - Rollup, Web Dev Server, Eleventy, and Markdown. It replaces the specific registration/execution call in a given plugin system by an intent to use that plugin.
|
||||||
|
|
||||||
## Adding Remark/Unified Plugins
|
## Adding Remark/Unified Plugins
|
||||||
|
|
||||||
If you want to a plugin to the markdown processing you can use `setupUnifiedPlugins`.
|
If you want to a plugin to the Markdown processing you can use `setupUnifiedPlugins`.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
import emoji from 'remark-emoji';
|
import emoji from 'remark-emoji';
|
||||||
@@ -34,5 +34,5 @@ const config = {
|
|||||||
export default config;
|
export default config;
|
||||||
```
|
```
|
||||||
|
|
||||||
For plugins that should handle the markdown <abbr title="Abstract Syntax Tree">AST</abbr> you should use `addPlugin({ location: 'markdown', name: 'my-plugin', plugin: MyPlugin})`. <br>
|
For plugins that should handle the Markdown <abbr title="Abstract Syntax Tree">AST</abbr> you should use `addPlugin({ location: 'markdown', name: 'my-plugin', plugin: MyPlugin})`. <br>
|
||||||
While for the rehype ast you should use `addPlugin({ location: 'remark2rehype', name: 'my-plugin', plugin: MyPlugin})`.
|
While for the rehype AST you should use `addPlugin({ location: 'remark2rehype', name: 'my-plugin', plugin: MyPlugin})`.
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ It can help to examine each new page and menu carefully, to come to terms with t
|
|||||||
|
|
||||||
</inline-notification>
|
</inline-notification>
|
||||||
|
|
||||||
## Add a section
|
## Add a Section
|
||||||
|
|
||||||
In most cases you will have multiple sections in your website and each of those sections will come with it's own sidebar navigation.
|
In most cases you will have multiple sections in your website and each of those sections will come with its own sidebar navigation.
|
||||||
|
|
||||||
To create a section you need to create a folder with an `index.md`.
|
To create a section you need to create a folder with an `index.md`.
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ Don't worry if this isn't how you would have styled or placed your menu bar or s
|
|||||||
|
|
||||||
It might be more practical to stay below 5 sections.
|
It might be more practical to stay below 5 sections.
|
||||||
|
|
||||||
## Adding a category
|
## Adding a Category
|
||||||
|
|
||||||
Often each section will have multiple categories.
|
Often each section will have multiple categories.
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ mkdir docs/guides/first-pages/
|
|||||||
# First Pages
|
# First Pages
|
||||||
```
|
```
|
||||||
|
|
||||||
## Adding a page to a category
|
## Adding a Page to a Category
|
||||||
|
|
||||||
👉 `docs/guides/first-pages/getting-started.md`
|
👉 `docs/guides/first-pages/getting-started.md`
|
||||||
|
|
||||||
@@ -64,14 +64,14 @@ mkdir docs/guides/first-pages/
|
|||||||
This is how you get started.
|
This is how you get started.
|
||||||
```
|
```
|
||||||
|
|
||||||
## Headings as anchor and menu items
|
## Headings as Anchor and Menu Items
|
||||||
|
|
||||||
_**Within**_ any page, you can still add links to your navigation!
|
_**Within**_ any page, you can still add links to your navigation!
|
||||||
|
|
||||||
Note that md text prefixed with one or two # signs also becomes and anchor in the page and a link in the sidebar navigation when the page is open.
|
Note that Markdown text prefixed with one or two # signs also becomes an anchor in the page and a link in the sidebar navigation when the page is open.
|
||||||
|
|
||||||
```md
|
```md
|
||||||
## Headings as anchor and menu items
|
## Headings as Anchor and Menu Items
|
||||||
|
|
||||||
_**Within**_ any page, you can still add links to your navigation!
|
_**Within**_ any page, you can still add links to your navigation!
|
||||||
```
|
```
|
||||||
@@ -80,6 +80,6 @@ _**Within**_ any page, you can still add links to your navigation!
|
|||||||
import '@rocket/launch/inline-notification/inline-notification.js';
|
import '@rocket/launch/inline-notification/inline-notification.js';
|
||||||
```
|
```
|
||||||
|
|
||||||
## Example as a reference
|
## Example as a Reference
|
||||||
|
|
||||||
If implicit navigation, derived from content, is a bit too much to grasp in one sitting, feel free to examine the **docs** folder in [the rocket codebase behind the pages you are reading](https://github.com/modernweb-dev/rocket) for more examples.
|
If implicit navigation, derived from content, is a bit too much to grasp in one sitting, feel free to examine the **docs** folder in [the rocket codebase behind the pages you are reading](https://github.com/modernweb-dev/rocket) for more examples.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# First Pages >> Getting Started ||10
|
# First Pages >> Getting Started ||10
|
||||||
|
|
||||||
Rocket is has the following prerequisits:
|
Rocket has the following prerequisites:
|
||||||
|
|
||||||
- [Node 14+](https://nodejs.org/en/)
|
- [Node 14+](https://nodejs.org/en/)
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ The fastest way to get started is by using an existing preset like the launch pr
|
|||||||
|
|
||||||
You may be tempted to skip the step above, because you're not ready to commit to git yet!
|
You may be tempted to skip the step above, because you're not ready to commit to git yet!
|
||||||
|
|
||||||
Rocket uses the .gitignore file to manage it's requirements. If you skip this step, rocket will fail to deploy!
|
Rocket uses the .gitignore file to manage its requirements. If you skip this step, Rocket will fail to deploy!
|
||||||
|
|
||||||
</inline-notification>
|
</inline-notification>
|
||||||
|
|
||||||
@@ -62,25 +62,25 @@ Rocket uses the .gitignore file to manage it's requirements. If you skip this st
|
|||||||
|
|
||||||
<inline-notification type="warning" title="note">
|
<inline-notification type="warning" title="note">
|
||||||
|
|
||||||
All further pathes are relative to your project root (my-project in this case)
|
All further paths are relative to your project root (my-project in this case).
|
||||||
|
|
||||||
</inline-notification>
|
</inline-notification>
|
||||||
|
|
||||||
## Add your first page
|
## Add your First Page
|
||||||
|
|
||||||
👉 `docs/index.md`
|
👉 `docs/index.md`
|
||||||
|
|
||||||
```md
|
```md
|
||||||
# Welcome to your Rocket site
|
# Welcome to Your Rocket Site
|
||||||
|
|
||||||
Text here, like any markdown file.
|
Text here, like any Markdown file.
|
||||||
```
|
```
|
||||||
|
|
||||||
This tutorial assumes you are familiar with Markdown, for page authoring.
|
This tutorial assumes you are familiar with Markdown, for page authoring.
|
||||||
|
|
||||||
Please note that the heading - text prefixed with `#` or `##` - is not optional for each page in this tutorial. Everything below that first line is optional Markdown text.
|
Please note that the heading - text prefixed with `#` or `##` - is not optional for each page in this tutorial. Everything below that first line is optional Markdown text.
|
||||||
|
|
||||||
## Start up:
|
## Startup:
|
||||||
|
|
||||||
👉 `package.json`
|
👉 `package.json`
|
||||||
|
|
||||||
|
|||||||
29
docs/guides/first-pages/layouts.md
Normal file
29
docs/guides/first-pages/layouts.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# First Pages >> Layouts ||60
|
||||||
|
|
||||||
|
The following templates are always available:
|
||||||
|
|
||||||
|
- `layout-raw` No html or any wrapping (use it for xml, json, ... outputs)
|
||||||
|
- `layout-default` For content
|
||||||
|
- `layout-index` Extends content and adds an "Open Navigation" button for mobile
|
||||||
|
|
||||||
|
Layout Default has the following Joining Blocks:
|
||||||
|
|
||||||
|
- `head` For the html `<head>`
|
||||||
|
- `header` Within the top `<header>`
|
||||||
|
- `content` Html within the main content section
|
||||||
|
- `footer` Within to bottom `<footer>`
|
||||||
|
- `bottom` Add the end of the body
|
||||||
|
|
||||||
|
## Launch Preset
|
||||||
|
|
||||||
|
On top of the above it adds the following templates
|
||||||
|
|
||||||
|
- `layout-404` A space not found page
|
||||||
|
- `layout-home` Frontpage with center logo below text
|
||||||
|
- `layout-home-background` Frontpage with left text and background image on the right
|
||||||
|
- `layout-sidebar` Left sidebar, right content
|
||||||
|
- `layout-index` Extends layout-sidebar
|
||||||
|
|
||||||
|
And the following changes
|
||||||
|
|
||||||
|
- Sets `layout-sidebar` as the default layout
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# First Pages >> Linking ||20
|
# First Pages >> Linking ||20
|
||||||
|
|
||||||
Standard markdown applies and you can link via
|
Standard Markdown applies. You can link like this:
|
||||||
|
|
||||||
```md
|
```md
|
||||||
[visible label](./path/to/other-file.md)
|
[visible label](./path/to/other-file.md)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ Will be ordered as `First`, `Second`,
|
|||||||
|
|
||||||
## How it works
|
## How it works
|
||||||
|
|
||||||
Internally `# Foo >> Bar >> Baz ||20` get's converted to.
|
Internally `# Foo >> Bar >> Baz ||20` gets converted to.
|
||||||
|
|
||||||
```
|
```
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# First Pages >> Urls ||100
|
# First Pages >> URLs ||50
|
||||||
|
|
||||||
Urls will be represented by the folder structure...
|
URLs will be represented by the folder structure.
|
||||||
|
|
||||||
You can use a frontmatter with permalink to override
|
You can use front matter with a [permalink](https://www.11ty.dev/docs/permalinks/) to override.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# First Pages >> Use JavaScript ||40
|
# First Pages >> Use JavaScript ||40
|
||||||
|
|
||||||
You can use `js script` to execute javascript (type = module)
|
You can use `js script` to execute JavaScript (`type="module"`).
|
||||||
|
|
||||||
````
|
````
|
||||||
```js script
|
```js script
|
||||||
@@ -8,7 +8,7 @@ console.log('foo');
|
|||||||
```
|
```
|
||||||
````
|
````
|
||||||
|
|
||||||
This can be useful for importing web components and using them in markdown
|
This can be useful for importing web components and using them in Markdown.
|
||||||
|
|
||||||
````
|
````
|
||||||
```js script
|
```js script
|
||||||
@@ -16,7 +16,7 @@ import 'magic-reveal/magic-reveal.js';
|
|||||||
|
|
||||||
<magic-reveal>
|
<magic-reveal>
|
||||||
|
|
||||||
This text will get magically revealed. I can **still** use markdown as long as between the opening/closing tag there is an empty line.
|
This text will get magically revealed. I can **still** use Markdown as long as there is an empty line between the opening/closing tags and my text.
|
||||||
|
|
||||||
</magic-reveal>
|
</magic-reveal>
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -2,29 +2,29 @@
|
|||||||
|
|
||||||
A few things are usually needed before going live "for real".
|
A few things are usually needed before going live "for real".
|
||||||
|
|
||||||
## Add a not found page
|
## Add a Not Found Page
|
||||||
|
|
||||||
When a user enters a url that does not exists then a "famous" 404 page not found error occures.
|
When a user enters a URL that does not exist, a "famous" 404 Page Not Found error occurs.
|
||||||
Many servers are configured to handle this automatically and to serve a 404.html page instead.
|
Many servers are configured to handle this automatically and to serve a 404.html page instead.
|
||||||
|
|
||||||
The [Rocket Lauch Preset](../../docs/presets/launch.md) ships a default 404 template you can use.
|
The [Rocket Launch preset](../../docs/presets/launch.md) ships a default 404 template you can use.
|
||||||
|
|
||||||
To enable it you need to creating a 404.md and use the 404 layout.
|
To enable it, you need to create a 404.md and use the 404 layout.
|
||||||
|
|
||||||
👉 `docs/404.md`
|
👉 `docs/404.md`
|
||||||
|
|
||||||
```
|
```
|
||||||
---
|
---
|
||||||
layout: 404.njk
|
layout: layout-404
|
||||||
permalink: 404.html
|
permalink: 404.html
|
||||||
---
|
---
|
||||||
```
|
```
|
||||||
|
|
||||||
## Add a sitemap
|
## Add a Sitemap
|
||||||
|
|
||||||
A sitemap can be used to inform search engines or services about the pages your site has.
|
A sitemap can be used to inform search engines or services about the pages your site has.
|
||||||
|
|
||||||
You can create one by adding this file
|
You can create one by adding this file:
|
||||||
|
|
||||||
👉 `docs/sitemap.njk`
|
👉 `docs/sitemap.njk`
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ You can create one by adding this file
|
|||||||
|
|
||||||
```
|
```
|
||||||
---
|
---
|
||||||
layout: pure-content.njk
|
layout: layout-raw
|
||||||
permalink: /sitemap.xml
|
permalink: /sitemap.xml
|
||||||
eleventyExcludeFromCollections: true
|
eleventyExcludeFromCollections: true
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -3,15 +3,15 @@
|
|||||||
Having a nice preview image for social media can be very helpful.
|
Having a nice preview image for social media can be very helpful.
|
||||||
For that reason Rocket creates those automatically with the title, parent title, section and your logo.
|
For that reason Rocket creates those automatically with the title, parent title, section and your logo.
|
||||||
|
|
||||||
It will look like this but with your logo
|
It will look like this but with your logo:
|
||||||
|
|
||||||
<img src="{{ socialMediaImage }}" width="1200" height="630" alt="Social Media Image of this page" style="border: 1px solid #000" />
|
<img src="{{ socialMediaImage }}" width="1200" height="630" alt="Social Media Image of this page" style="border: 1px solid #000" />
|
||||||
|
|
||||||
There are multiple ways you can modify it.
|
There are multiple ways you can modify it.
|
||||||
|
|
||||||
Note: If your logo has an `<?xml>` tag it will throw an error as it will be inlined into this svg and nested xml tags are not allowed.
|
Note: If your logo has an `<?xml>` tag it will throw an error as it will be inlined into this SVG and nested XML tags are not allowed.
|
||||||
|
|
||||||
## Setting it via frontMatter
|
## Setting it via Front Matter
|
||||||
|
|
||||||
You can create your own image and link it with something like this
|
You can create your own image and link it with something like this
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ socialMediaImage: path/to/my/image.png
|
|||||||
---
|
---
|
||||||
```
|
```
|
||||||
|
|
||||||
## Providing your own text
|
## Providing Your Own Text
|
||||||
|
|
||||||
Sometimes extracting the title + title of parent is not enough but you still want to use the "default image".
|
Sometimes extracting the title + title of parent is not enough but you still want to use the "default image".
|
||||||
|
|
||||||
@@ -47,10 +47,10 @@ module.exports = async function () {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
## Override the default image
|
## Override the Default Image
|
||||||
|
|
||||||
Often you want to have a unique style for your social media images.
|
Often you want to have a unique style for your social media images.
|
||||||
For that you can provide your own function which returns a string of an svg to render the image.
|
For that you can provide your own function which returns a string of an SVG to render the image.
|
||||||
|
|
||||||
👉 `rocket.config.mjs`
|
👉 `rocket.config.mjs`
|
||||||
|
|
||||||
@@ -100,9 +100,9 @@ const config = {
|
|||||||
export default config;
|
export default config;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Using an svg file as a src with nunjucks
|
## Using an SVG File as a src with Nunjucks
|
||||||
|
|
||||||
If you have multiple variations it may be easier to save them as svg files and using a template system
|
If you have multiple variations it may be easier to save them as SVG files and use a template system.
|
||||||
|
|
||||||
WARNING: Untested example
|
WARNING: Untested example
|
||||||
|
|
||||||
@@ -129,3 +129,25 @@ const config = {
|
|||||||
|
|
||||||
{% endraw %}
|
{% endraw %}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Enabling / Disabling
|
||||||
|
|
||||||
|
Generating images from SVG is quite fast but it can still add that's why by default during `rocket start` there will be no social media images created.
|
||||||
|
|
||||||
|
If you with so create them also during start you can
|
||||||
|
|
||||||
|
```js
|
||||||
|
const config = {
|
||||||
|
start: {
|
||||||
|
createSocialMediaImages: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Similarly, if you never want to create social media images even during build then you can globally disable it via
|
||||||
|
|
||||||
|
```js
|
||||||
|
const config = {
|
||||||
|
createSocialMediaImages: true,
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Presets >> Create your own || 90
|
# Presets >> Create your own || 90
|
||||||
|
|
||||||
A preset is setup function and a folder including `_assets`, `_data` and `_includes` (all optional).
|
A preset is a setup function and a folder including `_assets`, `_data` and `_includes` (all optional).
|
||||||
|
|
||||||
To play around with a preset you can create a folder `fire-theme`.
|
To play around with a preset you can create a folder `fire-theme`.
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ body {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Once you have that you can add it to your Rocket Config.
|
Once you have that you can add it to your Rocket config.
|
||||||
|
|
||||||
NOTE: The order of presets is important, as for example in this case we take everything from `rocketLaunch` but later override via `fireTheme`.
|
NOTE: The order of presets is important, as for example in this case we take everything from `rocketLaunch` but later override via `fireTheme`.
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ export default {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
## Publish a preset
|
## Publish a Preset
|
||||||
|
|
||||||
If you would like to publish a preset to use it on multiple websites or share it with your friends you can do like so.
|
If you would like to publish a preset to use it on multiple websites or share it with your friends you can do like so.
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,59 @@
|
|||||||
# Presets >> Using templates ||30
|
# Presets >> Using templates ||30
|
||||||
|
|
||||||
Most presetse have specific entry files you can override...
|
The template system allows for very granular control of how individual parts will be merged, overwritten, or reordered.
|
||||||
|
|
||||||
|
On top of the [Overriding](./overriding.md) you can do with the presets alone templates have another superpower and that is automatically joining of parts.
|
||||||
|
|
||||||
|
It is generally preferred to use `Joining Blocks` before overriding.
|
||||||
|
|
||||||
|
## Adding html to the html head
|
||||||
|
|
||||||
|
Often you will want to load some more fonts or an additional CSS file. You can do so by adding a file to the head Joining Block.
|
||||||
|
|
||||||
|
👉 `docs/_includes/_joiningBlocks/head/additional-styles.njk`
|
||||||
|
|
||||||
|
```html
|
||||||
|
<link rel="stylesheet" href="{{ '/_assets/additional-styles.css' | asset | url }}" />
|
||||||
|
```
|
||||||
|
|
||||||
|
This will add the html at the bottom of the head.
|
||||||
|
|
||||||
|
## Adding JavaScript to the bottom of the body
|
||||||
|
|
||||||
|
For executing a script you can use the `bottom` Joining Block.
|
||||||
|
|
||||||
|
👉 `docs/_includes/_joiningBlocks/bottom/my-script.njk`
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script>
|
||||||
|
console.log('hello world');
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
If you look into `docs/_merged_includes/_joiningBlocks/bottom/` you will see a few scripts
|
||||||
|
|
||||||
|
- `10-init-navigation.njk`
|
||||||
|
- `180-service-worker-update.njk`
|
||||||
|
- `190-google-analytics.njk`
|
||||||
|
- `my-script.njk`
|
||||||
|
|
||||||
|
## Controlling the order
|
||||||
|
|
||||||
|
In the html `<head>` order is usually not that important but when adding script it does.
|
||||||
|
|
||||||
|
If you look into the dom then you see that its order matches with the file system order.
|
||||||
|
|
||||||
|
Now if you want to move your script in-between `init-nagivation` and `service-worker-update` then you can rename your file to
|
||||||
|
|
||||||
|
👉 `docs/_includes/_joiningBlocks/bottom/20-my-script.njk`
|
||||||
|
|
||||||
|
which brings the order to
|
||||||
|
|
||||||
|
- `10-init-navigation.njk`
|
||||||
|
- `20-my-script.njk`
|
||||||
|
- `180-service-worker-update.njk`
|
||||||
|
- `190-google-analytics.njk`
|
||||||
|
|
||||||
|
## More information
|
||||||
|
|
||||||
|
For more details please see the [Joining Blocks Docs](../../docs/presets/joining-blocks.md)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: Rocket
|
title: Rocket
|
||||||
layout: home.njk
|
layout: layout-home-background
|
||||||
slogan: The modern web setup for static sites with a sprinkle of JavaScript.
|
slogan: The modern web setup for static sites with a sprinkle of JavaScript.
|
||||||
callToActionItems:
|
callToActionItems:
|
||||||
- text: Follow Guides
|
- text: Follow Guides
|
||||||
@@ -12,11 +12,11 @@ reasons:
|
|||||||
- header: Small
|
- header: Small
|
||||||
text: No overblown tools or frontend frameworks, add JavaScript and/or Web Components only on pages where needed.
|
text: No overblown tools or frontend frameworks, add JavaScript and/or Web Components only on pages where needed.
|
||||||
- header: Pre-Rendered
|
- header: Pre-Rendered
|
||||||
text: Statically generated content means less javascript to ship and process.
|
text: Statically generated content means less JavaScript to ship and process.
|
||||||
- header: Zero Configuration
|
- header: Zero Configuration
|
||||||
text: Automatic code splitting, filesystem based routing, and javascript in markdown.
|
text: Automatic code splitting, filesystem based routing, and JavaScript in Markdown.
|
||||||
- header: Meta Framework
|
- header: Meta Framework
|
||||||
text: 'Build on top of giants like <a href="https://www.11ty.dev/">eleventy</a>, <a href="https://rollupjs.org/">Rollup</a>, and <a href="https://www.modern-web.dev/">Modern Web</a>.'
|
text: 'Build on top of giants like <a href="https://www.11ty.dev/">Eleventy</a>, <a href="https://rollupjs.org/">Rollup</a>, and <a href="https://www.modern-web.dev/">Modern Web</a>.'
|
||||||
- header: Powerful Default Template
|
- header: Powerful Default Template
|
||||||
text: Provide content and you are ready to go.
|
text: Provide content and you are ready to go.
|
||||||
- header: Ready for Production
|
- header: Ready for Production
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
layout: pure-content.njk
|
layout: layout-raw
|
||||||
permalink: /sitemap.xml
|
permalink: /sitemap.xml
|
||||||
eleventyExcludeFromCollections: true
|
eleventyExcludeFromCollections: true
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
"release": "changeset publish && yarn format",
|
"release": "changeset publish && yarn format",
|
||||||
"rocket:build": "node packages/cli/src/cli.js build",
|
"rocket:build": "node packages/cli/src/cli.js build",
|
||||||
"search": "node packages/cli/src/cli.js search",
|
"search": "node packages/cli/src/cli.js search",
|
||||||
"setup": "npm run setup:ts-configs",
|
"setup": "npm run setup:ts-configs && npm run build:packages",
|
||||||
"setup:patches": "npx patch-package",
|
"setup:patches": "npx patch-package",
|
||||||
"setup:ts-configs": "node scripts/generate-ts-configs.mjs",
|
"setup:ts-configs": "node scripts/generate-ts-configs.mjs",
|
||||||
"start": "node packages/cli/src/cli.js start",
|
"start": "node packages/cli/src/cli.js start",
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
# @rocket/blog
|
# @rocket/blog
|
||||||
|
|
||||||
|
## 0.3.0
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- 8bdc326: Adopt to new layout system
|
||||||
|
|
||||||
|
BREAKING CHANGE:
|
||||||
|
|
||||||
|
- Renamed `blog` to `layout-blog-overview`
|
||||||
|
- Renamed `post` to `layout-blog-details`
|
||||||
|
|
||||||
## 0.2.0
|
## 0.2.0
|
||||||
|
|
||||||
### Minor Changes
|
### Minor Changes
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Blog Preset for Rocket
|
# Blog Preset for Rocket
|
||||||
|
|
||||||
Add blog posts to your rocket site.
|
Add blog posts to your Rocket site.
|
||||||
|
|
||||||
For docs please see our homepage [https://rocket.modern-web.dev/docs/presets/blog/](https://rocket.modern-web.dev/docs/presets/blog/).
|
For docs please see our homepage [https://rocket.modern-web.dev/docs/presets/blog/](https://rocket.modern-web.dev/docs/presets/blog/).
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@rocket/blog",
|
"name": "@rocket/blog",
|
||||||
"version": "0.2.0",
|
"version": "0.3.0",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
/** BLOG OVERVIEW **************************************************************************/
|
/** BLOG OVERVIEW **************************************************************************/
|
||||||
|
|
||||||
body[layout='blog-details'] rocket-navigation > ul > li.current::before {
|
body[layout='layout-blog-details'] rocket-navigation > ul > li.current::before {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
body[layout='blog-details'] #sidebar-nav li.anchor a:hover::before {
|
body[layout='layout-blog-details'] #sidebar-nav li.anchor a:hover::before {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,8 +48,7 @@ body[layout='blog-details'] #sidebar-nav li.anchor a:hover::before {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 1024px) {
|
@media screen and (min-width: 1024px) {
|
||||||
body[layout='blog-details'] #sidebar {
|
body[layout='layout-blog-details'] #sidebar {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{% if cover_image %}
|
||||||
|
<img src="{{ cover_image | url }}" alt="">
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{% include 'partials/_shared/blog-content-footer.njk' %}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{% include 'partials/_shared/logoLink.njk' %}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<rocket-navigation>
|
||||||
|
<ul>
|
||||||
|
<li class="current">
|
||||||
|
<h3>Headings</h3>
|
||||||
|
{{ collections[section] | rocketPageAnchors({ title: title }) | rocketNavToHtml({
|
||||||
|
listItemClass: "menu-item",
|
||||||
|
activeListItemClass: "current",
|
||||||
|
activeKey: eleventyNavigation.key
|
||||||
|
}) | safe }}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="sidebar-tags">
|
||||||
|
<h3>Date</h3>
|
||||||
|
<div>{{ page.date.toDateString() }}</div>
|
||||||
|
</div>
|
||||||
|
<div class="sidebar-tags">
|
||||||
|
<h3>Tags</h3>
|
||||||
|
<div class="tags">
|
||||||
|
{% for tag in tags %}
|
||||||
|
<span class="tag">{{tag}}</span>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% include 'partials/mobile-sidebar-bottom.njk' %}
|
||||||
|
</rocket-navigation>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<div class="articles">
|
||||||
|
{% for post in posts %}
|
||||||
|
{% if post.data.published %}
|
||||||
|
<article>
|
||||||
|
{% if post.data.cover_image %}
|
||||||
|
<a href="{{ post.url | url }}">
|
||||||
|
<img src="{{ post.data.cover_image | url }}" alt="">
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
<div class="content">
|
||||||
|
<h2>
|
||||||
|
<a href="{{ post.url | url }}">{{ post.data.title }}</a>
|
||||||
|
</h2>
|
||||||
|
<p>{{ post.data.description }}</p>
|
||||||
|
<a class="read" href="{{ post.url | url }}">...read more</a>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<link rel="stylesheet" href="{{ '/_assets/rocket-blog.css' | asset | url }}">
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
{% extends 'with-index.njk' %}
|
|
||||||
|
|
||||||
{% block headContent %}
|
|
||||||
{{ super() }}
|
|
||||||
<link rel="stylesheet" href="{{ '/_assets/blog.css' | asset | url }}">
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block bodyTag %}
|
|
||||||
<body layout="blog-details">
|
|
||||||
{% endblock bodyTag %}
|
|
||||||
|
|
||||||
{% block sidebar %}
|
|
||||||
<rocket-drawer id="sidebar">
|
|
||||||
<nav slot="content" id="sidebar-nav">
|
|
||||||
{% include 'partials/logoLink.njk' %}
|
|
||||||
<rocket-navigation>
|
|
||||||
<ul>
|
|
||||||
<li class="current">
|
|
||||||
<h3>Headings</h3>
|
|
||||||
{{ collections[section] | rocketPageAnchors({ title: title }) | rocketNavToHtml({
|
|
||||||
listItemClass: "menu-item",
|
|
||||||
activeListItemClass: "current",
|
|
||||||
activeKey: eleventyNavigation.key
|
|
||||||
}) | safe }}
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div class="sidebar-tags">
|
|
||||||
<h3>Date</h3>
|
|
||||||
<div>{{ page.date.toDateString() }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-tags">
|
|
||||||
<h3>Tags</h3>
|
|
||||||
<div class="tags">
|
|
||||||
{% for tag in tags %}
|
|
||||||
<span class="tag">{{tag}}</span>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% include 'partials/mobile-sidebar-bottom.njk' %}
|
|
||||||
</rocket-navigation>
|
|
||||||
</nav>
|
|
||||||
</rocket-drawer>
|
|
||||||
{% endblock sidebar %}
|
|
||||||
|
|
||||||
{% block main %}
|
|
||||||
<main class="markdown-body">
|
|
||||||
{% if cover_image %}
|
|
||||||
<img src="{{ cover_image | url }}" alt="">
|
|
||||||
{% endif %}
|
|
||||||
{% include 'partials/addTitleHeadline.njk' %}
|
|
||||||
|
|
||||||
{{ content | safe }}
|
|
||||||
|
|
||||||
{% include 'partials/previousNext.njk' %}
|
|
||||||
{% include 'partials/blog-content-footer.njk' %}
|
|
||||||
</main>
|
|
||||||
{% endblock main %}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
{% extends 'home.njk' %}
|
|
||||||
|
|
||||||
{% block headContent %}
|
|
||||||
{{ super() }}
|
|
||||||
<link rel="stylesheet" href="{{ '/_assets/blog.css' | asset | url }}">
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block bodyTag %}
|
|
||||||
<body layout="blog-overview">
|
|
||||||
{% endblock bodyTag %}
|
|
||||||
|
|
||||||
{% block main %}
|
|
||||||
<main class="markdown-body">
|
|
||||||
{% include 'partials/addTitleHeadline.njk' %}
|
|
||||||
{{ content | safe }}
|
|
||||||
<div class="articles">
|
|
||||||
{% for post in posts %}
|
|
||||||
{% if post.data.published %}
|
|
||||||
<article>
|
|
||||||
{% if post.data.cover_image %}
|
|
||||||
<a href="{{ post.url | url }}">
|
|
||||||
<img src="{{ post.data.cover_image | url }}" alt="">
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
<div class="content">
|
|
||||||
<h2>
|
|
||||||
<a href="{{ post.url | url }}">{{ post.data.title }}</a>
|
|
||||||
</h2>
|
|
||||||
<p>{{ post.data.description }}</p>
|
|
||||||
<a class="read" href="{{ post.url | url }}">...read more</a>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
{% endblock main %}
|
|
||||||
11
packages/blog/preset/_includes/layout-blog-details.njk
Normal file
11
packages/blog/preset/_includes/layout-blog-details.njk
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{% extends 'layout-sidebar.njk' %}
|
||||||
|
|
||||||
|
{% block sidebar %}
|
||||||
|
{% include 'partials/_layoutBlogDetails/sidebar.njk' %}
|
||||||
|
{% endblock sidebar %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<main class="markdown-body">
|
||||||
|
{% include 'partials/_layoutBlogDetails/content.njk' %}
|
||||||
|
</main>
|
||||||
|
{% endblock content %}
|
||||||
5
packages/blog/preset/_includes/layout-blog-overview.njk
Normal file
5
packages/blog/preset/_includes/layout-blog-overview.njk
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{% extends 'layout-home.njk' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% include 'partials/_layoutBlogOverview/content.njk' %}
|
||||||
|
{% endblock content %}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<main class="markdown-body">
|
||||||
|
{% for blockName, blockPath in _joiningBlocks._layoutBlogDetails.content %}
|
||||||
|
{% include blockPath %}
|
||||||
|
{% endfor %}
|
||||||
|
</main>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<rocket-drawer id="sidebar">
|
||||||
|
<nav slot="content" id="sidebar-nav">
|
||||||
|
{% for blockName, blockPath in _joiningBlocks._layoutBlogDetails.sidebar %}
|
||||||
|
{% include blockPath %}
|
||||||
|
{% endfor %}
|
||||||
|
</nav>
|
||||||
|
</rocket-drawer>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<main class="markdown-body">
|
||||||
|
{% for blockName, blockPath in _joiningBlocks._layoutBlogOverview.content %}
|
||||||
|
{% include blockPath %}
|
||||||
|
{% endfor %}
|
||||||
|
</main>
|
||||||
@@ -13,9 +13,6 @@ export function rocketBlog({ section = SECTION, postCollection = POST_COLLECTION
|
|||||||
|
|
||||||
const eleventyPluginRocketBlog = {
|
const eleventyPluginRocketBlog = {
|
||||||
configFunction: eleventyConfig => {
|
configFunction: eleventyConfig => {
|
||||||
eleventyConfig.addLayoutAlias('blog', 'blog-overview.njk');
|
|
||||||
eleventyConfig.addLayoutAlias('post', 'blog-details.njk');
|
|
||||||
|
|
||||||
eleventyConfig.addCollection('posts', collection => {
|
eleventyConfig.addCollection('posts', collection => {
|
||||||
/*
|
/*
|
||||||
// It's not working beacuse it's a paginated collection.
|
// It's not working beacuse it's a paginated collection.
|
||||||
@@ -41,7 +38,7 @@ export function rocketBlog({ section = SECTION, postCollection = POST_COLLECTION
|
|||||||
|
|
||||||
const posts = eleventyConfig.collections[section](collection);
|
const posts = eleventyConfig.collections[section](collection);
|
||||||
posts.forEach(page => {
|
posts.forEach(page => {
|
||||||
page.data.layout = 'post';
|
page.data.layout = 'layout-blog-details';
|
||||||
});
|
});
|
||||||
return posts;
|
return posts;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Building Rollup
|
# Building Rollup
|
||||||
|
|
||||||
Rollup configuration to help you get started building modern web applications.
|
Rollup configuration to help you get started building modern web applications.
|
||||||
You write modern javascript using the latest browser-features, rollup will optimize your code for production and ensure it runs on all supported browsers.
|
You write modern JavaScript using the latest browser features. Rollup will optimize your code for production and ensure it runs on all supported browsers.
|
||||||
|
|
||||||
For docs please see our homepage [https://rocket.modern-web.dev/docs/building/rollup-config/](https://rocket.modern-web.dev/docs/building/rollup-config/).
|
For docs please see our homepage [https://rocket.modern-web.dev/docs/building/rollup-config/](https://rocket.modern-web.dev/docs/building/rollup-config/).
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
import { LitElement, html, css } from 'lit-element';
|
import { LitElement, html, css } from 'lit-element';
|
||||||
import './demo-component.js';
|
import './demo-component.js';
|
||||||
|
|
||||||
// partial css trips up the minifier
|
// partial CSS trips up the minifier
|
||||||
const fontSize = css`
|
const fontSize = css`
|
||||||
16
|
16
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { LitElement, html, customElement } from 'lit-element';
|
import { LitElement, html, customElement } from 'lit-element';
|
||||||
|
|
||||||
const msg: string = 'Typescript demo works';
|
const msg: string = 'TypeScript demo works';
|
||||||
|
|
||||||
@customElement('demo-app')
|
@customElement('demo-app')
|
||||||
class DemoApp extends LitElement {
|
class DemoApp extends LitElement {
|
||||||
|
|||||||
@@ -59,13 +59,13 @@ describe('createMapConfig', () => {
|
|||||||
stripToBody: true,
|
stripToBody: true,
|
||||||
stripServiceWorker: true,
|
stripServiceWorker: true,
|
||||||
});
|
});
|
||||||
expect(indexHtml).to.equal('<h1>Only static html content in index.html</h1>');
|
expect(indexHtml).to.equal('<h1>Only static HTML content in index.html</h1>');
|
||||||
|
|
||||||
const subHtmlIndexHtml = await readOutput('sub-html/index.html', {
|
const subHtmlIndexHtml = await readOutput('sub-html/index.html', {
|
||||||
stripToBody: true,
|
stripToBody: true,
|
||||||
stripServiceWorker: true,
|
stripServiceWorker: true,
|
||||||
});
|
});
|
||||||
expect(subHtmlIndexHtml).to.equal('<h1>Only static html content in sub-html/index.html</h1>');
|
expect(subHtmlIndexHtml).to.equal('<h1>Only static HTML content in sub-html/index.html</h1>');
|
||||||
|
|
||||||
const subJsIndexHtml = await readOutput('sub-js/index.html', {
|
const subJsIndexHtml = await readOutput('sub-js/index.html', {
|
||||||
stripToBody: true,
|
stripToBody: true,
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
<h1>Only static html content in index.html</h1>
|
<h1>Only static HTML content in index.html</h1>
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
<h1>Only static html content in sub-html/index.html</h1>
|
<h1>Only static HTML content in sub-html/index.html</h1>
|
||||||
|
|||||||
@@ -1,5 +1,25 @@
|
|||||||
# check-html-links
|
# check-html-links
|
||||||
|
|
||||||
|
## 0.2.0
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- 750418b: Uses a class for the CLI and adding the following options:
|
||||||
|
|
||||||
|
- `--root-dir` the root directory to serve files from. Defaults to the current working directory
|
||||||
|
- `--ignore-link-pattern` do not check links matching the pattern
|
||||||
|
- `--continue-on-error` if present it will not exit with an error code - useful while writing or for temporary passing a ci
|
||||||
|
|
||||||
|
BREAKING CHANGE:
|
||||||
|
|
||||||
|
- Exists with an error code if a broken link is found
|
||||||
|
|
||||||
|
## 0.1.2
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- f343c50: When reading bigger files, especially bigger files with all content on one line it could mean a read chunk is in the middle of a character. This can lead to strange symbols in the resulting string. The `hightWaterMark` is now increased from the node default of 16KB to 256KB. Additionally, the `hightWaterMark` is now synced for reading and parsing.
|
||||||
|
|
||||||
## 0.1.1
|
## 0.1.1
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Check Html Links
|
# Check HTML Links
|
||||||
|
|
||||||
A fast checker for broken links/references in html.
|
A fast checker for broken links/references in HTML.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ For docs please see our homepage [https://rocket.modern-web.dev/docs/tools/check
|
|||||||
|
|
||||||
## Comparison
|
## Comparison
|
||||||
|
|
||||||
Checking the output of [11ty-website](https://github.com/11ty/11ty-website) with 13 missing reference targets (used by 516 links) while checking 501 files. (on January 17, 2021)
|
Checking the output of the [11ty-website](https://github.com/11ty/11ty-website) with 13 missing reference targets (used by 516 links) while checking 501 files. (on January 17, 2021)
|
||||||
|
|
||||||
| Tool | Lines printed | Times | Lang | Dependency Tree |
|
| Tool | Lines printed | Times | Lang | Dependency Tree |
|
||||||
| ---------------- | ------------- | ------ | ---- | --------------- |
|
| ---------------- | ------------- | ------ | ---- | --------------- |
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
export { validateFolder } from './src/validateFolder.js';
|
export { validateFolder } from './src/validateFolder.js';
|
||||||
export { formatErrors } from './src/formatErrors.js';
|
export { formatErrors } from './src/formatErrors.js';
|
||||||
|
export { CheckHtmlLinksCli } from './src/CheckHtmlLinksCli.js';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "check-html-links",
|
"name": "check-html-links",
|
||||||
"version": "0.1.1",
|
"version": "0.2.0",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
},
|
},
|
||||||
@@ -33,7 +33,9 @@
|
|||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chalk": "^4.0.0",
|
"chalk": "^4.0.0",
|
||||||
|
"command-line-args": "^5.1.1",
|
||||||
"glob": "^7.0.0",
|
"glob": "^7.0.0",
|
||||||
|
"minimatch": "^3.0.4",
|
||||||
"sax-wasm": "^2.0.0"
|
"sax-wasm": "^2.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
100
packages/check-html-links/src/CheckHtmlLinksCli.js
Normal file
100
packages/check-html-links/src/CheckHtmlLinksCli.js
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
||||||
|
|
||||||
|
/** @typedef {import('../types/main').CheckHtmlLinksCliOptions} CheckHtmlLinksCliOptions */
|
||||||
|
|
||||||
|
import path from 'path';
|
||||||
|
import chalk from 'chalk';
|
||||||
|
|
||||||
|
import commandLineArgs from 'command-line-args';
|
||||||
|
import { validateFiles } from './validateFolder.js';
|
||||||
|
import { formatErrors } from './formatErrors.js';
|
||||||
|
import { listFiles } from './listFiles.js';
|
||||||
|
|
||||||
|
export class CheckHtmlLinksCli {
|
||||||
|
/** @type {CheckHtmlLinksCliOptions} */
|
||||||
|
options;
|
||||||
|
|
||||||
|
constructor({ argv } = { argv: undefined }) {
|
||||||
|
const mainDefinitions = [
|
||||||
|
{ name: 'ignore-link-pattern', type: String, multiple: true },
|
||||||
|
{ name: 'root-dir', type: String, defaultOption: true },
|
||||||
|
{ name: 'continue-on-error', type: Boolean, defaultOption: false },
|
||||||
|
];
|
||||||
|
const options = commandLineArgs(mainDefinitions, {
|
||||||
|
stopAtFirstUnknown: true,
|
||||||
|
argv,
|
||||||
|
});
|
||||||
|
this.options = {
|
||||||
|
printOnError: true,
|
||||||
|
continueOnError: options['continue-on-error'],
|
||||||
|
rootDir: options['root-dir'],
|
||||||
|
ignoreLinkPatterns: options['ignore-link-pattern'],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Partial<CheckHtmlLinksCliOptions>} newOptions
|
||||||
|
*/
|
||||||
|
setOptions(newOptions) {
|
||||||
|
this.options = {
|
||||||
|
...this.options,
|
||||||
|
...newOptions,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async run() {
|
||||||
|
const { ignoreLinkPatterns, rootDir: userRootDir } = this.options;
|
||||||
|
const rootDir = userRootDir ? path.resolve(userRootDir) : process.cwd();
|
||||||
|
const performanceStart = process.hrtime();
|
||||||
|
|
||||||
|
console.log('👀 Checking if all internal links work...');
|
||||||
|
const files = await listFiles('**/*.html', rootDir);
|
||||||
|
|
||||||
|
const filesOutput =
|
||||||
|
files.length == 0
|
||||||
|
? '🧐 No files to check. Did you select the correct folder?'
|
||||||
|
: `🔥 Found a total of ${chalk.green.bold(files.length)} files to check!`;
|
||||||
|
console.log(filesOutput);
|
||||||
|
|
||||||
|
const { errors, numberLinks } = await validateFiles(files, rootDir, { ignoreLinkPatterns });
|
||||||
|
|
||||||
|
console.log(`🔗 Found a total of ${chalk.green.bold(numberLinks)} links to validate!\n`);
|
||||||
|
|
||||||
|
const performance = process.hrtime(performanceStart);
|
||||||
|
/** @type {string[]} */
|
||||||
|
let output = [];
|
||||||
|
let message = '';
|
||||||
|
if (errors.length > 0) {
|
||||||
|
let referenceCount = 0;
|
||||||
|
for (const error of errors) {
|
||||||
|
referenceCount += error.usage.length;
|
||||||
|
}
|
||||||
|
output = [
|
||||||
|
`❌ Found ${chalk.red.bold(
|
||||||
|
errors.length.toString(),
|
||||||
|
)} missing reference targets (used by ${referenceCount} links) while checking ${
|
||||||
|
files.length
|
||||||
|
} files:`,
|
||||||
|
...formatErrors(errors)
|
||||||
|
.split('\n')
|
||||||
|
.map(line => ` ${line}`),
|
||||||
|
`Checking links duration: ${performance[0]}s ${performance[1] / 1000000}ms`,
|
||||||
|
];
|
||||||
|
message = output.join('\n');
|
||||||
|
if (this.options.printOnError === true) {
|
||||||
|
console.error(message);
|
||||||
|
}
|
||||||
|
if (this.options.continueOnError === false) {
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log(
|
||||||
|
`✅ All internal links are valid. (executed in ${performance[0]}s ${
|
||||||
|
performance[1] / 1000000
|
||||||
|
}ms)`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return { errors, message };
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,55 +1,6 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
import path from 'path';
|
import { CheckHtmlLinksCli } from './CheckHtmlLinksCli.js';
|
||||||
import chalk from 'chalk';
|
|
||||||
import { validateFiles } from './validateFolder.js';
|
|
||||||
import { formatErrors } from './formatErrors.js';
|
|
||||||
import { listFiles } from './listFiles.js';
|
|
||||||
|
|
||||||
async function main() {
|
const cli = new CheckHtmlLinksCli();
|
||||||
const userRootDir = process.argv[2];
|
cli.run();
|
||||||
const rootDir = userRootDir ? path.resolve(userRootDir) : process.cwd();
|
|
||||||
const performanceStart = process.hrtime();
|
|
||||||
|
|
||||||
console.log('👀 Checking if all internal links work...');
|
|
||||||
const files = await listFiles('**/*.html', rootDir);
|
|
||||||
|
|
||||||
const filesOutput =
|
|
||||||
files.length == 0
|
|
||||||
? '🧐 No files to check. Did you select the correct folder?'
|
|
||||||
: `🔥 Found a total of ${chalk.green.bold(files.length)} files to check!`;
|
|
||||||
console.log(filesOutput);
|
|
||||||
|
|
||||||
const { errors, numberLinks } = await validateFiles(files, rootDir);
|
|
||||||
|
|
||||||
console.log(`🔗 Found a total of ${chalk.green.bold(numberLinks)} links to validate!\n`);
|
|
||||||
|
|
||||||
const performance = process.hrtime(performanceStart);
|
|
||||||
if (errors.length > 0) {
|
|
||||||
let referenceCount = 0;
|
|
||||||
for (const error of errors) {
|
|
||||||
referenceCount += error.usage.length;
|
|
||||||
}
|
|
||||||
const output = [
|
|
||||||
`❌ Found ${chalk.red.bold(
|
|
||||||
errors.length.toString(),
|
|
||||||
)} missing reference targets (used by ${referenceCount} links) while checking ${
|
|
||||||
files.length
|
|
||||||
} files:`,
|
|
||||||
...formatErrors(errors)
|
|
||||||
.split('\n')
|
|
||||||
.map(line => ` ${line}`),
|
|
||||||
`Checking links duration: ${performance[0]}s ${performance[1] / 1000000}ms`,
|
|
||||||
];
|
|
||||||
console.error(output.join('\n'));
|
|
||||||
process.exit(1);
|
|
||||||
} else {
|
|
||||||
console.log(
|
|
||||||
`✅ All internal links are valid. (executed in %ds %dms)`,
|
|
||||||
performance[0],
|
|
||||||
performance[1] / 1000000,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import saxWasm from 'sax-wasm';
|
import saxWasm from 'sax-wasm';
|
||||||
|
import minimatch from 'minimatch';
|
||||||
import { createRequire } from 'module';
|
import { createRequire } from 'module';
|
||||||
|
|
||||||
import { listFiles } from './listFiles.js';
|
import { listFiles } from './listFiles.js';
|
||||||
@@ -10,15 +11,18 @@ import path from 'path';
|
|||||||
/** @typedef {import('../types/main').LocalFile} LocalFile */
|
/** @typedef {import('../types/main').LocalFile} LocalFile */
|
||||||
/** @typedef {import('../types/main').Usage} Usage */
|
/** @typedef {import('../types/main').Usage} Usage */
|
||||||
/** @typedef {import('../types/main').Error} Error */
|
/** @typedef {import('../types/main').Error} Error */
|
||||||
|
/** @typedef {import('../types/main').Options} Options */
|
||||||
/** @typedef {import('sax-wasm').Attribute} Attribute */
|
/** @typedef {import('sax-wasm').Attribute} Attribute */
|
||||||
|
|
||||||
const require = createRequire(import.meta.url);
|
const require = createRequire(import.meta.url);
|
||||||
const { SaxEventType, SAXParser } = saxWasm;
|
const { SaxEventType, SAXParser } = saxWasm;
|
||||||
|
|
||||||
|
const streamOptions = { highWaterMark: 256 * 1024 };
|
||||||
|
|
||||||
const saxPath = require.resolve('sax-wasm/lib/sax-wasm.wasm');
|
const saxPath = require.resolve('sax-wasm/lib/sax-wasm.wasm');
|
||||||
const saxWasmBuffer = fs.readFileSync(saxPath);
|
const saxWasmBuffer = fs.readFileSync(saxPath);
|
||||||
const parserReferences = new SAXParser(SaxEventType.Attribute);
|
const parserReferences = new SAXParser(SaxEventType.Attribute, streamOptions);
|
||||||
const parserIds = new SAXParser(SaxEventType.Attribute /*, { highWaterMark: 256 * 1024 } */);
|
const parserIds = new SAXParser(SaxEventType.Attribute, streamOptions);
|
||||||
|
|
||||||
/** @type {Error[]} */
|
/** @type {Error[]} */
|
||||||
let checkLocalFiles = [];
|
let checkLocalFiles = [];
|
||||||
@@ -76,7 +80,7 @@ function extractReferences(htmlFilePath) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
const readable = fs.createReadStream(htmlFilePath);
|
const readable = fs.createReadStream(htmlFilePath, streamOptions);
|
||||||
readable.on('data', chunk => {
|
readable.on('data', chunk => {
|
||||||
// @ts-expect-error
|
// @ts-expect-error
|
||||||
parserReferences.write(chunk);
|
parserReferences.write(chunk);
|
||||||
@@ -112,7 +116,7 @@ function idExists(filePath, id) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
const readable = fs.createReadStream(filePath);
|
const readable = fs.createReadStream(filePath, streamOptions);
|
||||||
readable.on('data', chunk => {
|
readable.on('data', chunk => {
|
||||||
// @ts-expect-error
|
// @ts-expect-error
|
||||||
parserIds.write(chunk);
|
parserIds.write(chunk);
|
||||||
@@ -183,8 +187,9 @@ function getValueAndAnchor(inValue) {
|
|||||||
* @param {object} options
|
* @param {object} options
|
||||||
* @param {string} options.htmlFilePath
|
* @param {string} options.htmlFilePath
|
||||||
* @param {string} options.rootDir
|
* @param {string} options.rootDir
|
||||||
|
* @param {function(string): boolean} options.ignoreUsage
|
||||||
*/
|
*/
|
||||||
async function resolveLinks(links, { htmlFilePath, rootDir }) {
|
async function resolveLinks(links, { htmlFilePath, rootDir, ignoreUsage }) {
|
||||||
for (const hrefObj of links) {
|
for (const hrefObj of links) {
|
||||||
const { value, anchor } = getValueAndAnchor(hrefObj.value);
|
const { value, anchor } = getValueAndAnchor(hrefObj.value);
|
||||||
|
|
||||||
@@ -199,7 +204,9 @@ async function resolveLinks(links, { htmlFilePath, rootDir }) {
|
|||||||
|
|
||||||
let valueFile = value.endsWith('/') ? path.join(value, 'index.html') : value;
|
let valueFile = value.endsWith('/') ? path.join(value, 'index.html') : value;
|
||||||
|
|
||||||
if (value.includes('mailto:')) {
|
if (ignoreUsage(value)) {
|
||||||
|
// ignore
|
||||||
|
} else if (value.includes('mailto:')) {
|
||||||
// ignore for now - could add a check to validate if the email address is valid
|
// ignore for now - could add a check to validate if the email address is valid
|
||||||
} else if (valueFile === '' && anchor !== '') {
|
} else if (valueFile === '' && anchor !== '') {
|
||||||
addLocalFile(htmlFilePath, anchor, usageObj);
|
addLocalFile(htmlFilePath, anchor, usageObj);
|
||||||
@@ -259,8 +266,9 @@ async function validateLocalFiles(checkLocalFiles) {
|
|||||||
/**
|
/**
|
||||||
* @param {string[]} files
|
* @param {string[]} files
|
||||||
* @param {string} rootDir
|
* @param {string} rootDir
|
||||||
|
* @param {Options} opts?
|
||||||
*/
|
*/
|
||||||
export async function validateFiles(files, rootDir) {
|
export async function validateFiles(files, rootDir, opts) {
|
||||||
await parserReferences.prepareWasm(saxWasmBuffer);
|
await parserReferences.prepareWasm(saxWasmBuffer);
|
||||||
await parserIds.prepareWasm(saxWasmBuffer);
|
await parserIds.prepareWasm(saxWasmBuffer);
|
||||||
|
|
||||||
@@ -268,10 +276,20 @@ export async function validateFiles(files, rootDir) {
|
|||||||
checkLocalFiles = [];
|
checkLocalFiles = [];
|
||||||
idCache = new Map();
|
idCache = new Map();
|
||||||
let numberLinks = 0;
|
let numberLinks = 0;
|
||||||
|
|
||||||
|
const ignoreLinkPatternRegExps = opts
|
||||||
|
? opts.ignoreLinkPatterns?.map(pattern => minimatch.makeRe(pattern))
|
||||||
|
: null;
|
||||||
|
|
||||||
|
/** @type {function(string): boolean} */
|
||||||
|
const ignoreUsage = ignoreLinkPatternRegExps
|
||||||
|
? usage => !!ignoreLinkPatternRegExps.find(regExp => usage.match(regExp))
|
||||||
|
: () => false;
|
||||||
|
|
||||||
for (const htmlFilePath of files) {
|
for (const htmlFilePath of files) {
|
||||||
const { links } = await extractReferences(htmlFilePath);
|
const { links } = await extractReferences(htmlFilePath);
|
||||||
numberLinks += links.length;
|
numberLinks += links.length;
|
||||||
await resolveLinks(links, { htmlFilePath, rootDir });
|
await resolveLinks(links, { htmlFilePath, rootDir, ignoreUsage });
|
||||||
}
|
}
|
||||||
await validateLocalFiles(checkLocalFiles);
|
await validateLocalFiles(checkLocalFiles);
|
||||||
|
|
||||||
@@ -280,10 +298,11 @@ export async function validateFiles(files, rootDir) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} inRootDir
|
* @param {string} inRootDir
|
||||||
|
* @param {Options} opts?
|
||||||
*/
|
*/
|
||||||
export async function validateFolder(inRootDir) {
|
export async function validateFolder(inRootDir, opts) {
|
||||||
const rootDir = path.resolve(inRootDir);
|
const rootDir = path.resolve(inRootDir);
|
||||||
const files = await listFiles('**/*.html', rootDir);
|
const files = await listFiles('**/*.html', rootDir);
|
||||||
const { errors } = await validateFiles(files, rootDir);
|
const { errors } = await validateFiles(files, rootDir, opts);
|
||||||
return errors;
|
return errors;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<!-- ignore known subsystems -->
|
||||||
|
<a href="/docs/"></a>
|
||||||
|
<a href="/developer/getting-started.html#js"></a>
|
||||||
|
<a href="/developer/language-guides/"></a>
|
||||||
|
<a href="/developer/javascript.html"></a>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<a href="/absolute/index.html"></a>
|
||||||
|
<a href="./relative/index.html"></a>
|
||||||
|
<a href="./relative/subfolder/index.html"></a>
|
||||||
|
|
||||||
|
<!-- valid -->
|
||||||
|
<a href="./page.html"></a>
|
||||||
|
<a href=" ./page.html "></a>
|
||||||
|
<a href=" /page.html "></a>
|
||||||
@@ -5,9 +5,9 @@ import { validateFolder } from 'check-html-links';
|
|||||||
|
|
||||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||||
|
|
||||||
export async function execute(inPath) {
|
export async function execute(inPath, opts) {
|
||||||
const testDir = path.join(__dirname, inPath.split('/').join(path.sep));
|
const testDir = path.join(__dirname, inPath.split('/').join(path.sep));
|
||||||
const errors = await validateFolder(testDir);
|
const errors = await validateFolder(testDir, opts);
|
||||||
return {
|
return {
|
||||||
cleanup: items => {
|
cleanup: items => {
|
||||||
const newItems = [];
|
const newItems = [];
|
||||||
|
|||||||
@@ -183,6 +183,28 @@ describe('validateFolder', () => {
|
|||||||
expect(cleanup(errors)).to.deep.equal([]);
|
expect(cleanup(errors)).to.deep.equal([]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('ignoring a folder', async () => {
|
||||||
|
const { errors, cleanup } = await execute('fixtures/internal-link-ignore', {
|
||||||
|
ignoreLinkPatterns: ['./relative/*', './relative/**/*'],
|
||||||
|
});
|
||||||
|
expect(cleanup(errors)).to.deep.equal([
|
||||||
|
{
|
||||||
|
filePath: 'fixtures/internal-link-ignore/absolute/index.html',
|
||||||
|
onlyAnchorMissing: false,
|
||||||
|
usage: [
|
||||||
|
{
|
||||||
|
anchor: '',
|
||||||
|
attribute: 'href',
|
||||||
|
character: 9,
|
||||||
|
file: 'fixtures/internal-link-ignore/index.html',
|
||||||
|
line: 0,
|
||||||
|
value: '/absolute/index.html',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
it('can handle img src', async () => {
|
it('can handle img src', async () => {
|
||||||
const { errors, cleanup } = await execute('fixtures/internal-images');
|
const { errors, cleanup } = await execute('fixtures/internal-images');
|
||||||
expect(cleanup(errors)).to.deep.equal([
|
expect(cleanup(errors)).to.deep.equal([
|
||||||
|
|||||||
11
packages/check-html-links/types/main.d.ts
vendored
11
packages/check-html-links/types/main.d.ts
vendored
@@ -25,3 +25,14 @@ export interface Error {
|
|||||||
onlyAnchorMissing: boolean;
|
onlyAnchorMissing: boolean;
|
||||||
usage: Usage[];
|
usage: Usage[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface Options {
|
||||||
|
ignoreLinkPatterns: string[] | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CheckHtmlLinksCliOptions {
|
||||||
|
printOnError: boolean;
|
||||||
|
rootDir: string;
|
||||||
|
ignoreLinkPatterns: string[] | null;
|
||||||
|
continueOnError: boolean;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,49 @@
|
|||||||
# @rocket/cli
|
# @rocket/cli
|
||||||
|
|
||||||
|
## 0.5.2
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- 8e095b7: Watching `_assets`, `_data`, `_includes` for changes to trigger updated automatically
|
||||||
|
|
||||||
|
## 0.5.1
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- f44a0f4: Rewrite dynamic imports with "`"
|
||||||
|
- 74f7ddf: Adds performance improvements for social media images by:
|
||||||
|
- creating social media images only in `rocket build` phase
|
||||||
|
- adds a config `createSocialMediaImages` to enable (default) or disable it globally
|
||||||
|
- adds config `start.createSocialMediaImages` to enable or disable (default) it during `rocket start`
|
||||||
|
- 750418b: Use class-based node API of check-html-links
|
||||||
|
- Updated dependencies [f44a0f4]
|
||||||
|
- Updated dependencies [750418b]
|
||||||
|
- @rocket/eleventy-plugin-mdjs-unified@0.3.1
|
||||||
|
- check-html-links@0.2.0
|
||||||
|
|
||||||
|
## 0.5.0
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- 8bdc326: Adds html to core presets with the following Layouts:
|
||||||
|
|
||||||
|
- `layout-raw` No html or any wrapping (use it for xml, json, ... outputs)
|
||||||
|
- `layout-default` For content
|
||||||
|
- `layout-index` Extends content and adds an "Open Navigation" button for mobile
|
||||||
|
|
||||||
|
Layout Default has the following Joining Blocks:
|
||||||
|
|
||||||
|
- `head` For the html `<head>`
|
||||||
|
- `header` Within the top `<header>`
|
||||||
|
- `content` Html within the main content section
|
||||||
|
- `footer` Within to bottom `<footer>`
|
||||||
|
- `bottom` Add the end of the body
|
||||||
|
|
||||||
|
BREAKING CHANGES:
|
||||||
|
|
||||||
|
- `layout` renamed to `layout-default`
|
||||||
|
- Automatically sets `layout-index` for all `index.md` files
|
||||||
|
|
||||||
## 0.4.1
|
## 0.4.1
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Rocket Cli
|
# Rocket CLI
|
||||||
|
|
||||||
Execute Rocket within you CLI
|
Execute Rocket within your CLI.
|
||||||
|
|
||||||
For docs please see our homepage [https://rocket.modern-web.dev/](https://rocket.modern-web.dev/).
|
For docs please see our homepage [https://rocket.modern-web.dev/](https://rocket.modern-web.dev/).
|
||||||
|
|||||||
@@ -13,21 +13,21 @@ Users should at least be able to get a high level understanding of what they are
|
|||||||
On the web, we have many many different ways of writing documentation.
|
On the web, we have many many different ways of writing documentation.
|
||||||
However, one thing almost all of them have in common is that they rely on [Markdown](https://en.wikipedia.org/wiki/Markdown) or some kind of variation of it.
|
However, one thing almost all of them have in common is that they rely on [Markdown](https://en.wikipedia.org/wiki/Markdown) or some kind of variation of it.
|
||||||
|
|
||||||
And it's no surprise, because Markdown is supported practically everywhere (vscode, atom, github, gitlab, dev.to, npmjs, ...)
|
And it's no surprise, because Markdown is supported practically everywhere (VS Code, Atom, GitHub, GitLab, dev.to, npmjs, ...)
|
||||||
|
|
||||||
## For tools that do not run in the browser
|
## For Tools that Do Not Run in the Browser
|
||||||
|
|
||||||
In this case, you will mostly share code snippets that people will need to run in their own projects in which case traditional static site generators like [Docusaurus](https://docusaurus.io/), [VuePress](https://vuepress.vuejs.org/), [Gatsby](https://www.gatsbyjs.org/), et al work great. All of them have full support for Markdown and allow you to easily create beautiful documentation pages with code snippets/highlighting, and more.
|
In this case, you will mostly share code snippets that people will need to run in their own projects in which case traditional static site generators like [Docusaurus](https://docusaurus.io/), [VuePress](https://vuepress.vuejs.org/), [Gatsby](https://www.gatsbyjs.org/), et al work great. All of them have full support for Markdown and allow you to easily create beautiful documentation pages with code snippets/highlighting, and more.
|
||||||
|
|
||||||
And frankly, if that is your use case almost everything you need should be possible with those tools as long as you feel comfortable with the ecosystem/framework.
|
And frankly, if that is your use case almost everything you need should be possible with those tools as long as you feel comfortable with the ecosystem/framework.
|
||||||
|
|
||||||
## For (visual) components that do run in the browser
|
## For (Visual) Components that Do Run in the Browser
|
||||||
|
|
||||||
In this context, users probably do expect a live demo to see all the different options of your component in action. So pure Markdown is usually not enough as we now want to actually execute code and "insert" our working component in our documentation somehow. This would require specialized handling for each framework.
|
In this context, users probably do expect a live demo to see all the different options of your component in action. So pure Markdown is usually not enough as we now want to actually execute code and "insert" our working component in our documentation somehow. This would require specialized handling for each framework.
|
||||||
|
|
||||||
### Vue
|
### Vue
|
||||||
|
|
||||||
For Vue, as an example, you can use VuePress which auto registers all Vue components in a certain folder and then you can use as normal html tags since Markdown supports html
|
For Vue, as an example, you can use VuePress which auto registers all Vue components in a certain folder and then you can use as normal HTML tags since Markdown supports HTML
|
||||||
|
|
||||||
```
|
```
|
||||||
.
|
.
|
||||||
@@ -40,17 +40,17 @@ For Vue, as an example, you can use VuePress which auto registers all Vue compon
|
|||||||
<demo-1 />
|
<demo-1 />
|
||||||
```
|
```
|
||||||
|
|
||||||
- supports vue components and has "magical" import for them
|
- supports Vue components and has "magical" import for them
|
||||||
- no support for generic javascript or passing properties to components
|
- no support for generic JavaScript or passing properties to components
|
||||||
|
|
||||||
### React
|
### React
|
||||||
|
|
||||||
For React you can use [Mdx](https://mdxjs.com/) which extends Markdown with JSX support. Mdx is available via multiple tools like [Gatsby](https://www.gatsbyjs.org/), [docz](https://www.docz.site/), [storybook](https://storybook.js.org/), etc.
|
For React you can use [MDX](https://mdxjs.com/) which extends Markdown with JSX support. MDX is available via multiple tools like [Gatsby](https://www.gatsbyjs.org/), [docz](https://www.docz.site/), [storybook](https://storybook.js.org/), etc.
|
||||||
|
|
||||||
```md
|
```md
|
||||||
import { Chart } from '../components/chart'
|
import { Chart } from '../components/chart'
|
||||||
|
|
||||||
# Here’s a chart
|
# Here’s a Chart
|
||||||
|
|
||||||
The chart is rendered inside our MDX document.
|
The chart is rendered inside our MDX document.
|
||||||
<Chart />
|
<Chart />
|
||||||
@@ -58,7 +58,7 @@ The chart is rendered inside our MDX document.
|
|||||||
|
|
||||||
- supports import/export JavaScript
|
- supports import/export JavaScript
|
||||||
- passes everything through JSX
|
- passes everything through JSX
|
||||||
- Doesn't look _great_ on github, requires special tools in editors to get highlighting
|
- doesn't look _great_ on GitHub, requires special tools in editors to get highlighting
|
||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
|
|
||||||
@@ -71,7 +71,7 @@ The primary goals are
|
|||||||
|
|
||||||
- minimal complexity
|
- minimal complexity
|
||||||
- follows progressive enhancement
|
- follows progressive enhancement
|
||||||
- stick close to valid markdown syntax
|
- stick close to valid Markdown syntax
|
||||||
- code highlighting in editors without additional tools
|
- code highlighting in editors without additional tools
|
||||||
- looks good on github/gitlab/any source code management tool
|
- looks good on github/gitlab/any source code management tool
|
||||||
|
|
||||||
@@ -91,8 +91,8 @@ Alright, enough talk, you can see it live here:
|
|||||||
|
|
||||||
**How does it work**
|
**How does it work**
|
||||||
|
|
||||||
Mdjs hooks into [remark](https://remark.js.org/) and extracts all those tagged js blocks.
|
mdjs hooks into [remark](https://remark.js.org/) and extracts all those tagged JavaScript blocks.
|
||||||
In the end, html and js is separately available.
|
In the end, HTML and JS are separately available.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
@@ -105,9 +105,9 @@ It can then be combined/processed by any tool to create an actual documentation
|
|||||||
|
|
||||||
The process looks like this:
|
The process looks like this:
|
||||||
|
|
||||||
1. Extract `js script` and separate it from md
|
1. Extract `js script` and separate it from Markdown
|
||||||
2. Render md
|
2. Render Markdown
|
||||||
3. Provide html & js
|
3. Provide HTML & JS
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -115,11 +115,11 @@ The process looks like this:
|
|||||||
|
|
||||||
This already is powerful enough to directly include JavaScript and render web components with attributes.
|
This already is powerful enough to directly include JavaScript and render web components with attributes.
|
||||||
|
|
||||||
## Enhancing mdjs with demo format
|
## Enhancing mdjs with Demo Format
|
||||||
|
|
||||||
Now that we can execute JavaScript within our Markdown this opens the door for more advanced features.
|
Now that we can execute JavaScript within our Markdown this opens the door for more advanced features.
|
||||||
|
|
||||||
Our first step is to create another enhanced js code block, namely; `js story`.
|
Our first step is to create another enhanced JS code block, namely; `js story`.
|
||||||
From this code block you can export a function to be executed on demand:
|
From this code block you can export a function to be executed on demand:
|
||||||
|
|
||||||
```js script
|
```js script
|
||||||
@@ -150,13 +150,13 @@ Under the hood, this adds an extra step to the processing:
|
|||||||
|
|
||||||
1. Extract `js script` and separate from md
|
1. Extract `js script` and separate from md
|
||||||
2. Extract `js story` and `js preview-story` and separate from md
|
2. Extract `js story` and `js preview-story` and separate from md
|
||||||
3. Put a placeholder `<mdjs-story mdjs-story-name="demo"></mdjs-story>` or `mdjs-preview` at it's place
|
3. Put a placeholder `<mdjs-story mdjs-story-name="demo"></mdjs-story>` or `mdjs-preview` at its place
|
||||||
4. Render markdown
|
4. Render Markdown
|
||||||
5. Provide html, javascript, and stories
|
5. Provide HTML, JavaScript, and stories
|
||||||
|
|
||||||
This is all the information we need to create full javascript and demo capable pages purely from markdown.
|
This is all the information we need to create full JavaScript and demo capable pages purely from Markdown.
|
||||||
|
|
||||||
By default Mdjs takes it a small step further by supporting an actual template system - namely [lit-html](https://lit-html.polymer-project.org/).
|
By default mdjs takes it a small step further by supporting an actual template system - namely [lit-html](https://lit-html.polymer-project.org/).
|
||||||
|
|
||||||
```js script
|
```js script
|
||||||
import './demo-wc-card.js';
|
import './demo-wc-card.js';
|
||||||
@@ -177,7 +177,7 @@ Here another playground mimicking a full documentation page.
|
|||||||
|
|
||||||
[==> Link to editable demo <==](https://webcomponents.dev/edit/PqrQkg3abvFJ7vxyZuqa?pm=1&sv=1)
|
[==> Link to editable demo <==](https://webcomponents.dev/edit/PqrQkg3abvFJ7vxyZuqa?pm=1&sv=1)
|
||||||
|
|
||||||
## mdjs default docs page
|
## mdjs Default Docs Page
|
||||||
|
|
||||||
Once all this meta-information is available you can render a specific docs page.
|
Once all this meta-information is available you can render a specific docs page.
|
||||||
|
|
||||||
@@ -194,11 +194,11 @@ for (const story of stories) {
|
|||||||
|
|
||||||
All of this happens under the hood for you 🤗
|
All of this happens under the hood for you 🤗
|
||||||
|
|
||||||
## Where can you use mdjs?
|
## Where Can You Use mdjs?
|
||||||
|
|
||||||
### You can use it locally via es-dev-server
|
### Locally with ES Dev Server
|
||||||
|
|
||||||
Here i'll show you how you can create a github like markdown view for all your local markdown files including live demos.
|
Here I'll show you how you can create a GitHub-like Markdown view for all your local Markdown files including live demos.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -212,7 +212,7 @@ Here i'll show you how you can create a github like markdown view for all your l
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- Create a `es-dev-server.config.js` in the root of your repo.
|
- Create a `es-dev-server.config.js` in the root of your repository.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const { mdjsTransformer } = require('@mdjs/core');
|
const { mdjsTransformer } = require('@mdjs/core');
|
||||||
@@ -227,9 +227,9 @@ Here i'll show you how you can create a github like markdown view for all your l
|
|||||||
|
|
||||||
After executing `npm run start` you can happily browse your live documentation via [http://localhost:8000/README.md](http://localhost:8000/README.md).
|
After executing `npm run start` you can happily browse your live documentation via [http://localhost:8000/README.md](http://localhost:8000/README.md).
|
||||||
|
|
||||||
You can see an example setup in the [demo-wc-card repo](https://github.com/daKmoR/demo-wc-card).
|
You can see an example setup in the [demo-wc-card repository](https://github.com/daKmoR/demo-wc-card).
|
||||||
|
|
||||||
### You can use it via Storybook
|
### Storybook
|
||||||
|
|
||||||
If you want to work on individual components or get a list of all demos you can use Storybook.
|
If you want to work on individual components or get a list of all demos you can use Storybook.
|
||||||
|
|
||||||
@@ -245,7 +245,7 @@ If you want to work on individual components or get a list of all demos you can
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- Adjust your `.storybook/main.js` to load markdown files
|
- Adjust your `.storybook/main.js` to load Markdown files
|
||||||
|
|
||||||
```js
|
```js
|
||||||
module.exports = {
|
module.exports = {
|
||||||
@@ -258,7 +258,7 @@ If you want to work on individual components or get a list of all demos you can
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
- Add to every markdown file that should be in storybook a name via
|
- Add to every Markdown file that should be in storybook a name via
|
||||||
|
|
||||||
```js
|
```js
|
||||||
export default {
|
export default {
|
||||||
@@ -267,13 +267,13 @@ If you want to work on individual components or get a list of all demos you can
|
|||||||
```
|
```
|
||||||
|
|
||||||
And just like that, you are good to go.
|
And just like that, you are good to go.
|
||||||
No additional changes to any files are needed; a plugin will take care of everything by converting your markdown files to the support Storybook's mdx format.
|
No additional changes to any files are needed; a plugin will take care of everything by converting your Markdown files to the support Storybook's MDX format.
|
||||||
|
|
||||||
For more detailed information please see [https://open-wc.org/demoing-storybook/](https://open-wc.org/demoing-storybook/).
|
For more detailed information please see [https://open-wc.org/demoing-storybook/](https://open-wc.org/demoing-storybook/).
|
||||||
|
|
||||||
### Show it on github
|
### GitHub
|
||||||
|
|
||||||
Since Github supports markdown out of the box, we can take things even further by using Mdjs.
|
Since GitHub supports Markdown out of the box, we can take things even further by using mdjs.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -283,23 +283,23 @@ As it's not supported by github directly you will need a chrome extension called
|
|||||||
- Do you want to show a live example of the issue you are having? mdjs-viewer!
|
- Do you want to show a live example of the issue you are having? mdjs-viewer!
|
||||||
|
|
||||||
Almost looks like black magic, huh?
|
Almost looks like black magic, huh?
|
||||||
All you did was install a Chrome extension and suddenly Github got superpowers.
|
All you did was install a Chrome extension and suddenly GitHub got superpowers.
|
||||||
|
|
||||||
All that you need is to have some Markdown files with the correct code fence blocks, and have your code up and running on [unpkg.com](https://unpkg.com).
|
All that you need is to have some Markdown files with the correct code fence blocks, and have your code up and running on [unpkg.com](https://unpkg.com).
|
||||||
|
|
||||||
**How does it actually work?**
|
**How does it actually work?**
|
||||||
|
|
||||||
The extension detects which Github page you are on.
|
The extension detects which GitHub page you are on.
|
||||||
If it actually finds a markdown file or an issue with mdjs code then it adds a "show demo" button to activate it.
|
If it actually finds a Markdown file or an issue with mdjs code then it adds a "show demo" button to activate it.
|
||||||
Only if you click the button it will start gathering all the needed info.
|
Only if you click the button it will start gathering all the needed info.
|
||||||
|
|
||||||
- find the nearest `package.json`
|
- find the nearest `package.json`
|
||||||
- read the actual markdown file/issue content
|
- read the actual Markdown file/issue content
|
||||||
- replace all bare import with `unpkg.com` imports
|
- replace all bare import with `unpkg.com` imports
|
||||||
- replace all relative imports with `unpkg.com` and the name of the package.json + relative path for it
|
- replace all relative imports with `unpkg.com` and the name of the package.json + relative path for it
|
||||||
- create a secured iframe
|
- create a secured iframe
|
||||||
- position the iframe absolute as an overlays
|
- position the iframe absolute as an overlays
|
||||||
- put the javascript and html code inside the iframe
|
- put the JavaScript and HTML code inside the iframe
|
||||||
- the button becomes a toggle to show/hide the iframe
|
- the button becomes a toggle to show/hide the iframe
|
||||||
|
|
||||||
Some of the tasks are more complicated and require some extra work to make it secure but in essence, that's it.
|
Some of the tasks are more complicated and require some extra work to make it secure but in essence, that's it.
|
||||||
@@ -312,7 +312,7 @@ Especially as the readme and issue content still remain useful even without the
|
|||||||
|
|
||||||
For more detailed information please see [https://github.com/open-wc/mdjs-viewer](https://github.com/open-wc/mdjs-viewer).
|
For more detailed information please see [https://github.com/open-wc/mdjs-viewer](https://github.com/open-wc/mdjs-viewer).
|
||||||
|
|
||||||
### Supported on webcomponents.dev
|
### webcomponents.dev
|
||||||
|
|
||||||
Fully supported by this awesome online editor.
|
Fully supported by this awesome online editor.
|
||||||
|
|
||||||
@@ -330,7 +330,7 @@ All the demo links are actually from [webcomponents.dev](https://webcomponents.d
|
|||||||
|
|
||||||
Be sure to [check it out](https://webcomponents.dev/).
|
Be sure to [check it out](https://webcomponents.dev/).
|
||||||
|
|
||||||
## How you can add support for mdjs
|
## How You Can Add Support for mdjs
|
||||||
|
|
||||||
Please check the official documentation page at [https://open-wc.org/mdjs/](https://open-wc.org/mdjs/).
|
Please check the official documentation page at [https://open-wc.org/mdjs/](https://open-wc.org/mdjs/).
|
||||||
|
|
||||||
@@ -344,7 +344,7 @@ Now go out there and write good documentation for your components!
|
|||||||
|
|
||||||
## Future
|
## Future
|
||||||
|
|
||||||
- Have a separate github repo (potentially group as well).
|
- Have a separate GitHub repository (potentially group as well).
|
||||||
- Have a dedicated homepage
|
- Have a dedicated homepage
|
||||||
- The default story preview frame should look a little nicer
|
- The default story preview frame should look a little nicer
|
||||||
- Support multiple renderers - discussion in [issue](https://github.com/open-wc/open-wc/issues/1498)
|
- Support multiple renderers - discussion in [issue](https://github.com/open-wc/open-wc/issues/1498)
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ eleventyNavigation:
|
|||||||
| /learn/codelabs/ | - Codelabs Overview |
|
| /learn/codelabs/ | - Codelabs Overview |
|
||||||
| /learn/codelabs/x/ | ??? |
|
| /learn/codelabs/x/ | ??? |
|
||||||
| /learn/fundaments/ | - Fundaments |
|
| /learn/fundaments/ | - Fundaments |
|
||||||
| /learn/fundaments/html/ | -- html |
|
| /learn/fundaments/html/ | -- HTML |
|
||||||
| /learn/fundaments/css/ | -- css Basics |
|
| /learn/fundaments/css/ | -- CSS Basics |
|
||||||
| /learn/fundaments/browser/ | -- Browser Basics |
|
| /learn/fundaments/browser/ | -- Browser Basics |
|
||||||
| /learn/fundaments/specs/ | -- Specs Basics |
|
| /learn/fundaments/specs/ | -- Specs Basics |
|
||||||
| /learn/fundaments/server/ | -- Web Server Basics |
|
| /learn/fundaments/server/ | -- Web Server Basics |
|
||||||
@@ -36,8 +36,8 @@ eleventyNavigation:
|
|||||||
| /docs/build/rollup-plugin-html | -- Rollup Plugin for html |
|
| /docs/build/rollup-plugin-html | -- Rollup Plugin for html |
|
||||||
| /docs/build/rollup-plugin-polyfills-loader | -- Rollup Plugin for html |
|
| /docs/build/rollup-plugin-polyfills-loader | -- Rollup Plugin for html |
|
||||||
| /docs/build/polyfills-loader | -- Polyfills loading system |
|
| /docs/build/polyfills-loader | -- Polyfills loading system |
|
||||||
| /docs/mdjs?docs?/ | - Mdjs/Docs Overview |
|
| /docs/mdjs?docs?/ | - mdjs/Docs Overview |
|
||||||
| /docs/mdjs/elements | - Mdjs Overview |
|
| /docs/mdjs/elements | - mdjs Overview |
|
||||||
| - | - |
|
| - | - |
|
||||||
| **/blog/** | **Blog Overview** |
|
| **/blog/** | **Blog Overview** |
|
||||||
| /blog/2020/08/01/announcing-modern-web | - Announcement Blog Post |
|
| /blog/2020/08/01/announcing-modern-web | - Announcement Blog Post |
|
||||||
|
|||||||
@@ -14,15 +14,15 @@ The modern web setup with less complexity
|
|||||||
|
|
||||||
### Small
|
### Small
|
||||||
|
|
||||||
No overblown tools and frontend frameworks.
|
No overblown tools and front-end frameworks.
|
||||||
|
|
||||||
### Fast
|
### Fast
|
||||||
|
|
||||||
By shipping html
|
By shipping HTML
|
||||||
|
|
||||||
### Simple
|
### Simple
|
||||||
|
|
||||||
Pure html with little js helpers here and there allows you to debug and enhance where needed.
|
Pure HTML with little JavaScript helpers here and there allows you to debug and enhance where needed.
|
||||||
|
|
||||||
### Meta Framework
|
### Meta Framework
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ Modify your HTML to wrap the "Hello world" message in an element called `<cool-h
|
|||||||
|
|
||||||
Currently, your browser does not recognize the `<cool-heading>` tag. When the browser encounters an unknown HTML tag like `<cool-heading>`, it will just render it as an inline element and move on. With the custom elements API, we can tell the browser what to do with the HTML tag that we have just created.
|
Currently, your browser does not recognize the `<cool-heading>` tag. When the browser encounters an unknown HTML tag like `<cool-heading>`, it will just render it as an inline element and move on. With the custom elements API, we can tell the browser what to do with the HTML tag that we have just created.
|
||||||
|
|
||||||
We need to do this in javascript, so let's add a script tag to the bottom of our `<body>` element:
|
We need to do this in JavaScript, so let's add a script tag to the bottom of our `<body>` element:
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<script>
|
<script>
|
||||||
@@ -35,7 +35,7 @@ class CoolHeading extends HTMLElement {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
After creating our class we can associate it with a tagname by defining it in the custom elements registry. This way, whenever the browser's parser gets to the `<cool-heading>` tag, it will instantiate and apply our class to that specific element:
|
After creating our class we can associate it with a tag name by defining it in the custom elements registry. This way, whenever the browser's parser gets to the `<cool-heading>` tag, it will instantiate and apply our class to that specific element:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
customElements.define('cool-heading', CoolHeading);
|
customElements.define('cool-heading', CoolHeading);
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ Furthermore, Web Components can also be used to compose entire applications and
|
|||||||
**What you need**
|
**What you need**
|
||||||
|
|
||||||
- A web browser that supports Web Components: Firefox, Safari, Chrome or any Chromium-based browser.
|
- A web browser that supports Web Components: Firefox, Safari, Chrome or any Chromium-based browser.
|
||||||
- Basic knowledge of HTML, CSS, and Javascript.
|
- Basic knowledge of HTML, CSS, and JavaScript.
|
||||||
- Familiarity with the following concepts:
|
- Familiarity with the following concepts:
|
||||||
- [Javascript Modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules)
|
- [JavaScript Modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules)
|
||||||
- [Arrow functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)
|
- [Arrow functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)
|
||||||
|
|
||||||
**What you'll learn**
|
**What you'll learn**
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@rocket/cli",
|
"name": "@rocket/cli",
|
||||||
"version": "0.4.1",
|
"version": "0.5.2",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
},
|
},
|
||||||
@@ -18,8 +18,11 @@
|
|||||||
},
|
},
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"exports": {
|
"exports": {
|
||||||
"require": "./index.cjs",
|
".": {
|
||||||
"default": "./index.js"
|
"require": "./index.cjs",
|
||||||
|
"default": "./index.js"
|
||||||
|
},
|
||||||
|
"./test-helpers": "./test-helpers/index.js"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "npm run rocket:build",
|
"build": "npm run rocket:build",
|
||||||
@@ -39,7 +42,8 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"dist-types",
|
"dist-types",
|
||||||
"preset",
|
"preset",
|
||||||
"src"
|
"src",
|
||||||
|
"test-helpers"
|
||||||
],
|
],
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"rocket",
|
"rocket",
|
||||||
@@ -54,7 +58,7 @@
|
|||||||
"@11ty/eleventy-img": "^0.7.4",
|
"@11ty/eleventy-img": "^0.7.4",
|
||||||
"@rocket/building-rollup": "^0.1.2",
|
"@rocket/building-rollup": "^0.1.2",
|
||||||
"@rocket/core": "^0.1.1",
|
"@rocket/core": "^0.1.1",
|
||||||
"@rocket/eleventy-plugin-mdjs-unified": "^0.3.0",
|
"@rocket/eleventy-plugin-mdjs-unified": "^0.3.1",
|
||||||
"@rocket/eleventy-rocket-nav": "^0.2.1",
|
"@rocket/eleventy-rocket-nav": "^0.2.1",
|
||||||
"@rollup/plugin-babel": "^5.2.2",
|
"@rollup/plugin-babel": "^5.2.2",
|
||||||
"@rollup/plugin-node-resolve": "^11.0.1",
|
"@rollup/plugin-node-resolve": "^11.0.1",
|
||||||
@@ -62,10 +66,11 @@
|
|||||||
"@web/dev-server": "^0.1.4",
|
"@web/dev-server": "^0.1.4",
|
||||||
"@web/dev-server-rollup": "^0.3.2",
|
"@web/dev-server-rollup": "^0.3.2",
|
||||||
"@web/rollup-plugin-copy": "^0.2.0",
|
"@web/rollup-plugin-copy": "^0.2.0",
|
||||||
"check-html-links": "^0.1.1",
|
"check-html-links": "^0.2.0",
|
||||||
"command-line-args": "^5.1.1",
|
"command-line-args": "^5.1.1",
|
||||||
"command-line-usage": "^6.1.1",
|
"command-line-usage": "^6.1.1",
|
||||||
"fs-extra": "^9.0.1",
|
"fs-extra": "^9.0.1",
|
||||||
|
"micromatch": "^4.0.2",
|
||||||
"plugins-manager": "^0.2.0",
|
"plugins-manager": "^0.2.0",
|
||||||
"utf8": "^3.0.0"
|
"utf8": "^3.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
async function handleServiceWorker() {
|
async function serviceWorkerUpdate() {
|
||||||
if ('serviceWorker' in navigator) {
|
if ('serviceWorker' in navigator) {
|
||||||
const oldReg = await navigator.serviceWorker.getRegistration();
|
const oldReg = await navigator.serviceWorker.getRegistration();
|
||||||
let oldSwState;
|
let oldSwState;
|
||||||
@@ -27,4 +27,4 @@ async function handleServiceWorker() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleServiceWorker();
|
serviceWorkerUpdate();
|
||||||
@@ -3,6 +3,6 @@ module.exports = function () {
|
|||||||
dir: 'ltr',
|
dir: 'ltr',
|
||||||
lang: 'en',
|
lang: 'en',
|
||||||
name: 'Rocket',
|
name: 'Rocket',
|
||||||
description: 'Rocket is the way to build fast static websites with a sprinkle of javascript',
|
description: 'Rocket is the way to build fast static websites with a sprinkle of JavaScript',
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
{{ content | safe }}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<script>
|
||||||
|
{{ '_assets/_inline-scripts/serviceWorkerUpdate.js' | asset | toAbsPath | inlineFilePath | safe }}
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{% if site.analytics %}
|
||||||
|
<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.analytics }}"></script>
|
||||||
|
<script>
|
||||||
|
window.dataLayer = window.dataLayer || [];
|
||||||
|
function gtag(){dataLayer.push(arguments);}
|
||||||
|
gtag('js', new Date());
|
||||||
|
|
||||||
|
gtag('config', '{{ site.analytics }}');
|
||||||
|
</script>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{{ content | safe }}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{% set _pageTitle = title %}
|
||||||
|
{% if title != site.name %}
|
||||||
|
{% set _pageTitle = title + ': ' + site.name %}
|
||||||
|
{% endif %}
|
||||||
|
{% if pageTitle %}
|
||||||
|
{% set _pageTitle = pageTitle %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>{{ _pageTitle }}</title>
|
||||||
|
<meta property="og:title" content="{{ _pageTitle }}"/>
|
||||||
|
|
||||||
|
<meta name="generator" content="rocket 0.1">
|
||||||
|
<link rel="canonical" href="{{ page.url }}"/>
|
||||||
|
|
||||||
|
{% set _description = site.description %}
|
||||||
|
{% if description %}
|
||||||
|
{% set _description = description %}
|
||||||
|
{% endif %}
|
||||||
|
<meta name="description" content="{{ _description }}"/>
|
||||||
|
<meta property="og:description" content="{{ _description }}"/>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<meta property="og:site_name" content="{{ site.name }}"/>
|
||||||
|
<meta property="og:type" content="website"/>
|
||||||
|
|
||||||
|
<meta property="og:image" content="{{ socialMediaImage }}"/>
|
||||||
|
<meta property="og:url" content="{{ page.url }}"/>
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary_large_image"/>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<a class="logo-link" href="{{ '/' | url }}">
|
||||||
|
<img src="{{ '/_assets/logo.svg' | asset | url }}" alt="{{ site.logoAlt }}" />
|
||||||
|
<span class="sr-only">{{ site.name }}</span>
|
||||||
|
</a>
|
||||||
34
packages/cli/preset/_includes/layout-default.njk
Normal file
34
packages/cli/preset/_includes/layout-default.njk
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<!doctype html>
|
||||||
|
{% block htmlTag %}
|
||||||
|
<html lang="{{ site.lang }}" dir="{{ site.dir }}">
|
||||||
|
{% endblock htmlTag %}
|
||||||
|
|
||||||
|
{% block head %}
|
||||||
|
{% include 'partials/head.njk' %}
|
||||||
|
{% endblock head %}
|
||||||
|
|
||||||
|
{% block bodyTag %}
|
||||||
|
<body layout="{{ layout }}">
|
||||||
|
{% endblock bodyTag %}
|
||||||
|
|
||||||
|
{% block header %}
|
||||||
|
{% include 'partials/header.njk' %}
|
||||||
|
{% endblock header%}
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
<div id="content-wrapper">
|
||||||
|
<div class="content-area">
|
||||||
|
{% block content %}
|
||||||
|
{% include 'partials/content.njk' %}
|
||||||
|
{% endblock content %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock main %}
|
||||||
|
|
||||||
|
{% block footer %}
|
||||||
|
{% include 'partials/footer.njk' %}
|
||||||
|
{% endblock footer %}
|
||||||
|
|
||||||
|
{% include 'partials/bottom.njk' %}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
5
packages/cli/preset/_includes/layout-index.njk
Normal file
5
packages/cli/preset/_includes/layout-index.njk
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{% extends 'layout-default.njk' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% include 'partials/_layoutIndex/content.njk' %}
|
||||||
|
{% endblock content %}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user