Compare commits

..

1 Commits

Author SHA1 Message Date
Thomas Allmer
00ebeea10f wip: POC 2021-04-04 18:02:12 +02:00
98 changed files with 1281 additions and 2164 deletions

View File

@@ -0,0 +1,5 @@
---
'@rocket/search': patch
---
chore: generalize label & add alt when no img

View File

@@ -0,0 +1,5 @@
---
'@mdjs/core': minor
---
Extract building of the JavaScript setup code into a unified plugin called mdjsSetupCode

View File

@@ -0,0 +1,5 @@
---
'@mdjs/core': patch
---
You can provide a highlightCode function to the mdjsSetupCode unified plugin

View File

@@ -1,10 +0,0 @@
html {
--demo-background-color: #eee;
--demo-color: #222;
}
html[theme="dark"] body {
background: #333;
--demo-background-color: #888;
--demo-color: #eee;
}

View File

@@ -7,5 +7,3 @@
rel="stylesheet"
/>
<meta name="twitter:creator" content="@modern_web_dev" />
<link rel="stylesheet" href="{{ '/_assets/body.css' | asset | url }}" mdjs-use>

View File

@@ -0,0 +1,14 @@
<html lang="en">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Playground</title>
<body>
<rocket-playground></rocket-playground>
<script src="https://unpkg.com/wasm-flate@0.1.12-alpha/dist/bootstrap.js"></script>
<script type="module">
import '@rocket/playground/rocket-playground';
</script>
</body>
</html>

View File

@@ -1,45 +0,0 @@
# Configuration >> Service Worker ||30
Rocket does come with a default service worker that will
- cache already visited pages
- cache assets of visited pages (up to 100 files then it replaces older entries)
- reload the page if a newer html page version is available on service worker activation
## Adjusting the file name
Changing the service worker file name can be quite a hassle so you can adjust generate file name via a config.
👉 `rocket.config.js`
```js
export default {
serviceWorkerName: 'my-service-worker-name.js',
};
```
## Meet the Service Worker
The default service worker will work for many scenarios however your needs my vary.
To enable different service worker strategies you can replace the default service worker code by providing a file at `_assets/service-worker.js`.
This file will be auto transformed and generated in the root of the website using the defined `serviceWorkerName`.
For inspiration, you can take a look at the default config.
[https://github.com/modernweb-dev/rocket/blob/main/packages/cli/preset/\_assets/service-worker.js](https://github.com/modernweb-dev/rocket/blob/main/packages/cli/preset/_assets/service-worker.js)
Be sure to check out [workbox](https://developers.google.com/web/tools/workbox) for more service worker magic.
And if you wanna have a 30 minutes crash course we highly recommend the talk [Service Workers For The Rest Of Us](https://vimeo.com/362260166) by [Philip Walton](https://twitter.com/philwalton).
## Registration
The registration happens via another file that you can also overwrite at `_assets/scripts/registerServiceWorker.js`.
Below you find the default implementation.
<!-- prettier-ignore-start -->
```js
{{ '/_assets/scripts/registerServiceWorker.js' | asset | toAbsPath | inlineFilePath; }}
```
<!-- prettier-ignore-end -->

View File

@@ -1,69 +0,0 @@
class DemoElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.platform = 'the web';
this.language = 'en-US';
this.theme = 'light';
this.observer = new MutationObserver(this.updateData);
}
updateData = () => {
this.platform = document.documentElement.getAttribute('platform') || 'the web';
this.language = document.documentElement.getAttribute('data-lang') || 'en-US';
this.theme = document.documentElement.getAttribute('theme') || 'light';
this.requestUpdate();
};
connectedCallback() {
this.updateData();
this.observer.observe(document.documentElement, { attributes: true });
}
requestUpdate() {
this.shadowRoot.innerHTML = this.render();
}
render() {
return `
<style>
:host {
display: block;
background: var(--demo-background-color);
color: var(--demo-color);
padding: 10px;
}
:host[platform~="web"] {
border-bottom: 2px solid #333;
}
@media screen and (min-width: 640px) {
.about {
display: flex;
}
.about ul {
width: 50%;
}
}
</style>
<p>Hello I am DemoElement 👋</p>
<div class="about">
<ul>
<li>My purpose is to demonstrate how an element can adopt to different environments</li>
<li>I like <strong>${this.platform}</strong></li>
</ul>
<ul>
<li>My mother languages is <strong>${this.language}</strong></li>
<li>I feel very comfortable in the <strong>${this.theme}</strong></li>
</ul>
</div>
`;
}
}
customElements.define('demo-element', DemoElement);

View File

@@ -56,8 +56,8 @@ mdjs comes with some additional helpers you can choose to import:
````md
```js script
import '@mdjs/mdjs-story/define';
import '@mdjs/mdjs-preview/define';
import '@mdjs/mdjs-story/mdjs-story.js';
import '@mdjs/mdjs-preview/mdjs-preview.js';
```
````
@@ -65,8 +65,8 @@ Once loaded you can use them like so:
````md
```js script
import '@mdjs/mdjs-story/define';
import '@mdjs/mdjs-preview/define';
import '@mdjs/mdjs-story/mdjs-story.js';
import '@mdjs/mdjs-preview/mdjs-preview.js';
```
````
@@ -118,8 +118,8 @@ export const JsPreviewStory = () => html` <demo-wc-card>JS Preview Story</demo-w
Here is a live example from [demo-wc-card](https://www.npmjs.com/package/demo-wc-card).
```js script
import '@mdjs/mdjs-story/define';
import '@mdjs/mdjs-preview/define';
import '@mdjs/mdjs-story/mdjs-story.js';
import '@mdjs/mdjs-preview/mdjs-preview.js';
import { html } from 'lit-html';
```

View File

@@ -2,165 +2,22 @@
You can showcase live running code by annotating a code block with `js preview-story`.
## Features
- Shows components inside the page as they are
- You can enable “Simulation Mode” to break them out
- Simulation mode renders in an iframe to supporting media queries and isolated Simulation settings
- Simulation Settings
- Style (windows, mac, android, iOS)
- Size (small, medium, large, Galaxy S5, iPhone X, iPad …)
- Automatic Height
- Theme (light, dark)
- Language (en, nl, …)
- Settings are ”global” for all Simulators (e.g. changing one will change all)
- Settings can be remembered for other pages / return visits
```js script
import { html } from 'lit-html';
import './assets/demo-element.js';
```
## JavaScript Story
````md
```js script
import { html } from 'lit-html';
import './assets/demo-element.js';
```
```js preview-story
export const foo = () => html`<demo-element></demo-element>`;
export const foo = () => html` <p>my html</p> `;
```
````
will result in
```js preview-story
export const foo = () => html` <demo-element></demo-element> `;
```
## HTML Story
````md
```html preview-story
<demo-element></demo-element>
```
````
will result in
```html preview-story
<demo-element></demo-element>
```
## Setup Simulation Mode
For simulation mode we need a dedicated html file that will be used as an iframe target while loading stories.
The fastest way to create such a file is to use the `layout-simulator` layout.
Create a file `docs/simulator.md` with the following content.
```md
---
layout: layout-simulator
eleventyExcludeFromCollections: true
excludeFromSearch: true
---
```
Once you have that you need to configure it for the story renderer by setting it in your `rocket.config.js`.
```js
export default {
setupUnifiedPlugins: [
adjustPluginOptions('mdjsSetupCode', {
simulationSettings: { simulatorUrl: '/simulator/' },
}),
],
};
```
<inline-notification type="tip">
You can freely choose the path for the "simulator" by creating the md file in a different folder and adjusting the path in the config.
</inline-notification>
## Simulator states
To simulate these stats that usually come from the device itself we put those infos on the document tag.
We can simulate the following settings
1. `platform`
Adopting styles and behavior depending on which device platform you are.
```html
<html platform="web"></html>
<html platform="android"></html>
<html platform="ios"></html>
<!-- potentially later -->
<html platform="web-windows"></html>
<html platform="web-mac"></html>
```
2. `theme`
Adjust your styles based on a theme - light/dark are the default but you can add as many as you want.
```html
<html theme="light"></html>
<html theme="dark"></html>
```
3. `language`
Best to relay on `data-lang` as `lang` often gets changes by translations services which may interfere with your translation loading system.
```html
<html lang="en-US" data-lang="en-US"></html>
<html lang="de-DE" data-lang="de-DE"></html>
```
If you want to react to such document changes you can use an [MutationObserver](https://developer.mozilla.org/de/docs/Web/API/MutationObserver).
For a vanilla web component it could look something like this:
```js
class DemoElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.platform = 'the web';
this.language = 'en-US';
this.theme = 'light';
this.observer = new MutationObserver(this.updateData);
}
updateData = () => {
this.platform = document.documentElement.getAttribute('platform') || 'the web';
this.language = document.documentElement.getAttribute('data-lang') || 'en-US';
this.theme = document.documentElement.getAttribute('theme') || 'light';
this.requestUpdate();
};
connectedCallback() {
this.updateData();
this.observer.observe(document.documentElement, { attributes: true });
}
requestUpdate() {
this.shadowRoot.innerHTML = this.render();
}
render() {
return `
...
`;
}
}
customElements.define('demo-element', DemoElement);
```
```js script
import '@rocket/launch/inline-notification/inline-notification.js';
export const foo = () => html` <p>my html</p> `;
```

View File

@@ -8,6 +8,7 @@ You write modern JavaScript using the latest browser features. Rollup will optim
- Set HTML or JavaScript as input and/or output
- Optimized for browsers which support modules
- Loads polyfills using feature detection
- Generates a service worker
- Minifies JavaScript
- Minifies lit-html templates

View File

@@ -5,7 +5,7 @@ For that reason Rocket creates those automatically with the title, parent title,
It will look like this but with your logo:
<img src="{{ socialMediaImage | url }}" 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.

3
docs/playground.md Normal file
View File

@@ -0,0 +1,3 @@
---
layout: layout-playground
---

View File

@@ -1,5 +0,0 @@
---
layout: layout-simulator
eleventyExcludeFromCollections: true
excludeFromSearch: true
---

View File

@@ -1,17 +1,5 @@
# @rocket/building-rollup
## 0.3.0
### Minor Changes
- 2724f07: Stop auto generating a service worker from a template. Setup your own and then bundle via `createServiceWorkerConfig`.
## 0.2.0
### Minor Changes
- bad4686: Preserve attributes on script tags. Preserve export names.
## 0.1.3
### Patch Changes

View File

@@ -6,7 +6,3 @@
export { createBasicConfig, createBasicMetaConfig } from './src/createBasicConfig.js';
export { createSpaConfig, createSpaMetaConfig } from './src/createSpaConfig.js';
export { createMpaConfig, createMpaMetaConfig } from './src/createMpaConfig.js';
export {
createServiceWorkerConfig,
createServiceWorkerMetaConfig,
} from './src/createServiceWorkerConfig.js';

View File

@@ -1,6 +1,6 @@
{
"name": "@rocket/building-rollup",
"version": "0.3.0",
"version": "0.1.3",
"publishConfig": {
"access": "public"
},
@@ -13,8 +13,8 @@
},
"author": "Modern Web <hello@modern-web.dev> (https://modern-web.dev/)",
"homepage": "https://rocket.modern-web.dev/docs/tools/building-rollup/",
"main": "./index.js",
"type": "module",
"main": "./index.js",
"exports": {
".": "./index.js"
},
@@ -55,16 +55,11 @@
"@babel/preset-env": "^7.12.11",
"@rollup/plugin-babel": "^5.2.2",
"@rollup/plugin-node-resolve": "^11.0.1",
"@rollup/plugin-replace": "^2.4.2",
"@web/rollup-plugin-html": "^1.6.0",
"@web/rollup-plugin-html": "^1.4.0",
"@web/rollup-plugin-import-meta-assets": "^1.0.4",
"@web/rollup-plugin-polyfills-loader": "^1.1.0",
"@web/rollup-plugin-polyfills-loader": "^1.0.3",
"browserslist": "^4.16.1",
"rollup-plugin-terser": "^7.0.2",
"workbox-broadcast-update": "^6.1.5",
"workbox-cacheable-response": "^6.1.5",
"workbox-expiration": "^6.1.5",
"workbox-routing": "^6.1.5",
"workbox-strategies": "^6.1.5"
"rollup-plugin-workbox": "^6.1.0"
}
}

View File

@@ -22,7 +22,7 @@ export function createBasicMetaConfig(userConfig = { output: {} }) {
const assetName = `[${developmentMode ? 'name' : 'hash'}][extname]`;
const config = {
preserveEntrySignatures: 'strict',
preserveEntrySignatures: false,
treeshake: !developmentMode,
setupPlugins: [],
...userConfig,

View File

@@ -15,6 +15,10 @@ export function createMpaMetaConfig(userConfig = { output: {}, setupPlugins: []
adjustPluginOptions('html', {
flattenOutput: false,
}),
adjustPluginOptions('workbox', config => {
delete config.navigateFallback;
return config;
}),
...config.setupPlugins,
];

View File

@@ -1,91 +0,0 @@
import resolve from '@rollup/plugin-node-resolve';
import { terser } from 'rollup-plugin-terser';
import babelPkg from '@rollup/plugin-babel';
import replace from '@rollup/plugin-replace';
import { metaConfigToRollupConfig } from 'plugins-manager';
const { babel } = babelPkg;
export function createServiceWorkerConfig(userConfig) {
const { config, metaPlugins } = createServiceWorkerMetaConfig(userConfig);
return metaConfigToRollupConfig(config, metaPlugins);
}
export function createServiceWorkerMetaConfig(userConfig = { output: {} }) {
const developmentMode =
typeof userConfig.developmentMode !== undefined
? userConfig.developmentMode
: !!process.env.ROLLUP_WATCH;
delete userConfig.developmentMode;
const config = {
treeshake: !developmentMode,
setupPlugins: [],
...userConfig,
output: {
format: 'iife',
file: 'service-worker.js',
...userConfig.output,
},
};
let metaPlugins = [
{
name: 'node-resolve',
plugin: resolve,
options: {
moduleDirectories: ['node_modules', 'web_modules'],
},
},
{
name: 'replace',
plugin: replace,
options: {
'process.env.NODE_ENV': JSON.stringify(developmentMode ? 'development' : 'production'),
},
},
{
name: 'babel',
plugin: babel,
options: {
babelHelpers: 'bundled',
compact: true,
presets: [
[
'@babel/preset-env',
{
targets: [
'last 3 Chrome major versions',
'last 3 ChromeAndroid major versions',
'last 3 Firefox major versions',
'last 3 Edge major versions',
'last 3 Safari major versions',
'last 3 iOS major versions',
],
useBuiltIns: false,
shippedProposals: true,
modules: false,
bugfixes: true,
},
],
],
},
},
{
name: 'terser',
plugin: terser,
options: {
mangle: {
toplevel: true,
properties: {
regex: /(^_|_$)/,
},
},
},
},
];
return { config, metaPlugins, developmentMode };
}

View File

@@ -1,4 +1,6 @@
import path from 'path';
import { rollupPluginHTML } from '@web/rollup-plugin-html';
import { generateSW } from 'rollup-plugin-workbox';
import { importMetaAssets } from '@web/rollup-plugin-import-meta-assets';
import { polyfillsLoader } from '@web/rollup-plugin-polyfills-loader';
import { metaConfigToRollupConfig } from 'plugins-manager';
@@ -35,6 +37,31 @@ export function createSpaMetaConfig(userConfig = { output: {} }) {
options: {
rootDir,
absoluteBaseUrl,
injectServiceWorker: true,
serviceWorkerPath: path.join(config.output.dir, 'service-worker.js'),
},
},
{
name: 'workbox',
plugin: generateSW,
options: {
// Keep 'legacy-*.js' just for retro compatibility
globIgnores: ['polyfills/*.js', 'legacy-*.js', 'nomodule-*.js'],
navigateFallback: '/index.html',
// where to output the generated sw
swDest: path.join(config.output.dir, 'service-worker.js'),
// directory to match patterns against to be precached
globDirectory: path.join(config.output.dir),
// cache any html js and css by default
globPatterns: ['**/*.{html,js,css,webmanifest}', '**/*-search-index.json'],
skipWaiting: true,
clientsClaim: true,
runtimeCaching: [
{
urlPattern: 'polyfills/*.js',
handler: 'CacheFirst',
},
],
},
},
{

View File

@@ -9,13 +9,13 @@ describe('plugin count', () => {
expect(config.plugins.length).to.equal(3);
});
it('createSpaConfig has 6 plugins', () => {
it('createSpaConfig has 7 plugins', () => {
const config = createSpaConfig();
expect(config.plugins.length).to.equal(6);
expect(config.plugins.length).to.equal(7);
});
it('createMpaConfig has 6 plugins', () => {
it('createMpaConfig has 7 plugins', () => {
const config = createMpaConfig();
expect(config.plugins.length).to.equal(6);
expect(config.plugins.length).to.equal(7);
});
});

View File

@@ -26,7 +26,10 @@ async function execute(configString) {
const config = (await import(configPath)).default;
await buildAndWrite(config);
return async (fileName, { stripToBody = false, stripStartEndWhitespace = true } = {}) => {
return async (
fileName,
{ stripServiceWorker = false, stripToBody = false, stripStartEndWhitespace = true } = {},
) => {
let text = await fs.promises.readFile(
path.join(config.output.dir, fileName.split('/').join(path.sep)),
);
@@ -36,6 +39,11 @@ async function execute(configString) {
const bodyCloseTagStart = text.indexOf('</body>');
text = text.substring(bodyOpenTagEnd, bodyCloseTagStart);
}
if (stripServiceWorker) {
const scriptOpenTagEnd = text.indexOf('<script inject-service-worker');
const scriptCloseTagStart = text.indexOf('</script>', scriptOpenTagEnd) + 9;
text = text.substring(0, scriptOpenTagEnd) + text.substring(scriptCloseTagStart);
}
if (stripStartEndWhitespace) {
text = text.trim();
}
@@ -49,26 +57,25 @@ describe('createMapConfig', () => {
const indexHtml = await readOutput('index.html', {
stripToBody: true,
stripServiceWorker: true,
});
expect(indexHtml).to.equal('<h1>Only static HTML content in index.html</h1>');
const subHtmlIndexHtml = await readOutput('sub-html/index.html', {
stripToBody: true,
stripServiceWorker: true,
});
expect(subHtmlIndexHtml).to.equal('<h1>Only static HTML content in sub-html/index.html</h1>');
const subJsIndexHtml = await readOutput('sub-js/index.html', {
stripToBody: true,
stripServiceWorker: true,
});
expect(subJsIndexHtml).to.equal(
'<h1>Has js in sub-js/index.html</h1>\n\n\n<script type="module" src="../sub-js.js"></script>',
);
const subJsAbsoluteIndexHtml = await readOutput('sub-js-absolute/index.html', {
stripToBody: true,
});
expect(subJsAbsoluteIndexHtml).to.equal(
'<h1>Has js in sub-js-absolute/index.html</h1>\n\n\n<script type="module" src="../sub-js-absolute.js"></script>',
);
const serviceWorkerJs = await readOutput('service-worker.js');
expect(serviceWorkerJs).to.include('Promise'); // not empty string might be enough...
});
});

View File

@@ -1,2 +0,0 @@
<h1>Has js in sub-js-absolute/index.html</h1>
<script type="module" src="/sub-js-absolute/sub-js-absolute.js"></script>

View File

@@ -1,11 +1,5 @@
# check-html-links
## 0.2.2
### Patch Changes
- 66c2d78: fix: windows path issue
## 0.2.1
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "check-html-links",
"version": "0.2.2",
"version": "0.2.1",
"publishConfig": {
"access": "public"
},
@@ -13,11 +13,11 @@
},
"author": "Modern Web <hello@modern-web.dev> (https://modern-web.dev/)",
"homepage": "https://rocket.modern-web.dev/docs/tools/check-html-links/",
"main": "./index.js",
"bin": {
"check-html-links": "src/cli.js"
},
"type": "module",
"main": "./index.js",
"exports": {
".": "./index.js"
},

View File

@@ -6,7 +6,6 @@ import { createRequire } from 'module';
import { listFiles } from './listFiles.js';
import path from 'path';
import slash from 'slash';
/** @typedef {import('../types/main').Link} Link */
/** @typedef {import('../types/main').LocalFile} LocalFile */
@@ -46,7 +45,7 @@ function extractReferences(htmlFilePath) {
if (ev === SaxEventType.Attribute) {
const data = /** @type {Attribute} */ (/** @type {any} */ (_data));
const attributeName = data.name.toString();
const value = slash(data.value.toString());
const value = data.value.toString();
const entry = {
attribute: attributeName,
value,

View File

@@ -1,46 +1,5 @@
# @rocket/cli
## 0.7.0
### Minor Changes
- 2724f07: The service worker no longer precaches all urls and assets. It now
- caches already visited pages
- caches assets of visited pages (up to 100 files then it replaces older entries)
- on service worker activation it will reload the page if a newer version is available
### Patch Changes
- Updated dependencies [2724f07]
- @rocket/building-rollup@0.3.0
## 0.6.3
### Patch Changes
- 2b7f1ee: Add support for pathprefix
- Updated dependencies [2b7f1ee]
- @rocket/eleventy-plugin-mdjs-unified@0.4.1
## 0.6.2
### Patch Changes
- ed86ff2: Do not set `data-localize-lang` in the simulator iframe html tag
- f4a0ab5: Pass document shadowRoot to iframe
- c675820: fix: windows path issue avoid filtering of index section of collections
## 0.6.1
### Patch Changes
- abc8a02: You can now use an absolute path for the rootDir
- Updated dependencies [bad4686]
- Updated dependencies [2267e72]
- @rocket/building-rollup@0.2.0
- @rocket/eleventy-plugin-mdjs-unified@0.4.0
## 0.6.0
### Minor Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@rocket/cli",
"version": "0.7.0",
"version": "0.6.0",
"publishConfig": {
"access": "public"
},
@@ -13,11 +13,11 @@
},
"author": "Modern Web <hello@modern-web.dev> (https://modern-web.dev/)",
"homepage": "https://rocket.modern-web.dev/",
"main": "./index.cjs",
"bin": {
"rocket": "src/cli.js"
},
"type": "module",
"main": "./index.cjs",
"exports": {
".": {
"require": "./index.cjs",
@@ -57,9 +57,9 @@
"dependencies": {
"@11ty/eleventy": "^0.11.1",
"@11ty/eleventy-img": "^0.7.4",
"@rocket/building-rollup": "^0.3.0",
"@rocket/building-rollup": "^0.1.3",
"@rocket/core": "^0.1.2",
"@rocket/eleventy-plugin-mdjs-unified": "^0.4.1",
"@rocket/eleventy-plugin-mdjs-unified": "^0.3.1",
"@rocket/eleventy-rocket-nav": "^0.3.0",
"@rollup/plugin-babel": "^5.2.2",
"@rollup/plugin-node-resolve": "^11.0.1",
@@ -67,15 +67,13 @@
"@web/dev-server": "^0.1.4",
"@web/dev-server-rollup": "^0.3.2",
"@web/rollup-plugin-copy": "^0.2.0",
"check-html-links": "^0.2.2",
"check-html-links": "^0.2.1",
"command-line-args": "^5.1.1",
"command-line-usage": "^6.1.1",
"fs-extra": "^9.0.1",
"micromatch": "^4.0.2",
"plugins-manager": "^0.2.1",
"slash": "^3.0.0",
"utf8": "^3.0.0",
"workbox-window": "^6.1.5"
"utf8": "^3.0.0"
},
"types": "dist-types/index.d.ts"
}

View File

@@ -1,22 +0,0 @@
(async () => {
if ('serviceWorker' in navigator) {
const { Workbox } = await import('workbox-window');
const url = window.__rocketServiceWorkerUrl || '/service-worker.js';
const wb = new Workbox(url);
wb.addEventListener('message', event => {
if (event.data.type === 'CACHE_UPDATED') {
const { updatedURL } = event.data.payload;
console.log(`Reloading as a newer version of ${updatedURL} became available!`);
window.location.reload();
}
});
wb.register()
.then(function () {
console.log('ServiceWorker registered.');
})
.catch(function (err) {
console.log('ServiceWorker registration failed: ', err);
});
}
})();

View File

@@ -1,29 +0,0 @@
import { registerRoute } from 'workbox-routing';
import { CacheFirst, StaleWhileRevalidate } from 'workbox-strategies';
import { BroadcastUpdatePlugin } from 'workbox-broadcast-update';
import { ExpirationPlugin } from 'workbox-expiration';
addEventListener('install', () => {
// eslint-disable-next-line no-undef
skipWaiting();
});
// addEventListener('activate', () => {
// console.log('activate');
// });
const cacheFirst = new CacheFirst({
cacheName: 'assets',
plugins: [
new ExpirationPlugin({
maxEntries: 100,
}),
],
});
const staleWhileRevalidate = new StaleWhileRevalidate({
cacheName: 'pages',
plugins: [new BroadcastUpdatePlugin()],
});
registerRoute(/(\/|\.html)$/, staleWhileRevalidate);
registerRoute(/\.(css|m?js|svg|woff2|png|jpg|gif|json|xml)$/, cacheFirst);

View File

@@ -1,5 +0,0 @@
<script>
window.__rocketServiceWorkerUrl = '/{{ rocketConfig.serviceWorkerName }}';
</script>
<script type="module" inject-service-worker="" src="{{ '/_assets/scripts/registerServiceWorker.js' | asset | url }}"></script>

View File

@@ -0,0 +1,3 @@
<script>
{{ '_assets/_inline-scripts/serviceWorkerUpdate.js' | asset | toAbsPath | inlineFilePath | safe }}
</script>

View File

@@ -1,7 +1,7 @@
<meta property="og:site_name" content="{{ site.name }}"/>
<meta property="og:type" content="website"/>
<meta property="og:image" content="{{ socialMediaImage | url }}"/>
<meta property="og:url" content="{{ page.url | url }}"/>
<meta property="og:image" content="{{ socialMediaImage }}"/>
<meta property="og:url" content="{{ page.url }}"/>
<meta name="twitter:card" content="summary_large_image"/>

View File

@@ -1,69 +0,0 @@
<html theme="light" platform="web" lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type="text/css">
body {
margin: 0;
height: fit-content;
}
html[edge-distance] body {
padding: 8px;
}
</style>
<script type="module">
import { render } from 'lit-html';
async function onHashChange() {
const urlParts = new URLSearchParams(document.location.hash.substr(1));
if (urlParts.get('stylesheets')) {
for (const stylesheet of urlParts.getAll('stylesheets')) {
if (!document.querySelector(`link[rel="stylesheet"][href="${stylesheet}"]`)) {
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = stylesheet;
document.head.appendChild(link);
}
}
}
if (urlParts.get('theme')) {
document.documentElement.setAttribute('theme', urlParts.get('theme'));
}
if (urlParts.get('platform')) {
document.documentElement.setAttribute('platform', urlParts.get('platform'));
}
if (urlParts.get('language')) {
document.documentElement.setAttribute('lang', urlParts.get('language'));
document.documentElement.setAttribute('data-lang', urlParts.get('language'));
}
if (urlParts.get('story-key')) {
document.documentElement.setAttribute('story-key', urlParts.get('story-key'));
}
if (urlParts.get('edge-distance') === 'true') {
document.documentElement.setAttribute('edge-distance', '');
} else {
document.documentElement.removeAttribute('edge-distance');
}
const mod = await import(urlParts.get('story-file'));
render(mod[urlParts.get('story-key')]({ shadowRoot: document }), document.body);
}
window.addEventListener('hashchange', onHashChange, false);
onHashChange();
const observer = new ResizeObserver(() => {
const dimensions = document.body.getBoundingClientRect();
const data = {
action: 'mdjs-viewer-resize',
storyKey: document.documentElement.getAttribute('story-key'),
width: dimensions.width,
height: dimensions.height,
};
parent.postMessage(JSON.stringify(data), '*');
});
observer.observe(document.body);
</script>
</head>
<body></body>
</html>

View File

@@ -3,10 +3,9 @@
import { rollup } from 'rollup';
import fs from 'fs-extra';
import path from 'path';
import { copy } from '@web/rollup-plugin-copy';
import { createMpaConfig, createServiceWorkerConfig } from '@rocket/building-rollup';
import { createMpaConfig } from '@rocket/building-rollup';
import { addPlugin, adjustPluginOptions } from 'plugins-manager';
/**
@@ -46,7 +45,7 @@ async function productionBuild(config) {
dir: config.outputDir,
},
// custom
rootDir: path.resolve(config.outputDevDir),
rootDir: config.outputDevDir,
absoluteBaseUrl: config.absoluteBaseUrl,
setupPlugins: [
...defaultSetupPlugins,
@@ -56,18 +55,6 @@ async function productionBuild(config) {
});
await buildAndWrite(mpaConfig);
const serviceWorkerSourcePath = path.resolve('docs/_merged_assets/service-worker.js');
if (fs.existsSync(serviceWorkerSourcePath)) {
const serviceWorkerConfig = createServiceWorkerConfig({
input: serviceWorkerSourcePath,
output: {
file: path.join(path.resolve(config.outputDir), config.serviceWorkerName),
},
});
await buildAndWrite(serviceWorkerConfig);
}
}
export class RocketBuild {

View File

@@ -58,6 +58,12 @@ export class RocketStart {
setupRollupPlugins: this.config.setupDevAndBuildPlugins,
setupPlugins: this.config.setupDevPlugins,
middleware: [
function rewriteIndex(context, next) {
context.set('Access-Control-Allow-Origin', '*');
return next();
},
],
},
[],
{ rollupWrapperFunction: fromRollup },

View File

@@ -1,6 +1,5 @@
const path = require('path');
const fs = require('fs');
const slash = require('slash');
const { readdirSync } = require('fs');
function getDirectories(source) {
@@ -24,7 +23,7 @@ const rocketCollections = {
let docs = [
...collection.getFilteredByGlob(`${_inputDirCwdRelative}/${section}/**/*.md`),
];
docs = docs.filter(page => page.inputPath !== `./${slash(indexSection)}`);
docs = docs.filter(page => page.inputPath !== `./${indexSection}`);
return docs;
});

View File

@@ -40,7 +40,6 @@ export async function normalizeConfig(inConfig) {
inputDir: 'docs',
outputDir: '_site',
outputDevDir: '_site-dev',
serviceWorkerName: 'service-worker.js',
build: {},
devServer: {},

View File

@@ -15,6 +15,7 @@ export function setFixtureDir(importMetaUrl) {
/**
* @typedef {object} readOutputOptions
* @property {boolean} stripServiceWorker
* @property {boolean} stripToBody
* @property {boolean} stripStartEndWhitespace
* @property {boolean} stripScripts
@@ -46,6 +47,7 @@ export async function readOutput(
cli,
fileName,
{
stripServiceWorker = false,
stripToBody = false,
stripStartEndWhitespace = true,
stripScripts = false,
@@ -65,6 +67,11 @@ export async function readOutput(
const bodyCloseTagStart = text.indexOf('</body>');
text = text.substring(bodyOpenTagEnd, bodyCloseTagStart);
}
if (stripServiceWorker) {
const scriptOpenTagEnd = text.indexOf('<script inject-service-worker');
const scriptCloseTagStart = text.indexOf('</script>', scriptOpenTagEnd) + 9;
text = text.substring(0, scriptOpenTagEnd) + text.substring(scriptCloseTagStart);
}
if (stripScripts) {
const scriptOpenTagEnd = text.indexOf('<script>');
const scriptCloseTagStart = text.indexOf('</script>', scriptOpenTagEnd) + 9;

View File

@@ -66,6 +66,7 @@ describe('RocketCli computedConfig', () => {
const indexHtml = await readBuildOutput(cli, 'index.html', {
stripToBody: true,
stripServiceWorker: true,
});
expect(indexHtml).to.equal('/_merged_assets/11ty-img/5893749-1200.png');
});

View File

@@ -75,6 +75,9 @@ describe('RocketCli e2e', () => {
cli = await executeBuild('e2e-fixtures/rollup-plugin/devbuild-build.rocket.config.js');
const inlineModule = await readBuildOutput(cli, 'e97af63d.js');
expect(inlineModule).to.equal('var a={test:"data"};console.log(a);');
const swCode = await readBuildOutput(cli, 'my-service-worker.js');
expect(swCode).to.not.be.undefined;
});
it('can adjust the inputDir', async () => {
@@ -108,6 +111,7 @@ describe('RocketCli e2e', () => {
cli = await executeBuild('e2e-fixtures/content/pathPrefix.rocket.config.js');
const linkHtml = await readBuildOutput(cli, 'link/index.html', {
stripServiceWorker: true,
stripToBody: true,
});
expect(linkHtml).to.equal(
@@ -115,7 +119,9 @@ describe('RocketCli e2e', () => {
'\n',
),
);
const assetHtml = await readBuildOutput(cli, 'use-assets/index.html');
const assetHtml = await readBuildOutput(cli, 'use-assets/index.html', {
stripServiceWorker: true,
});
expect(assetHtml).to.equal(
'<html><head><link rel="stylesheet" href="../41297ffa.css">\n\n</head><body>\n\n</body></html>',
);

View File

@@ -86,12 +86,6 @@ describe('RocketCli preset', () => {
' </div>',
'',
' <footer id="main-footer"></footer>',
'',
' <script',
' type="module"',
' inject-service-worker=""',
' src="/_merged_assets/scripts/registerServiceWorker.js"',
' ></script>',
' </body>',
'</html>',
].join('\n'),

View File

@@ -34,7 +34,12 @@ describe('RocketCli use cases', () => {
expect(aboutHtml).to.equal(
[
'<p><code>about.md</code></p>',
'<script type="module" src="/about/__mdjs-stories.js" mdjs-setup></script>',
'<script type="module">',
' import { myData } from "../sub/assets/myData.js";',
' import("../sub/assets/myData.js");',
' const name = "myData";',
' import(`../sub/assets/${name}.js`);',
'</script>',
].join('\n'),
);
@@ -42,7 +47,12 @@ describe('RocketCli use cases', () => {
expect(subHtml).to.equal(
[
'<p><code>sub/index.md</code></p>',
'<script type="module" src="/sub/__mdjs-stories.js" mdjs-setup></script>',
'<script type="module">',
' import { myData } from "./assets/myData.js";',
' import("./assets/myData.js");',
' const name = "myData";',
' import(`./assets/${name}.js`);',
'</script>',
].join('\n'),
);
@@ -52,7 +62,12 @@ describe('RocketCli use cases', () => {
expect(subDetailsHtml).to.equal(
[
'<p><code>sub/details.md</code></p>',
'<script type="module" src="/sub/details/__mdjs-stories.js" mdjs-setup></script>',
'<script type="module">',
' import { myData } from "../assets/myData.js";',
' import("../assets/myData.js");',
' const name = "myData";',
' import(`../assets/${name}.js`);',
'</script>',
].join('\n'),
);
@@ -60,7 +75,12 @@ describe('RocketCli use cases', () => {
expect(indexHtml).to.equal(
[
'<p><code>index.md</code></p>',
'<script type="module" src="/__mdjs-stories.js" mdjs-setup></script>',
'<script type="module">',
' import { myData } from "./sub/assets/myData.js";',
' import("./sub/assets/myData.js");',
' const name = "myData";',
' import(`./sub/assets/${name}.js`);',
'</script>',
].join('\n'),
);
});

View File

@@ -1,11 +1,19 @@
// @ts-no-check
import path from 'path';
import { fileURLToPath } from 'url';
import json from '@rollup/plugin-json';
import { addPlugin, adjustPluginOptions } from 'plugins-manager';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const outputDir = path.join(__dirname, '__output');
/** @type {Partial<import("../../../types/main").RocketCliOptions>} */
const config = {
setupDevAndBuildPlugins: [addPlugin({ name: 'json', plugin: json, location: 'top' })],
setupBuildPlugins: [adjustPluginOptions('html', { absoluteBaseUrl: 'https://test-me.com' })],
setupBuildPlugins: [
adjustPluginOptions('workbox', { swDest: path.join(outputDir, 'my-service-worker.js') }),
],
};
export default config;

View File

@@ -31,7 +31,12 @@ export async function expectThrowsAsync(method, { errorMatch, errorMessage } = {
export async function readOutput(
cli,
fileName,
{ stripToBody = false, stripStartEndWhitespace = true, type = 'build' } = {},
{
stripServiceWorker = false,
stripToBody = false,
stripStartEndWhitespace = true,
type = 'build',
} = {},
) {
const outputDir = type === 'build' ? cli.config.outputDir : cli.config.outputDevDir;
let text = await fs.promises.readFile(path.join(outputDir, fileName));
@@ -41,6 +46,11 @@ export async function readOutput(
const bodyCloseTagStart = text.indexOf('</body>');
text = text.substring(bodyOpenTagEnd, bodyCloseTagStart);
}
if (stripServiceWorker) {
const scriptOpenTagEnd = text.indexOf('<script inject-service-worker');
const scriptCloseTagStart = text.indexOf('</script>', scriptOpenTagEnd) + 9;
text = text.substring(0, scriptOpenTagEnd) + text.substring(scriptCloseTagStart);
}
if (stripStartEndWhitespace) {
text = text.trim();
}

View File

@@ -41,7 +41,6 @@ describe('normalizeConfig', () => {
setupEleventyComputedConfig: [],
setupCliPlugins: [],
presets: [],
serviceWorkerName: 'service-worker.js',
plugins: [
{ commands: ['start'] },
{ commands: ['build'] },
@@ -77,7 +76,6 @@ describe('normalizeConfig', () => {
setupCliPlugins: [],
setupEleventyComputedConfig: [],
presets: [],
serviceWorkerName: 'service-worker.js',
plugins: [
{ commands: ['start'] },
{ commands: ['build'] },
@@ -110,7 +108,6 @@ describe('normalizeConfig', () => {
setupCliPlugins: [],
setupEleventyComputedConfig: [],
presets: [],
serviceWorkerName: 'service-worker.js',
plugins: [
{ commands: ['start'] },
{ commands: ['build'] },
@@ -146,7 +143,6 @@ describe('normalizeConfig', () => {
setupCliPlugins: [],
setupEleventyComputedConfig: [],
presets: [],
serviceWorkerName: 'service-worker.js',
plugins: [
{ commands: ['start'] },
{ commands: ['build'] },

View File

@@ -20,7 +20,6 @@ interface RocketStartConfig {
export interface RocketCliOptions {
presets: Array<RocketPreset>;
pathPrefix?: string;
serviceWorkerName?: string;
inputDir: string;
outputDir: string;
emptyOutputDir?: boolean;

View File

@@ -13,8 +13,8 @@
},
"author": "Modern Web <hello@modern-web.dev> (https://modern-web.dev/)",
"homepage": "https://rocket.modern-web.dev/",
"main": "./dist/title.cjs",
"type": "module",
"main": "./dist/title.cjs",
"exports": {
"./title": {
"require": "./dist/title.cjs",

View File

@@ -1,11 +1,5 @@
# @rocket/drawer
## 0.1.3
### Patch Changes
- 0b64116: Update @lion dependencies
## 0.1.2
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@rocket/drawer",
"version": "0.1.3",
"version": "0.1.2",
"publishConfig": {
"access": "public"
},
@@ -33,7 +33,7 @@
"testing"
],
"dependencies": {
"@lion/overlays": "^0.26.1",
"@lion/overlays": "^0.23.2",
"lit-element": "^2.4.0"
},
"types": "dist-types/index.d.ts"

View File

@@ -1,26 +1,5 @@
# @rocket/eleventy-plugin-mdjs-unified
## 0.4.1
### Patch Changes
- 2b7f1ee: Add support for pathprefix
- Updated dependencies [2b7f1ee]
- @mdjs/core@0.7.1
## 0.4.0
### Minor Changes
- 2267e72: Write the mdjs JavaScript code to a file and load it from there instead of an inline script
### Patch Changes
- Updated dependencies [a8e66d8]
- Updated dependencies [fe6a929]
- Updated dependencies [a8e66d8]
- @mdjs/core@0.7.0
## 0.3.1
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@rocket/eleventy-plugin-mdjs-unified",
"version": "0.4.1",
"version": "0.3.1",
"publishConfig": {
"access": "public"
},
@@ -31,7 +31,7 @@
"mdjs"
],
"dependencies": {
"@mdjs/core": "^0.7.1",
"@mdjs/core": "^0.6.2",
"es-module-lexer": "^0.3.26",
"unist-util-visit": "^2.0.3"
},

View File

@@ -1,7 +1,4 @@
/* eslint-disable @typescript-eslint/ban-ts-comment */
const path = require('path');
const slash = require('slash');
const fs = require('fs');
const { mdjsProcess } = require('@mdjs/core');
const visit = require('unist-util-visit');
const { init, parse } = require('es-module-lexer');
@@ -10,7 +7,7 @@ const { init, parse } = require('es-module-lexer');
const { parseTitle } = require('@rocket/core/title');
/** @typedef {import('@mdjs/core').MdjsProcessPlugin} MdjsProcessPlugin */
/** @typedef {import('../types/code').EleventyPluginMdjsUnified} EleventyPluginMdjsUnified */
/** @typedef {import('../types/code').EleventPluginMdjsUnified} EleventPluginMdjsUnified */
/** @typedef {import('../types/code').NodeChildren} NodeChildren */
/** @typedef {import('../types/code').NodeElement} NodeElement */
/** @typedef {import('unist').Node} Node */
@@ -96,7 +93,7 @@ async function processImports(source, inputPath) {
}
/**
* @param {EleventyPluginMdjsUnified} pluginOptions
* @param {EleventPluginMdjsUnified} pluginOptions
*/
function eleventyUnified(pluginOptions) {
/**
@@ -122,12 +119,8 @@ function eleventyUnified(pluginOptions) {
return plugins.map(plugin => {
if (plugin.options) {
plugin.options.page = eleventySettings.page;
plugin.options.rocketConfig = eleventySettings.rocketConfig;
} else {
plugin.options = {
page: eleventySettings.page,
rocketConfig: eleventySettings.rocketConfig,
};
plugin.options = { page: eleventySettings.page };
}
return plugin;
});
@@ -146,23 +139,10 @@ function eleventyUnified(pluginOptions) {
let code = result.html;
if (result.jsCode) {
const newFolder = path.dirname(eleventySettings.page.outputPath);
const newName = path.join(newFolder, '__mdjs-stories.js');
await fs.promises.mkdir(newFolder, { recursive: true });
await fs.promises.writeFile(newName, result.jsCode, 'utf8');
let scriptUrl = eleventySettings.page.url;
if (
eleventySettings.rocketConfig &&
eleventySettings.rocketConfig.command === 'build' &&
eleventySettings.rocketConfig.pathPrefix
) {
scriptUrl = slash(
path.join(eleventySettings.rocketConfig.pathPrefix, eleventySettings.page.url),
);
}
code += `
<script type="module" src="${scriptUrl}__mdjs-stories.js" mdjs-setup></script>
<script type="module">
${result.jsCode}
</script>
`;
}
return code;
@@ -177,15 +157,15 @@ function eleventyUnified(pluginOptions) {
/**
* @param {*} eleventyConfig
* @param {EleventyPluginMdjsUnified} [pluginOptions]
* @param {EleventPluginMdjsUnified} [pluginOptions]
*/
function configFunction(eleventyConfig, pluginOptions = {}) {
eleventyConfig.setLibrary('md', eleventyUnified(pluginOptions));
}
const EleventyPluginMdjsUnified = {
const eleventPluginMdjsUnified = {
initArguments: {},
configFunction,
};
module.exports = EleventyPluginMdjsUnified;
module.exports = eleventPluginMdjsUnified;

View File

@@ -57,8 +57,8 @@ describe('eleventy-plugin-mdjs-unified', () => {
expect(files.length).to.equal(1);
expect(files[0].name).to.equal('first/index.html');
expect(files[0].html).to.include('<script type="module"');
expect(files[0].html).to.include('mdjs-setup>');
expect(files[0].html).to.include('<script type="module">');
expect(files[0].html).to.include('for (const story of stories)');
});
it('rewrites relative import pathes', async () => {
@@ -66,7 +66,7 @@ describe('eleventy-plugin-mdjs-unified', () => {
expect(files).to.deep.equal([
{
html:
'<p>first</p>\n <script type="module" src="/first/__mdjs-stories.js" mdjs-setup></script>\n ',
"<p>first</p>\n <script type=\"module\">\n import '../import-me.js';\nimport('../import-me-too.js');\n </script>\n ",
name: 'first/index.html',
},
]);
@@ -77,7 +77,7 @@ describe('eleventy-plugin-mdjs-unified', () => {
expect(files).to.deep.equal([
{
html:
'<p>first</p>\n <script type="module" src="/subpage/first/__mdjs-stories.js" mdjs-setup></script>\n ',
"<p>first</p>\n <script type=\"module\">\n import '../../import-me.js';\nimport('../../import-me-too.js');\n </script>\n ",
name: 'subpage/first/index.html',
},
]);
@@ -88,7 +88,7 @@ describe('eleventy-plugin-mdjs-unified', () => {
expect(files).to.deep.equal([
{
html:
'<p>index</p>\n <script type="module" src="/__mdjs-stories.js" mdjs-setup></script>\n ',
"<p>index</p>\n <script type=\"module\">\n import './import-me.js';\nimport('./import-me-too.js');\n </script>\n ",
name: 'index.html',
},
]);

View File

@@ -3,7 +3,7 @@ import { Node } from 'unist';
export const setupUnifiedPluginsFn: (plugins: MdjsProcessPlugin[]) => MdjsProcessPlugin[];
export interface EleventyPluginMdjsUnified {
export interface EleventPluginMdjsUnified {
setupUnifiedPlugins?: setupUnifiedPluginsFn[];
}

View File

@@ -1,17 +1,5 @@
# @rocket/launch
## 0.4.2
### Patch Changes
- 2b7f1ee: Add support for pathprefix
## 0.4.1
### Patch Changes
- 81edf45: Reduce the amount of js files in the build by avoiding inline script tags
## 0.4.0
### Minor Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@rocket/launch",
"version": "0.4.2",
"version": "0.4.0",
"publishConfig": {
"access": "public"
},
@@ -19,6 +19,7 @@
".": "./index.js",
"./preset/": "./preset/",
"./inline-notification": "./inline-notification/index.js",
"./inline-notification-element": "./inline-notification/inline-notification.js",
"./inline-notification/inline-notification.js": "./inline-notification/inline-notification.js"
},
"scripts": {
@@ -35,7 +36,7 @@
"preset"
],
"dependencies": {
"@rocket/drawer": "^0.1.3",
"@rocket/drawer": "^0.1.2",
"@rocket/navigation": "^0.2.1"
}
}

View File

@@ -1 +1,17 @@
<script type="module" src="{{ '/_assets/scripts/init-navigation.js' | asset | url }}"></script>
{#
src leads to the file not being included/executed? bug in rollup-plugin-html?
<script type="module" src="{{ '/_assets/scripts/init-navigation.js' | asset }}"></script>
#}
<script type="module">
import '@rocket/navigation/rocket-navigation.js';
import '@rocket/drawer/rocket-drawer.js';
const drawer = document.querySelector('#sidebar');
// Toggle button
const triggers = document.querySelectorAll('[data-action="trigger-mobile-menu"]');
for (const trigger of [...triggers]) {
trigger.addEventListener('click', function () {
drawer.opened = true;
});
}
</script>

View File

@@ -1,7 +1,7 @@
<meta property="og:site_name" content="{{ site.name }}"/>
<meta property="og:type" content="website"/>
<meta property="og:image" content="{{ socialMediaImage | url }}"/>
<meta property="og:url" content="{{ page.url | url }}"/>
<meta property="og:image" content="{{ socialMediaImage }}"/>
<meta property="og:url" content="{{ page.url }}"/>
<meta name="twitter:card" content="summary_large_image"/>

View File

@@ -208,13 +208,19 @@ describe('RocketLaunch preset', () => {
' </div>',
' </footer>',
'',
' <script type="module" src="/_merged_assets/scripts/init-navigation.js"></script>',
' <script type="module">',
' import "@rocket/navigation/rocket-navigation.js";',
' import "@rocket/drawer/rocket-drawer.js";',
' const drawer = document.querySelector("#sidebar");',
'',
' <script',
' type="module"',
' inject-service-worker=""',
' src="/_merged_assets/scripts/registerServiceWorker.js"',
' ></script>',
' // Toggle button',
` const triggers = document.querySelectorAll('[data-action="trigger-mobile-menu"]');`,
' for (const trigger of [...triggers]) {',
' trigger.addEventListener("click", function () {',
' drawer.opened = true;',
' });',
' }',
' </script>',
' </body>',
'</html>',
].join('\n'),
@@ -437,13 +443,19 @@ describe('RocketLaunch preset', () => {
' </div>',
' </footer>',
'',
' <script type="module" src="/_merged_assets/scripts/init-navigation.js"></script>',
' <script type="module">',
' import "@rocket/navigation/rocket-navigation.js";',
' import "@rocket/drawer/rocket-drawer.js";',
' const drawer = document.querySelector("#sidebar");',
'',
' <script',
' type="module"',
' inject-service-worker=""',
' src="/_merged_assets/scripts/registerServiceWorker.js"',
' ></script>',
' // Toggle button',
` const triggers = document.querySelectorAll('[data-action="trigger-mobile-menu"]');`,
' for (const trigger of [...triggers]) {',
' trigger.addEventListener("click", function () {',
' drawer.opened = true;',
' });',
' }',
' </script>',
' </body>',
'</html>',
].join('\n'),

View File

@@ -1,26 +1,5 @@
# Change Log
## 0.7.1
### Patch Changes
- 2b7f1ee: Add support for pathprefix
## 0.7.0
### Minor Changes
- a8e66d8: Extract building of the JavaScript setup code into a unified plugin called mdjsSetupCode
- fe6a929: For the story preview keep the original code block around to get code highlighting from the main document. This enables styling and reduces the code complexity.
### Patch Changes
- a8e66d8: You can provide a highlightCode function to the mdjsSetupCode unified plugin
- Updated dependencies [edb1abf]
- Updated dependencies [604a80e]
- @mdjs/mdjs-preview@0.4.0
- @mdjs/mdjs-story@0.2.0
## 0.6.2
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@mdjs/core",
"version": "0.7.1",
"version": "0.6.2",
"publishConfig": {
"access": "public"
},
@@ -43,8 +43,8 @@
"remark"
],
"dependencies": {
"@mdjs/mdjs-preview": "^0.4.2",
"@mdjs/mdjs-story": "^0.2.0",
"@mdjs/mdjs-preview": "^0.3.2",
"@mdjs/mdjs-story": "^0.1.2",
"@types/unist": "^2.0.3",
"es-module-lexer": "^0.3.26",
"github-markdown-css": "^4.0.0",

View File

@@ -1,43 +1,11 @@
const path = require('path');
const slash = require('slash');
/** @typedef {import('vfile').VFileOptions} VFileOptions */
/** @typedef {import('unist').Node} Node */
/** @typedef {import('@mdjs/core/types/code').Story} Story */
/**
* @typedef {Object} simulationSettings
* @property {string} [simulatorUrl]
*/
/**
* @typedef {Object} rocketConfig
* @property {string} [pathPrefix]
*/
/**
* @param {object} options
* @param {string} [options.rootNodeQueryCode]
* @param {simulationSettings} [options.simulationSettings]
* @param {rocketConfig} [options.rocketConfig]
* @returns
*/
function mdjsSetupCode({
rootNodeQueryCode = 'document',
simulationSettings = {},
rocketConfig = {},
highlightCode = /** @param {string} code */ code => code,
} = {}) {
if (rocketConfig && rocketConfig.pathPrefix) {
if (simulationSettings && simulationSettings.simulatorUrl) {
const { simulatorUrl } = simulationSettings;
if (simulatorUrl[0] === '/' && !simulatorUrl.startsWith(rocketConfig.pathPrefix)) {
simulationSettings.simulatorUrl = slash(
path.join(rocketConfig.pathPrefix, simulationSettings.simulatorUrl),
);
}
}
}
/**
* @param {Node} tree
* @param {VFileOptions} file
@@ -52,32 +20,40 @@ function mdjsSetupCode({
const invokeStoriesCode = [];
for (const story of stories) {
invokeStoriesCode.push(`{ key: '${story.key}', story: ${story.key} }`);
let code = '';
switch (story.type) {
case 'html':
code = `\`\`\`html\n${story.code.split('`')[1]}\n\`\`\``;
break;
case 'js':
code = `\`\`\`js\n${story.code}\n\`\`\``;
break;
default:
break;
}
let highlightedCode = await highlightCode(code);
highlightedCode = highlightedCode.replace(/`/g, '\\`').replace(/\$/g, '\\$');
invokeStoriesCode.push(
`{ key: '${story.key}', story: ${story.key}, code: \`${highlightedCode}\` }`,
);
}
file.data.setupJsCode = [
'/** script code **/',
jsCode,
'/** stories code **/',
storiesCode,
'/** stories setup code **/',
`const rootNode = ${rootNodeQueryCode};`,
`const stories = [${invokeStoriesCode.join(', ')}];`,
'let needsMdjsElements = false;',
`for (const story of stories) {`,
// eslint-disable-next-line no-template-curly-in-string
' const storyEl = rootNode.querySelector(`[mdjs-story-name="${story.key}"]`);',
' if (storyEl) {',
` storyEl.story = story.story;`,
` storyEl.key = story.key;`,
` needsMdjsElements = true;`,
` Object.assign(storyEl, ${JSON.stringify(simulationSettings)});`,
' }',
` storyEl.codeHasHtml = true;`,
` storyEl.story = story.story;`,
` storyEl.code = story.code;`,
` storyEl.jsCode = \`${jsCode.replace(/`/g, '\\`')}\`;`,
`};`,
'if (needsMdjsElements) {',
` if (!customElements.get('mdjs-preview')) { import('@mdjs/mdjs-preview/define'); }`,
` if (!customElements.get('mdjs-story')) { import('@mdjs/mdjs-story/define'); }`,
'}',
`if (!customElements.get('mdjs-preview')) { import('@mdjs/mdjs-preview/mdjs-preview.js'); }`,
`if (!customElements.get('mdjs-story')) { import('@mdjs/mdjs-story/mdjs-story.js'); }`,
].join('\n');
}

View File

@@ -3,7 +3,6 @@
/** @typedef {import('@mdjs/core/types/code').StoryTypes} StoryTypes */
/** @typedef {(name: string) => string} TagFunction */
/** @typedef {import('unist').Node} UnistNode */
/** @typedef {import('unist').Parent} UnistParent */
/** @typedef {import('vfile').VFileOptions} VFileOptions */
const visit = require('unist-util-visit');
@@ -41,7 +40,7 @@ function defaultStoryTag(name) {
* @param {string} name
*/
function defaultPreviewStoryTag(name) {
return `<mdjs-preview mdjs-story-name="${name}">[[CODE SLOT]]</mdjs-preview>`;
return `<mdjs-preview mdjs-story-name="${name}"></mdjs-preview>`;
}
/**
@@ -56,16 +55,14 @@ function mdjsStoryParse({
} = {}) {
/** @type {Story[]} */
const stories = [];
let htmlIndex = 0;
let index = 0;
/* eslint-disable no-param-reassign */
/**
* @param {UnistNode} node
* @param {number} index
* @param {UnistParent} parent
*/
const nodeCodeVisitor = (node, index, parent) => {
const nodeCodeVisitor = node => {
if (node.lang === 'js' && node.meta === 'story' && typeof node.value === 'string') {
const storyData = extractStoryData(node.value);
node.type = 'html';
@@ -74,65 +71,30 @@ function mdjsStoryParse({
}
if (node.lang === 'js' && node.meta === 'preview-story' && typeof node.value === 'string') {
const storyData = extractStoryData(node.value);
const newValue = previewStoryTag(storyData.name);
if (newValue.includes('[[CODE SLOT]]')) {
const tagParts = newValue.split('[[CODE SLOT]]');
node = {
type: 'root',
children: [
{ type: 'html', value: tagParts[0] },
{ type: 'text', value: '\n\n' },
node,
{ type: 'text', value: '\n\n' },
{ type: 'html', value: tagParts[1] },
],
};
parent.children.splice(index, 1, node);
} else {
node.type = 'html';
node.value = previewStoryTag(storyData.name);
}
node.type = 'html';
node.value = previewStoryTag(storyData.name);
stories.push(storyData);
}
if (node.lang === 'html' && node.meta === 'story') {
const storyData = extractStoryData(
`export const HtmlStory${htmlIndex} = () => html\`${node.value}\`;`,
`export const HtmlStory${index} = () => html\`${node.value}\`;`,
{ type: 'html' },
);
node.type = 'html';
node.value = storyTag(storyData.name);
stories.push(storyData);
htmlIndex += 1;
index += 1;
}
if (node.lang === 'html' && node.meta === 'preview-story') {
const storyData = extractStoryData(
`export const HtmlStory${htmlIndex} = () => html\`${node.value}\`;`,
`export const HtmlStory${index} = () => html\`${node.value}\`;`,
{ type: 'html' },
);
const newValue = previewStoryTag(storyData.name);
if (newValue.includes('[[CODE SLOT]]')) {
const tagParts = newValue.split('[[CODE SLOT]]');
node = {
type: 'root',
children: [
{ type: 'html', value: tagParts[0] },
{ type: 'text', value: '\n\n' },
node,
{ type: 'text', value: '\n\n' },
{ type: 'html', value: tagParts[1] },
],
};
parent.children.splice(index, 1, node);
} else {
node.type = 'html';
node.value = previewStoryTag(storyData.name);
}
node.type = 'html';
node.value = previewStoryTag(storyData.name);
stories.push(storyData);
htmlIndex += 1;
index += 1;
}
};

View File

@@ -45,16 +45,7 @@ describe('Integration', () => {
'<pre><code class="language-js">const foo = 1;',
'</code></pre>',
'<mdjs-story mdjs-story-name="fooStory"></mdjs-story>',
'<mdjs-preview mdjs-story-name="fooPreviewStory">',
'',
'',
'',
'<pre><code class="language-js">export const fooPreviewStory = () => {}',
'</code></pre>',
'',
'',
'',
'</mdjs-preview>',
'<mdjs-preview mdjs-story-name="fooPreviewStory"></mdjs-preview>',
];
const parser = unified()

View File

@@ -1,7 +1,6 @@
/* eslint-disable no-template-curly-in-string */
const chai = require('chai');
const { adjustPluginOptions } = require('plugins-manager');
const { mdjsProcess } = require('../src/mdjsProcess.js');
const { expect } = chai;
@@ -29,40 +28,25 @@ describe('mdjsProcess', () => {
'<pre class="language-js"><code class="language-js"><span class="token keyword">const</span> foo <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>',
'</code></pre>',
'<mdjs-story mdjs-story-name="fooStory"></mdjs-story>',
'<mdjs-preview mdjs-story-name="fooPreviewStory">',
'',
'',
'',
'<pre class="language-js"><code class="language-js"><span class="token keyword module">export</span> <span class="token keyword">const</span> <span class="token function-variable function">fooPreviewStory</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=></span> <span class="token punctuation">{</span><span class="token punctuation">}</span>',
'</code></pre>',
'',
'',
'',
'</mdjs-preview>',
'<mdjs-preview mdjs-story-name="fooPreviewStory"></mdjs-preview>',
].join('\n');
const expectedJsCode = [
'/** script code **/',
'const bar = 2;',
'/** stories code **/',
'export const fooStory = () => {}',
'export const fooPreviewStory = () => {}',
'/** stories setup code **/',
'const rootNode = document;',
`const stories = [{ key: 'fooStory', story: fooStory }, { key: 'fooPreviewStory', story: fooPreviewStory }];`,
'let needsMdjsElements = false;',
`const stories = [{ key: 'fooStory', story: fooStory, code: \`<pre class="language-js"><code class="language-js"><span class="token keyword module">export</span> <span class="token keyword">const</span> <span class="token function-variable function">fooStory</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=></span> <span class="token punctuation">{</span><span class="token punctuation">}</span>`,
`</code></pre>\` }, { key: 'fooPreviewStory', story: fooPreviewStory, code: \`<pre class="language-js"><code class="language-js"><span class="token keyword module">export</span> <span class="token keyword">const</span> <span class="token function-variable function">fooPreviewStory</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=></span> <span class="token punctuation">{</span><span class="token punctuation">}</span>`,
`</code></pre>\` }];`,
'for (const story of stories) {',
' const storyEl = rootNode.querySelector(`[mdjs-story-name="${story.key}"]`);',
' if (storyEl) {',
' storyEl.story = story.story;',
' storyEl.key = story.key;',
' needsMdjsElements = true;',
' Object.assign(storyEl, {});',
' }',
' storyEl.codeHasHtml = true;',
' storyEl.story = story.story;',
' storyEl.code = story.code;',
' storyEl.jsCode = `const bar = 2;`;',
'};',
'if (needsMdjsElements) {',
` if (!customElements.get('mdjs-preview')) { import('@mdjs/mdjs-preview/define'); }`,
` if (!customElements.get('mdjs-story')) { import('@mdjs/mdjs-story/define'); }`,
'}',
`if (!customElements.get('mdjs-preview')) { import('@mdjs/mdjs-preview/mdjs-preview.js'); }`,
`if (!customElements.get('mdjs-story')) { import('@mdjs/mdjs-story/mdjs-story.js'); }`,
].join('\n');
const result = await mdjsProcess(input);
@@ -168,45 +152,4 @@ describe('mdjsProcess', () => {
const result = await mdjsProcess(input);
expect(result.html.trim()).to.equal(expected);
});
it('can adjust languages for story preview', async () => {
const input = [
'Intro',
'```js preview-story',
'export const fooPreviewStory = () => {}',
'```',
].join('\n');
const expected = [
`/** script code **/`,
``,
`/** stories code **/`,
`export const fooPreviewStory = () => {}`,
`/** stories setup code **/`,
`const rootNode = document;`,
`const stories = [{ key: 'fooPreviewStory', story: fooPreviewStory }];`,
`let needsMdjsElements = false;`,
`for (const story of stories) {`,
' const storyEl = rootNode.querySelector(`[mdjs-story-name="${story.key}"]`);',
` if (storyEl) {`,
` storyEl.story = story.story;`,
` storyEl.key = story.key;`,
` needsMdjsElements = true;`,
' Object.assign(storyEl, {"languages":[{"key":"en","name":"English"}]});',
` }`,
`};`,
`if (needsMdjsElements) {`,
` if (!customElements.get('mdjs-preview')) { import('@mdjs/mdjs-preview/define'); }`,
` if (!customElements.get('mdjs-story')) { import('@mdjs/mdjs-story/define'); }`,
`}`,
].join('\n');
const result = await mdjsProcess(input, {
setupUnifiedPlugins: [
adjustPluginOptions('mdjsSetupCode', {
simulationSettings: { languages: [{ key: 'en', name: 'English' }] },
}),
],
});
expect(result.jsCode.trim()).to.equal(expected);
});
});

View File

@@ -37,27 +37,9 @@ describe('mdjsStoryParse', () => {
'<pre><code class="language-js">const foo = 1;',
'</code></pre>',
'<mdjs-story mdjs-story-name="fooStory"></mdjs-story>',
'<mdjs-preview mdjs-story-name="fooPreviewStory">',
'',
'',
'',
'<pre><code class="language-js">export const fooPreviewStory = () => {}',
'</code></pre>',
'',
'',
'',
'</mdjs-preview>',
'<mdjs-preview mdjs-story-name="fooPreviewStory"></mdjs-preview>',
'<mdjs-story mdjs-story-name="HtmlStory0"></mdjs-story>',
'<mdjs-preview mdjs-story-name="HtmlStory1">',
'',
'',
'',
'<pre><code class="language-html">&#x3C;demo-el>&#x3C;/demo-el>',
'</code></pre>',
'',
'',
'',
'</mdjs-preview>',
'<mdjs-preview mdjs-story-name="HtmlStory1"></mdjs-preview>',
'',
].join('\n');

View File

@@ -1,32 +1,5 @@
# @mdjs/mdjs-preview
## 0.4.2
### Patch Changes
- 72f631a: Improve customizations by hiding empty themes, platforms and adding parts to be styled.
- 74dd8d1: Autoheight will not grow bigger than the current size height
- 72f631a: Add a copy code button
## 0.4.1
### Patch Changes
- 0f6709a: Make sure initial settings are taken from the element if nothing is yet stored
## 0.4.0
### Minor Changes
- edb1abf: Reworking completely by
- slotting in the highlighted code
- open story in dedicated window
- enabling an simulation mode that can render the story in an iframe
- share settings between all simulators
- option to remember simulator settings
- force side effect import via `/define`
## 0.3.2
### Patch Changes

View File

@@ -1,3 +1,3 @@
import { MdJsPreview } from '../MdJsPreview.js';
import { MdJsPreview } from './src/MdJsPreview.js';
customElements.define('mdjs-preview', MdJsPreview);

View File

@@ -1,6 +1,6 @@
{
"name": "@mdjs/mdjs-preview",
"version": "0.4.2",
"version": "0.3.2",
"publishConfig": {
"access": "public"
},
@@ -17,7 +17,7 @@
"type": "module",
"exports": {
".": "./index.js",
"./define": "./src/define/define.js"
"./mdjs-preview.js": "./mdjs-preview.js"
},
"scripts": {
"debug": "cd ../../ && npm run debug -- --group mdjs-preview",
@@ -32,8 +32,8 @@
"src"
],
"dependencies": {
"@lion/accordion": "^0.4.2",
"lit-element": "^2.4.0"
"lit-element": "^2.4.0",
"lit-html": "^1.3.0"
},
"types": "dist-types/index.d.ts"
}

View File

@@ -1,13 +1,5 @@
import { LitElement, html, css } from 'lit-element';
import '@lion/accordion/define';
import {
subscribe,
unSubscribe,
saveToSharedStates,
applySharedStates,
} from './mdjsViewerSharedStates.js';
import { addResizeHandler } from './resizeHandler.js';
import { unsafeHTML } from 'lit-html/directives/unsafe-html.js';
/**
* @typedef {object} StoryOptions
@@ -28,801 +20,160 @@ export class MdJsPreview extends LitElement {
story: {
attribute: false,
},
key: {
code: {
type: String,
},
deviceMode: {
codeHasHtml: {
type: Boolean,
attribute: 'device-mode',
},
showCode: {
type: Boolean,
attribute: 'show-code',
reflect: true,
},
sameSettings: { type: Boolean },
contentHeight: { type: Number },
simulatorUrl: { type: String },
// page settings
platform: { type: String },
platforms: { type: Array },
size: { type: String },
sizes: { type: Array },
theme: { type: String, reflect: true },
themes: { type: Array },
language: { type: String },
languages: { type: Array },
edgeDistance: { type: Boolean },
autoHeight: { type: Boolean },
rememberSettings: { type: Boolean },
__copyButtonText: { type: String },
};
}
toggleShowCode() {
this.showCode = !this.showCode;
}
constructor() {
super();
this.code = '';
/** @type {LitHtmlStoryFn} */
this.story = () => html` <p>Loading...</p> `;
this.key = '';
this.contentHeight = 0;
this.simulatorUrl = '';
this.__supportsClipboard = 'clipboard' in navigator;
this.__copyButtonText = 'Copy Code';
this.theme = 'light';
/** @type {{ key: string, name: string }[]} */
this.themes = [
// { key: 'light', name: 'Light' },
// { key: 'dark', name: 'Dark' },
];
this.language = 'en-US';
this.languages = [
{ key: 'en', name: 'English' },
{ key: 'en-US', name: 'English (United States)' },
{ key: 'en-GB', name: 'English (United Kingdom)' },
{ key: 'de', name: 'German' },
{ key: 'es', name: 'Spanish' },
{ key: 'fi', name: 'Finnish' },
{ key: 'fr', name: 'French' },
{ key: 'it', name: 'Italian' },
{ key: 'nl', name: 'Dutch' },
{ key: 'pl', name: 'Polish' },
{ key: 'pt', name: 'Portuguese' },
{ key: 'ro', name: 'Romanian' },
{ key: 'sv', name: 'Swedish' },
];
this.platform = 'web';
/** @type {{ key: string, name: string }[]} */
this.platforms = [
// { key: 'web', name: 'Web' },
// { key: 'web-windows', name: 'Windows' },
// { key: 'web-mac', name: 'Mac' },
// { key: 'android', name: 'Android' },
// { key: 'ios', name: 'iOS' },
];
this.size = 'webSmall';
this.sizes = [
{
key: 'webSmall',
name: 'Small',
platform: 'web',
width: 360,
height: 640,
dpr: 1,
},
{
key: 'webMedium',
name: 'Medium',
platform: 'web',
width: 640,
height: 640,
dpr: 1,
},
{
key: 'webLarge',
name: 'Large',
platform: 'web',
width: 1024,
height: 640,
dpr: 1,
},
{
key: 'pixel2',
name: 'Pixel 2',
platform: 'android',
width: 411,
height: 731,
dpr: 2.6,
},
{
key: 'galaxyS5',
name: 'Galaxy S5',
platform: 'android',
width: 360,
height: 640,
dpr: 3,
},
{
key: 'iphoneX',
name: 'iPhone X',
platform: 'ios',
width: 375,
height: 812,
dpr: 3,
},
{
key: 'iPad',
name: 'iPad',
platform: 'ios',
width: 768,
height: 1024,
dpr: 2,
},
];
this.deviceMode = false;
this.autoHeight = true;
this.edgeDistance = true;
this.sameSettings = true;
this.rememberSettings = false;
this.__firstRun = true;
this.__syncUp = false;
}
connectedCallback() {
super.connectedCallback();
if (this.sameSettings) {
applySharedStates(this);
}
addResizeHandler();
}
get baseUrl() {
return document.location.origin;
}
get deviceHeight() {
const maxHeight = this.sizeData?.height || 50;
if (this.autoHeight) {
return Math.min(this.contentHeight, maxHeight);
}
return maxHeight;
}
/**
* @param {string} platform
*/
getSizesFor(platform) {
return this.sizes.filter(el => el.platform === platform);
}
get sizeData() {
return (
this.sizes.find(el => el.key === this.size) || { width: 50, height: 50, name: 'default' }
);
}
onSubscribe = () => {
this.__syncUp = false;
applySharedStates(this);
this.__syncUp = true;
};
/**
* @param {import('lit-element').PropertyValues} changeProps
*/
update(changeProps) {
super.update(changeProps);
if (this.sameSettings && this.__syncUp) {
saveToSharedStates(this, this.onSubscribe);
}
if (changeProps.has('sameSettings')) {
if (this.sameSettings) {
subscribe(this.onSubscribe);
} else {
unSubscribe(this.onSubscribe);
}
}
}
disconnectedCallback() {
super.disconnectedCallback();
if (this.sameSettings) {
unSubscribe(this.onSubscribe);
}
}
firstUpdated() {
this.__syncUp = true;
}
get iframeUrl() {
const mdjsSetupScript = /** @type {HTMLScriptElement} */ (document.querySelector(
'script[type=module][mdjs-setup]',
));
if (!mdjsSetupScript) {
throw new Error('Could not find a <script type="module" src="..." mdjs-setup></script>');
}
const params = new URLSearchParams();
params.set('story-file', mdjsSetupScript.src);
params.set('story-key', this.key);
params.set('theme', this.theme);
params.set('platform', this.platform);
params.set('language', this.language);
params.set('edge-distance', this.edgeDistance.toString());
const links = /** @type {HTMLLinkElement[]} */ ([
...document.querySelectorAll('link[mdjs-use]'),
]);
for (const link of links) {
if (link.href) {
params.append('stylesheets', link.href);
}
}
return `${this.simulatorUrl}#?${params.toString()}`;
}
/**
* @param {string} platform
*/
changePlatform(platform) {
this.platform = platform;
const sizes = this.getSizesFor(this.platform);
this.size = sizes[0].key;
}
async onCopy() {
if (this.textContent) {
await navigator.clipboard.writeText(this.textContent.trim());
this.__copyButtonText = 'Copied ✅';
setTimeout(() => {
this.__copyButtonText = 'Copy code';
}, 2000);
}
}
renderPlatforms() {
if (this.platforms.length) {
return html`
<h4>Platform</h4>
<div
class="segmented-control"
@change=${
/** @param {Event} ev */ ev => {
if (ev.target) {
this.changePlatform(/** @type {HTMLInputElement} */ (ev.target).value);
}
}
}
>
${this.platforms.map(
platform => html`
<label class="${this.platform === platform.key ? 'selected' : ''}">
<span>${platform.name}</span>
<input
type="radio"
name="platform"
value="${platform.key}"
?checked=${this.platform === platform.key}
/>
</label>
`,
)}
</div>
`;
}
}
renderPlatform() {
if (this.platforms.length) {
return html`
<div>
<h3>Platform</h3>
${this.renderPlatforms()}
</div>
`;
}
}
renderSizes() {
if (this.sizes.length) {
return html`
<h4>Size</h4>
<div
class="segmented-control"
@change=${
/** @param {Event} ev */ ev => {
if (ev.target) {
this.size = /** @type {HTMLInputElement} */ (ev.target).value;
}
}
}
>
${this.getSizesFor(this.platform).map(
size => html`
<label class="${this.size === size.key ? 'selected' : ''}">
<span>${size.name}</span>
<input
type="radio"
name="size"
value="${size.key}"
.checked=${this.size === size.key}
/>
</label>
`,
)}
</div>
`;
}
}
renderViewport() {
return html`
<div>
<h3>Viewport</h3>
${this.renderSizes()} ${this.renderAutoHeight()}
</div>
`;
}
renderThemes() {
if (this.themes.length) {
return html`
<div
class="segmented-control"
@change=${
/** @param {Event} ev */ ev => {
if (ev.target) {
this.theme = /** @type {HTMLInputElement} */ (ev.target).value;
}
}
}
>
${this.themes.map(
theme => html`
<label class="${this.theme === theme.key ? 'selected' : ''}">
<span>${theme.name}</span>
<input
type="radio"
name="theme"
value="${theme.key}"
?checked=${this.theme === theme.key}
/>
</label>
`,
)}
</div>
`;
}
}
renderVisual() {
return html`
<div>
<h3>Visual</h3>
${this.renderThemes()} ${this.renderEdgeDistance()}
</div>
`;
}
renderLanguages() {
if (this.languages.length) {
return html`
<label>
Language
<select
@change=${
/** @param {Event} ev */ ev => {
if (ev.target) {
this.language = /** @type {HTMLInputElement} */ (ev.target).value;
}
}
}
>
${this.languages.map(
language => html`
<option value="${language.key}" ?selected=${this.language === language.key}>
${language.name}
</option>
`,
)}
</select>
</label>
`;
}
}
renderLocalization() {
return html`
<div>
<h3>Localization</h3>
${this.renderLanguages()}
</div>
`;
}
renderEdgeDistance() {
return html`
<div>
<label class="${this.edgeDistance ? 'switch selected' : 'switch'}">
Apply distance to edge
<span part="switch-button"></span>
<input
type="checkbox"
?checked=${this.edgeDistance}
@change=${
/** @param {Event} ev */ ev => {
if (ev.target) {
this.edgeDistance = /** @type {HTMLInputElement} */ (ev.target).checked;
}
}
}
/>
</label>
</div>
`;
}
renderAutoHeight() {
return html`
<div>
<label class="${this.autoHeight ? 'switch selected' : 'switch'}">
Fit height to content
<span part="switch-button"></span>
<input
type="checkbox"
?checked=${this.autoHeight}
@change=${
/** @param {Event} ev */ ev => {
if (ev.target) {
this.autoHeight = /** @type {HTMLInputElement} */ (ev.target).checked;
}
}
}
/>
</label>
</div>
`;
}
renderSameSettings() {
return html`
<div>
<label class="${this.sameSettings ? 'switch selected' : 'switch'}">
Same settings for all simulations
<span part="switch-button"></span>
<input
type="checkbox"
?checked=${this.sameSettings}
@change=${
/** @param {Event} ev */ ev => {
if (ev.target) {
this.sameSettings = /** @type {HTMLInputElement} */ (ev.target).checked;
}
}
}
/>
</label>
</div>
`;
}
renderRememberSettings() {
if (!this.sameSettings) {
return html``;
}
return html`
<div>
<label class="${this.rememberSettings ? 'switch selected' : 'switch'}">
Remember settings
<span part="switch-button"></span>
<input
type="checkbox"
?checked=${this.rememberSettings}
@change=${
/** @param {Event} ev */ ev => {
if (ev.target) {
this.rememberSettings = /** @type {HTMLInputElement} */ (ev.target).checked;
}
}
}
/>
</label>
</div>
`;
}
renderSyncSettings() {
return html`
<div>
<h3>Global</h3>
${this.renderSameSettings()} ${this.renderRememberSettings()}
</div>
`;
this.codeHasHtml = false;
}
render() {
return html`
<div id="wrapper">
${this.deviceMode === false
? html`<div>${this.story({ shadowRoot: this.shadowRoot })}</div>`
: html`
<iframe
part="iframe"
csp=${`script-src ${document.location.origin} 'unsafe-inline'; connect-src ws://${document.location.host}/`}
.src=${this.iframeUrl}
style=${`width: ${this.sizeData.width}px; height: ${this.deviceHeight}px;`}
></iframe>
<p part="frame-description" style=${`width: ${this.sizeData.width + 4}px;`}>
${this.sizeData.name} - ${this.deviceHeight}x${this.sizeData.width}
</p>
`}
<div>${this.story({ shadowRoot: this.shadowRoot })}</div>
<button id="showCodeButton" @click=${this.toggleShowCode}>show code</button>
</div>
<lion-accordion class="options">
${this.deviceMode
? html`
<h3 slot="invoker">
<button>Settings</button>
</h3>
<div slot="content">
<div class="settings-wrapper">
${this.renderPlatform()} ${this.renderViewport()} ${this.renderVisual()}
${this.renderLocalization()} ${this.renderSyncSettings()}
</div>
</div>
`
: ''}
<h3 slot="invoker">
<button>Code</button>
</h3>
<div slot="content">
<slot id="code-slot"></slot>
<button part="copy-button" @click="${this.onCopy}" ?hidden="${!this.__supportsClipboard}">
${this.__copyButtonText}
</button>
</div>
</lion-accordion>
${this.simulatorUrl
? html`
<div class="controls">
<a href=${this.iframeUrl} target="_blank">Open simulation in new window</a>
<button
@click=${() => (this.deviceMode = !this.deviceMode)}
class="simulation-toggle"
>
${this.deviceMode ? html`Disable` : html`Enable`} device simulation
</button>
</div>
`
: ''}
${this.codeHasHtml ? unsafeHTML(this.code) : html`<pre><code>${this.code}</code></pre>`}
`;
}
static get styles() {
return css`
:host {
border: 1px solid #ccc;
display: block;
padding-bottom: 10px;
box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px;
}
iframe {
border: 2px solid #4caf50;
background: #fff;
}
[part='copy-button'] {
border: 1px solid var(--primary-color, #3f51b5);
border-radius: 9px;
padding: 7px;
background: none;
font-weight: bold;
color: var(--primary-color, #3f51b5);
text-align: center;
#showCodeButton {
position: absolute;
right: 5px;
bottom: 5px;
font-size: 12px;
line-height: 12px;
float: right;
margin-top: -10px;
}
[part='copy-button']:hover {
background-color: var(--primary-color, #3f51b5);
color: #fff;
}
.switch {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
}
.switch:focus-within [part='switch-button'] {
box-shadow: 0 0 0 1px hsl(0deg 0% 100% / 40%), 0 0 0 4px rgb(31 117 203 / 48%);
}
[part='switch-button'] {
line-height: 20px;
color: #24292e;
background-color: #eff3f6;
background-image: linear-gradient(-180deg, #fafbfc, #eff3f6 90%);
display: inline-block;
width: 44px;
background: #808080;
height: 25px;
border-radius: 15px;
position: relative;
}
[part='switch-button']::after {
content: ' ';
width: 18px;
height: 18px;
border-radius: 10px;
background: rgb(255, 255, 255);
display: block;
position: absolute;
top: 3px;
left: 4px;
}
.switch.selected [part='switch-button'] {
background: var(--primary-color, #008000);
}
.switch.selected [part='switch-button']::after {
left: auto;
right: 4px;
}
[part='frame-description'] {
margin: -5px 0 10px 0;
text-align: right;
font-size: 12px;
color: #333;
}
.settings-wrapper {
display: grid;
grid-template-columns: 1fr;
grid-gap: 20px 40px;
max-width: 650px;
}
@media (min-width: 640px) {
.settings-wrapper {
grid-template-columns: repeat(2, 1fr);
}
}
.settings-wrapper h3 {
margin: 10px 0;
font-size: 16px;
}
.options {
display: block;
padding: 15px 0;
}
.controls {
display: flex;
justify-content: space-between;
}
.controls a {
color: var(--primary-color, #3f51b5);
font-size: 14px;
line-height: 37px;
}
.simulation-toggle {
border: 1px solid var(--primary-color, #3f51b5);
border-radius: 9px;
padding: 10px;
background: none;
font-weight: bold;
color: var(--primary-color, #3f51b5);
text-align: center;
}
.simulation-toggle:hover {
background-color: var(--primary-color, #3f51b5);
color: #fff;
}
h3[slot='invoker'] button {
font-size: 16px;
display: block;
position: relative;
padding: 10px;
border: none;
border-bottom: 1px solid #bbb;
width: 100%;
background: none;
text-align: left;
font-weight: bold;
}
h3[slot='invoker'] button::after {
content: '>';
right: 20px;
top: 10px;
position: absolute;
transform: rotate(90deg);
}
h3[slot='invoker'][expanded='true'] button::after {
transform: rotate(-90deg);
}
h3[slot='invoker'][expanded='true'] button {
border-bottom: none;
}
[slot='content'] {
border-bottom: 1px solid #bbb;
padding: 10px;
}
h3[slot='invoker']:first-child button {
border-top: 1px solid #bbb;
}
h4 {
font-weight: normal;
font-size: 14px;
margin: 5px 0;
}
.segmented-control {
border: 1px solid var(--primary-color, #3f51b5);
border-radius: 18px;
display: inline-block;
font-size: 14px;
margin-bottom: 10px;
}
.segmented-control span {
padding: 5px 10px;
display: inline-block;
border-radius: 18px;
margin: 2px 0;
}
.segmented-control label:first-child span {
margin-left: 2px;
}
.segmented-control label:last-child span {
margin-right: 2px;
}
.segmented-control label.selected span {
background: var(--primary-color, #3f51b5);
color: #fff;
}
.segmented-control label:focus-within span {
box-shadow: 0 0 0 1px hsl(0deg 0% 100% / 40%), 0 0 0 4px rgb(31 117 203 / 48%);
}
.segmented-control input,
.switch input {
clip: rect(0 0 0 0);
clip-path: inset(50%);
height: 1px;
overflow: hidden;
position: absolute;
padding: 3px 12px;
white-space: nowrap;
width: 1px;
vertical-align: middle;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-repeat: repeat-x;
background-position: -1px -1px;
background-size: 110% 110%;
border: 1px solid rgba(27, 31, 35, 0.2);
border-radius: 0.25em;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
select {
display: block;
padding: 5px;
border: 1px solid #333;
#showCodeButton:hover {
background-color: #e6ebf1;
background-image: linear-gradient(-180deg, #f0f3f6, #e6ebf1 90%);
background-position: -0.5em;
border-color: rgba(27, 31, 35, 0.35);
text-decoration: none;
background-repeat: repeat-x;
}
#wrapper {
position: relative;
padding: 10px;
}
:host > pre {
display: none;
margin: 0;
padding: 16px;
overflow: auto;
font-size: 85%;
line-height: 1.45;
background-color: #f6f8fa;
border-radius: 3px;
}
:host([show-code]) > pre {
display: block;
}
code[class*='language-'],
pre[class*='language-'] {
color: #393a34;
font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
direction: ltr;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
tab-size: 4;
hyphens: none;
overflow: auto;
font-size: 85%;
line-height: 1.45;
background-color: #f6f8fa;
border-radius: 3px;
}
.token.function,
.token.class-name {
color: #6f42c1;
}
.token.tag,
.token.selector,
.language-autohotkey .token.keyword {
color: #22863a;
}
.token.entity,
.token.url,
.token.symbol,
.token.number,
.token.boolean,
.token.variable,
.token.constant,
.token.property,
.token.inserted,
.token.punctuation,
.token.operator {
color: #005cc5;
}
.token.regex {
color: #032f62;
}
.token.atrule,
.token.keyword,
.token.attr-name,
.language-autohotkey .token.selector {
color: #d73a49;
}
`;
}
}

View File

@@ -1,132 +0,0 @@
const _sharedStates = {
platform: 'web',
size: 'webSmall',
theme: 'light',
language: 'en',
autoHeight: true,
deviceMode: false,
rememberSettings: false,
edgeDistance: true,
};
/** @type {Function[]} */
let subscribeFns = [];
/**
* @param {Function} subscribeFn
*/
export function subscribe(subscribeFn) {
subscribeFns.push(subscribeFn);
}
/**
* @param {Function} subscribeFn
*/
export function unSubscribe(subscribeFn) {
subscribeFns = subscribeFns.filter(fn => fn !== subscribeFn);
}
function storeSettings() {
for (const _sharedStateKey of Object.keys(_sharedStates)) {
const sharedStateKey = /** @type {keyof _sharedStates} */ (_sharedStateKey);
if (_sharedStates.rememberSettings) {
localStorage.setItem(
`mdjsViewerSharedStates-${sharedStateKey}`,
_sharedStates[sharedStateKey].toString(),
);
} else {
localStorage.removeItem(`mdjsViewerSharedStates-${sharedStateKey}`);
}
}
}
let hasGlobalStateBeenSetBefore = false;
function restoreSettings() {
for (const _sharedStateKey of Object.keys(_sharedStates)) {
const sharedStateKey = /** @type {keyof _sharedStates} */ (_sharedStateKey);
const restoredValue = localStorage.getItem(`mdjsViewerSharedStates-${sharedStateKey}`);
if (restoredValue !== null) {
switch (sharedStateKey) {
case 'autoHeight':
case 'deviceMode':
case 'rememberSettings':
case 'edgeDistance':
_sharedStates[sharedStateKey] = restoredValue === 'true' ? true : false;
break;
default:
_sharedStates[sharedStateKey] = restoredValue;
}
hasGlobalStateBeenSetBefore = true;
}
}
}
restoreSettings();
/**
*
* @param {import('./MdJsPreview.js').MdJsPreview} target
*/
export function applySharedStates(target) {
if (hasGlobalStateBeenSetBefore) {
for (const _sharedStateKey of Object.keys(_sharedStates)) {
const sharedStateKey = /** @type {keyof _sharedStates} */ (_sharedStateKey);
switch (sharedStateKey) {
case 'autoHeight':
case 'deviceMode':
case 'rememberSettings':
case 'edgeDistance':
target[sharedStateKey] = _sharedStates[sharedStateKey];
break;
default:
target[sharedStateKey] = _sharedStates[sharedStateKey];
}
}
} else {
_saveToSharedStates(target);
}
}
/**
*
* @param {import('./MdJsPreview.js').MdJsPreview} target
*/
function _saveToSharedStates(target) {
let updated = false;
for (const _sharedStateKey of Object.keys(_sharedStates)) {
const sharedStateKey = /** @type {keyof _sharedStates} */ (_sharedStateKey);
if (_sharedStates[sharedStateKey] !== target[sharedStateKey]) {
switch (sharedStateKey) {
case 'autoHeight':
case 'deviceMode':
case 'rememberSettings':
case 'edgeDistance':
_sharedStates[sharedStateKey] = target[sharedStateKey];
break;
default:
_sharedStates[sharedStateKey] = target[sharedStateKey];
}
updated = true;
hasGlobalStateBeenSetBefore = true;
}
}
return updated;
}
/**
*
* @param {import('./MdJsPreview.js').MdJsPreview} target
* @param {Function} subscribedFn
*/
export function saveToSharedStates(target, subscribedFn) {
const updated = _saveToSharedStates(target);
if (updated) {
storeSettings();
for (const subscribeFn of subscribeFns) {
if (subscribeFn !== subscribedFn) {
subscribeFn();
}
}
}
}

View File

@@ -1,19 +0,0 @@
let addedCount = 0;
export function addResizeHandler() {
if (addedCount > 0) {
addedCount += 1;
return;
}
window.addEventListener('message', ev => {
const data = JSON.parse(ev.data);
if (data.action === 'mdjs-viewer-resize') {
const viewer = /** @type {import('./MdJsPreview.js').MdJsPreview} */ (document.body.querySelector(
`[mdjs-story-name="${data.storyKey}"]`,
));
if (viewer) {
viewer.contentHeight = data.height;
}
}
});
}

View File

@@ -1,38 +0,0 @@
import { expect, fixture, html } from '@open-wc/testing';
import '@mdjs/mdjs-preview/define';
/** @typedef {import('@mdjs/mdjs-preview').MdJsPreview} MdJsPreview */
describe('mdjs-preview', () => {
it('will render the element into the shadow root by default', async () => {
const el = await fixture(html`
<mdjs-preview .story=${() => html`<p id="testing"></p>`}></mdjs-preview>
`);
expect(el.shadowRoot.querySelectorAll('#testing').length).to.equal(1);
});
it('sync simulator states between instances', async () => {
const el = await fixture(html`
<div>
<mdjs-preview .story=${() => html`<p></p>`}></mdjs-preview>
<mdjs-preview .story=${() => html`<p></p>`}></mdjs-preview>
</div>
`);
const [preview1, preview2] = /** @type {MdJsPreview[]} */ (el.children);
preview1.platform = 'web';
preview1.edgeDistance = true;
await preview1.updateComplete;
expect(preview1.platform).to.equal('web');
expect(preview2.platform).to.equal('web');
expect(preview1.edgeDistance).to.be.true;
expect(preview2.edgeDistance).to.be.true;
preview1.platform = 'android';
preview1.edgeDistance = false;
await preview1.updateComplete;
expect(preview1.platform).to.equal('android');
expect(preview2.platform).to.equal('android');
expect(preview1.edgeDistance).to.be.false;
expect(preview2.edgeDistance).to.be.false;
});
});

View File

@@ -1,11 +1,5 @@
# @mdjs/mdjs-story
## 0.2.0
### Minor Changes
- 604a80e: Force `/define`Ï entrypoint via export map
## 0.1.2
### Patch Changes

View File

@@ -1,3 +1,3 @@
import { MdJsStory } from './MdJsStory.js';
import { MdJsStory } from './src/MdJsStory.js';
customElements.define('mdjs-story', MdJsStory);

View File

@@ -1,6 +1,6 @@
{
"name": "@mdjs/mdjs-story",
"version": "0.2.0",
"version": "0.1.2",
"publishConfig": {
"access": "public"
},
@@ -17,7 +17,7 @@
"type": "module",
"exports": {
".": "./index.js",
"./define": "./src/define.js"
"./mdjs-story.js": "./mdjs-story.js"
},
"scripts": {
"debug": "cd ../../ && npm run debug -- --group mdjs-story",

View File

@@ -0,0 +1,3 @@
# Story element for mdjs
For docs please see our homepage [https://rocket.modern-web.dev/docs/markdown-javascript/story/](https://rocket.modern-web.dev/docs/markdown-javascript/story/).

View File

@@ -0,0 +1 @@
export { RocketPlayground } from './src/RocketPlayground.js';

View File

@@ -0,0 +1,40 @@
{
"name": "@rocket/playground",
"version": "0.1.1",
"publishConfig": {
"access": "public"
},
"description": "Rendering storybook story functions inside a story window with show code capabilities",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/modernweb-dev/rocket.git",
"directory": "packages/mdjs-story"
},
"author": "Modern Web <hello@modern-web.dev> (https://modern-web.dev/)",
"homepage": "https://rocket.modern-web.dev/docs/markdown-javascript/story/",
"type": "module",
"exports": {
".": "./index.js",
"./rocket-playground": "./rocket-playground.js"
},
"scripts": {
"debug": "cd ../../ && npm run debug -- --group mdjs-story",
"test": "npm run test:web",
"test:watch": "onchange 'src/**/*.{js,cjs}' 'test-node/**/*.js' -- npm run test:node",
"test:node": "mocha --timeout 5000 test-node/**/*.test.{js,cjs} test-node/*.test.{js,cjs}",
"test:web": "cd ../../ && npm run test:web -- --group mdjs-story"
},
"files": [
"*.js",
"assets",
"dist-types",
"src"
],
"dependencies": {
"@vanillawc/wc-monaco-editor": "^1.10.12",
"lit-element": "^2.4.0",
"wasm-flate": "^1.0.2-browser"
},
"types": "dist-types/index.d.ts"
}

View File

@@ -0,0 +1,3 @@
import { RocketPlayground } from './src/RocketPlayground.js';
customElements.define('rocket-playground', RocketPlayground);

View File

@@ -0,0 +1,133 @@
import { LitElement, html, css } from 'lit-element';
import frame from './frame.svg.js';
const DEVICES = {
contentFlow: {
name: 'Content Flow',
system: 'web',
width: 'auto',
height: 'auto',
dpr: 1,
},
webSmall: {
name: 'Web Small',
system: 'web',
width: 360,
height: 640,
dpr: 1,
},
pixel2: {
name: 'Pixel 2',
system: 'android',
width: 411,
height: 731,
dpr: 2.6,
},
galaxyS5: {
name: 'Galaxy 5',
system: 'android',
width: 360,
height: 640,
dpr: 3,
},
iphoneX: {
name: 'iPhone X',
system: 'ios',
width: 375,
height: 812,
dpr: 3,
},
};
export class DevicePreview extends LitElement {
static get properties() {
return {
jsCode: { type: String },
device: { type: String, reflect: true },
};
}
constructor() {
super();
this.jsCode = '';
this.device = 'pixel2';
this.iframe = null;
}
static get styles() {
return [
css`
:host {
display: block;
position: relative;
}
iframe {
border: none;
background: #fff;
background: green;
}
:host([device='pixel2']) iframe {
width: 411px;
height: 640px;
}
div,
iframe {
position: absolute;
}
iframe {
top: 100px;
left: 100px;
}
svg {
width: 587px;
}
`,
];
}
update(changedProperties) {
super.update(changedProperties);
if (this.iframe) {
const iframeContent = `
<html>
<head>
<script type="importmap">
{
"imports": {
"lit-html": "http://localhost:8000/__wds-outside-root__/1/node_modules/lit-html/lit-html.js",
"@rocket/launch/inline-notification-element": "http://localhost:8000/__wds-outside-root__/1/packages/launch/inline-notification/inline-notification.js"
}
}
</script>
</head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body {
margin: 0;
}
</style>
<script type="module">
${this.jsCode}
</script>
<body></body>
</html>
`;
this.iframe.src = `data:text/html;charset=utf-8,${encodeURIComponent(iframeContent)}`;
}
}
firstUpdated() {
this.iframe = this.shadowRoot.querySelector('iframe');
}
render() {
return html`
<iframe
sandbox="allow-scripts"
csp="script-src localhost:8000 'unsafe-inline'; connect-src 'none'"
></iframe>
<div>${frame(html)}</div>
`;
}
}

View File

@@ -0,0 +1,170 @@
import { LitElement, html, css } from 'lit-element';
import '@vanillawc/wc-monaco-editor';
import './device-preview.js';
/**
* @typedef {object} StoryOptions
* @property {ShadowRoot | null} StoryOptions.shadowRoot
*/
/** @typedef {(options?: StoryOptions) => ReturnType<LitElement['render']>} LitHtmlStoryFn */
/** @typedef {import('./devices.js').devices} devices */
export function createViewer(jsCode) {
const iframeViewer = document.createElement('iframe');
const iframeContent = `
<html>
<head>
<script type="importmap">
{
"imports": {
"lit-html": "http://localhost:8000/__wds-outside-root__/1/node_modules/lit-html/lit-html.js"
}
}
</script>
</head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body {
margin: 0;
}
</style>
<script type="module">
${jsCode}
</script>
<body></body>
</html>
`;
iframeViewer.setAttribute('style', `border: none; background: #fff;`);
iframeViewer.setAttribute('sandbox', 'allow-scripts');
iframeViewer.setAttribute('csp', "script-src localhost:8000 'unsafe-inline'; connect-src 'none'");
// Uses a data url as when using srcdoc the iframe csp rules get ignored?
// iframeViewer.setAttribute('srcdoc', iframeContent);
iframeViewer.src = `data:text/html;charset=utf-8,${escape(iframeContent)}`;
return iframeViewer;
}
/**
* Renders a story
*
* @element mdjs-story
* @prop {StoryFn} [story=(() => TemplateResult)] Function that returns the story
*/
export class RocketPlayground extends LitElement {
static get properties() {
return {
story: {
attribute: false,
},
jsCode: {
type: String,
},
showDevices: {
type: Array,
},
};
}
constructor() {
super();
/** @type {LitHtmlStoryFn} */
this.story = () => html` <p>Loading...</p> `;
this.jsCode = '';
// this.story({ shadowRoot: this.shadowRoot });
this.urlState = new URLSearchParams(document.location.search);
// this.urlState.append('jsCode', '');
/**
* @type {Array<keyof devices>}
*/
this.showDevices = ['pixel2'];
}
setJsCode(jsCode) {
const encoded = flate.gzip_encode(jsCode);
this.urlState.set('jsCode', encoded);
this.updateUrl();
this.jsCode = jsCode;
}
updateUrl() {
history.pushState('', '', '?' + this.urlState.toString());
}
// createRenderRoot() {
// return this;
// }
setup() {
this.editorWc = this.querySelector('wc-monaco-editor');
if (this.editorWc) {
this.editorWc.tabSize = 2;
if (this.urlState.get('jsCode')) {
this.jsCode = flate.gzip_decode(this.urlState.get('jsCode'));
}
const value = [
"import { html, render } from 'lit-html';",
'export const foo = () => html`',
' <p>hey there</p>',
'`;',
"render(foo(), document.querySelector('body'))",
].join('\n');
this.editorWc.value = this.jsCode || value;
this.editorWc.editor.getModel().onDidChangeRawContentFast(() => {
this.setJsCode(this.editorWc.value);
});
}
}
firstUpdated() {
setTimeout(() => {
this.setup();
}, 100);
}
connectedCallback() {
super.connectedCallback();
this.editorWc = document.createElement('wc-monaco-editor');
this.editorWc.slot = 'editor';
this.editorWc.setAttribute('language', 'javascript');
this.appendChild(this.editorWc);
}
static get styles() {
return [
css`
:host {
display: flex;
height: 100%;
}
#editor-wrapper,
#devices-wrapper {
width: 50%;
}
`,
];
}
render() {
return html`
<div id="editor-wrapper">
<slot name="editor"></slot>
</div>
<div id="devices-wrapper">
${this.showDevices.map(
device => html` <device-preview .jsCode=${this.jsCode} .device=${device}></device-preview> `,
)}
</div>
`;
}
}

View File

@@ -0,0 +1,7 @@
export async function createImportMapForLocalPackages(packages) {
for (const pkg of packages) {
const pkgJson = await import(pkg);
console.log({pkg, pkgJson});
}
}

View File

@@ -0,0 +1,3 @@
import { DevicePreview } from './DevicePreview.js';
customElements.define('device-preview', DevicePreview);

View File

@@ -0,0 +1,37 @@
export const devices = {
contentFlow: {
name: 'Content Flow',
system: 'web',
width: 'auto',
height: 'auto',
dpr: 1,
},
webSmall: {
name: 'Web Small',
system: 'web',
width: 360,
height: 640,
dpr: 1,
},
pixel2: {
name: 'Pixel 2',
system: 'android',
width: 411,
height: 731,
dpr: 2.6,
},
galaxyS5: {
name: 'Galaxy 5',
system: 'android',
width: 360,
height: 640,
dpr: 3,
},
iphoneX: {
name: 'iPhone X',
system: 'ios',
width: 375,
height: 812,
dpr: 3,
},
};

View File

@@ -0,0 +1,27 @@
export default tag => tag`
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 583.782 992.748">
<defs>
<path id="reuse-0" d="M-328.071 77.934h87.321c3.158 3.241 3.966 6.64 0 10.357h-87.321c-2.388-2.89-5.443-5.624 0-10.357z" filter="url(#c)"/>
</defs>
<defs>
<filter id="c" width="1.02" height="1.18" x="-.01" y="-.09" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation=".388"/>
</filter>
<filter id="b" width="1.146" height="1.072" x="-.073" y="-.036" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation="14.425"/>
</filter>
<linearGradient id="a">
<stop offset="0" stop-color="#ececec"/>
<stop offset="1" stop-color="#ececec" stop-opacity="0"/>
</linearGradient>
</defs>
<g transform="translate(-83.389 -12.472)">
<path fill-rule="evenodd" d="M121.945 32.979c-25.884 7.036-44.412 19.814-46.138 45.707l-.543 819.843c.093 25.7 10.39 46.875 47.222 56.291l413.614-.48c29.367-6.096 48.726-21.391 48.851-54.367l.543-818.4c-3.437-20.23-8.931-39.683-45.05-47.632zm431.2 46.298a3.26 3.26 0 013.267 3.258l.572 825.24a3.26 3.26 0 01-3.263 3.262l-459.512-.562a3.26 3.26 0 01-3.256-3.264l.567-823.549a3.26 3.26 0 013.251-3.258z" filter="url(#b)" opacity=".45" transform="translate(83.389 12.471) scale(.9375)"/>
<path fill="none" d="M325.826 41.2v964.02h-197.99c-23.97-6.931-42.562-21.032-44.447-57.409l.505-854.589c1.73-26.554 13.299-45.975 41.921-53.033zm-.052 0v964.02h197.99c23.97-6.931 42.562-21.032 44.447-57.409l-.505-854.589c-1.73-26.554-13.299-45.975-41.922-53.033z"/>
<path fill="#151515" fill-rule="evenodd" d="M193.16 44.552c-24.085 6.596-41.324 18.577-42.93 42.852l-.506 768.63c.088 24.094 9.67 43.949 43.942 52.777l384.868-.45c27.326-5.715 45.34-20.057 45.456-50.973l.505-767.278c-3.198-18.965-8.31-37.204-41.92-44.656zm395.232 66.864a2.863 2.863 0 012.871 2.862l.504 724.803a2.863 2.863 0 01-2.868 2.866l-403.586-.495a2.863 2.863 0 01-2.86-2.865l.498-723.318a2.863 2.863 0 012.856-2.862z"/>
<use filter="url(#c)" transform="matrix(1.00398 0 0 1.14592 671.843 -16.339)" xlink:href="#reuse-0"/>
<ellipse cx="532.319" cy="77.836" rx="8.207" ry="7.955"/>
<use filter="url(#c)" transform="matrix(1.00398 0 0 1.14592 671.843 778.763)" xlink:href="#reuse-0"/>
</g>
</svg>
`;

View File

@@ -0,0 +1,19 @@
import chai from 'chai';
import path from 'path';
import { fileURLToPath } from 'url';
import { createImportMapForLocalPackages } from '../src/createImportMapForLocalPackages.js';
const { expect } = chai;
const __dirname = path.dirname(fileURLToPath(import.meta.url));
describe('normalizeConfig', () => {
it.only('makes sure essential settings are there', async () => {
const importMap = await createImportMapForLocalPackages(['@rocket/launch']);
expect(importMap).to.deep.equal({
imports: {
"@rocket/launch/inline-notification-element": "http://localhost:8000/__wds-outside-root__/1/packages/launch/inline-notification/inline-notification.js"
}
});
});
});

View File

@@ -0,0 +1,24 @@
// Don't edit this file directly. It is generated by /scripts/update-package-configs.ts
{
"extends": "../../tsconfig.browser-base.json",
"compilerOptions": {
"module": "ESNext",
"outDir": "./dist-types",
"rootDir": ".",
"composite": true,
"allowJs": true,
"checkJs": true,
"emitDeclarationOnly": true
},
"references": [],
"include": [
"src",
"*.js",
"types"
],
"exclude": [
"dist",
"dist-types"
]
}

View File

@@ -13,8 +13,8 @@
},
"author": "Modern Web <hello@modern-web.dev> (https://modern-web.dev/)",
"homepage": "https://rocket.modern-web.dev/docs/tools/plugins-manager/",
"main": "./dist/index.cjs",
"type": "module",
"main": "./dist/index.cjs",
"exports": {
".": {
"require": "./dist/index.cjs",

View File

@@ -1,24 +1,5 @@
# @rocket/search
## 0.3.5
### Patch Changes
- 2b7f1ee: Add support for pathprefix
## 0.3.4
### Patch Changes
- 81edf45: Reduce the amount of js files in the build by avoiding inline script tags
## 0.3.3
### Patch Changes
- 818caad: chore: generalize label & add alt when no img
- 0b64116: Update @lion dependencies
## 0.3.2
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@rocket/search",
"version": "0.3.5",
"version": "0.3.2",
"publishConfig": {
"access": "public"
},
@@ -13,8 +13,8 @@
},
"author": "Modern Web <hello@modern-web.dev> (https://modern-web.dev/)",
"homepage": "https://rocket.modern-web.dev/docs/presets/search/",
"main": "./node.js",
"type": "module",
"main": "./node.js",
"exports": {
".": "./node.js",
"./node": "./node.js",
@@ -41,7 +41,7 @@
"search"
],
"dependencies": {
"@lion/combobox": "^0.5.1",
"@lion/combobox": "^0.1.20",
"@open-wc/scoped-elements": "^1.3.2",
"chalk": "^4.0.0",
"minisearch": "^3.0.2",

View File

@@ -1 +0,0 @@
import '@rocket/search/rocket-search.js';

View File

@@ -4,4 +4,6 @@
</svg>
</rocket-search>
<script type="module" src="{{ '/_assets/scripts/define-rocket-search.js' | asset | url }}"></script>
<script type="module">
import '@rocket/search/rocket-search.js';
</script>

View File

@@ -2,31 +2,11 @@ import { rocketLaunch } from '@rocket/launch';
import { rocketBlog } from '@rocket/blog';
import { rocketSearch } from '@rocket/search';
import { absoluteBaseUrlNetlify } from '@rocket/core/helpers';
import { adjustPluginOptions } from 'plugins-manager';
/** @type {Partial<import("./packages/cli/types/main").RocketCliOptions>} */
const config = {
presets: [rocketLaunch(), rocketBlog(), rocketSearch()],
absoluteBaseUrl: absoluteBaseUrlNetlify('http://localhost:8080'),
setupUnifiedPlugins: [
adjustPluginOptions('mdjsSetupCode', {
simulationSettings: {
simulatorUrl: '/simulator/',
themes: [
{ key: 'light', name: 'Light' },
{ key: 'dark', name: 'Dark' },
],
platforms: [
{ key: 'web', name: 'Web' },
{ key: 'android', name: 'Android' },
{ key: 'ios', name: 'iOS' },
],
},
}),
],
// serviceWorkerName: 'sw.js',
// emptyOutputDir: false,
};
}
export default config;

549
yarn.lock
View File

@@ -81,7 +81,7 @@
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41"
integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==
"@babel/core@^7.12.10":
"@babel/core@^7.11.1", "@babel/core@^7.12.10":
version "7.12.10"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd"
integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==
@@ -758,7 +758,7 @@
"@babel/helper-create-regexp-features-plugin" "^7.12.1"
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/preset-env@^7.12.11":
"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.11":
version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.11.tgz#55d5f7981487365c93dbbc84507b1c7215e857f9"
integrity sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==
@@ -841,7 +841,7 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"
"@babel/runtime@^7.10.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4":
"@babel/runtime@^7.10.4", "@babel/runtime@^7.11.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4":
version "7.12.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e"
integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==
@@ -1096,66 +1096,97 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
"@lion/accordion@^0.4.2":
version "0.4.2"
resolved "https://registry.yarnpkg.com/@lion/accordion/-/accordion-0.4.2.tgz#efeb56360113a2b68e182ff29ef0932edd17df8c"
integrity sha512-xETjNmpBWYO1tYx2nBMq0I45UgydUJafZ4ft3szH3fQFjYWSBwjJjKsWxIhZSqX/IoTJzA0nNCdtbXoVEbSCLg==
dependencies:
"@lion/core" "0.16.0"
"@hapi/address@^2.1.2":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==
"@lion/combobox@^0.5.1":
version "0.5.1"
resolved "https://registry.yarnpkg.com/@lion/combobox/-/combobox-0.5.1.tgz#6395d5c34f0935aee32034584a253c1a2c6fa717"
integrity sha512-sOpJLCH8pzZAOohrqVnlTjC7L93tavXugSV2SqhVsFFnSQIWXytaeL8eJPlVBrTrmcOpns6AQX2uyBbeY6ZTsg==
dependencies:
"@lion/core" "0.16.0"
"@lion/form-core" "0.11.0"
"@lion/listbox" "0.7.0"
"@lion/overlays" "0.26.1"
"@hapi/formula@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-1.2.0.tgz#994649c7fea1a90b91a0a1e6d983523f680e10cd"
integrity sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==
"@lion/core@0.16.0":
version "0.16.0"
resolved "https://registry.yarnpkg.com/@lion/core/-/core-0.16.0.tgz#c4c8ac81b8d5bece6d40d561a392382c7ae73533"
integrity sha512-/MB/G44fZtL+s8iX1GAnyjw+Drn+fROkA13BpTn808UrDMGQ+WW1oq67Wp9Hr+t34LB3ghH3tm7afniDMa1VCA==
"@hapi/hoek@^8.2.4", "@hapi/hoek@^8.3.0":
version "8.5.1"
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06"
integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==
"@hapi/joi@^16.1.8":
version "16.1.8"
resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-16.1.8.tgz#84c1f126269489871ad4e2decc786e0adef06839"
integrity sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==
dependencies:
"@hapi/address" "^2.1.2"
"@hapi/formula" "^1.2.0"
"@hapi/hoek" "^8.2.4"
"@hapi/pinpoint" "^1.0.2"
"@hapi/topo" "^3.1.3"
"@hapi/pinpoint@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-1.0.2.tgz#025b7a36dbbf4d35bf1acd071c26b20ef41e0d13"
integrity sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==
"@hapi/topo@^3.1.3":
version "3.1.6"
resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29"
integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==
dependencies:
"@hapi/hoek" "^8.3.0"
"@lion/combobox@^0.1.20":
version "0.1.20"
resolved "https://registry.yarnpkg.com/@lion/combobox/-/combobox-0.1.20.tgz#9514c655171773a12f9c841187297f8791a029a6"
integrity sha512-Iw3BzZv7K36c2ReBDD76298VrNTPe7XElGAnr9/jzTH22eJdZD33DBXcY3D/tJlrhh02aC+4nTYxTww33lRqCA==
dependencies:
"@lion/core" "0.13.7"
"@lion/form-core" "0.7.0"
"@lion/listbox" "0.4.0"
"@lion/overlays" "0.23.2"
"@lion/core@0.13.7":
version "0.13.7"
resolved "https://registry.yarnpkg.com/@lion/core/-/core-0.13.7.tgz#c49cff0c7199711c14d9758b8e340cd93aca2f8c"
integrity sha512-9KwCwd1DDM26wLEib30Lw/6Nexcz3o1SSxnBlOdLFE/akJhi9nZOK1YmlSefL0XosND8ngCa1DXn348W8B693w==
dependencies:
"@open-wc/dedupe-mixin" "^1.2.18"
"@open-wc/scoped-elements" "^1.3.3"
"@open-wc/scoped-elements" "^1.3.2"
lit-element "~2.4.0"
lit-html "^1.3.0"
"@lion/form-core@0.11.0":
version "0.11.0"
resolved "https://registry.yarnpkg.com/@lion/form-core/-/form-core-0.11.0.tgz#83985baba62e11082b42ea84f3683f72a8f36fcf"
integrity sha512-opDXzTtVHJlRo+BLSI0dtSjbIz7PsJL80wnU8WAK3S+WNH5z2S37OBCoVvOVpXRpoqGAj5L/BmaJnHZeo6pPYw==
dependencies:
"@lion/core" "0.16.0"
"@lion/localize" "0.18.0"
"@lion/listbox@0.7.0":
"@lion/form-core@0.7.0":
version "0.7.0"
resolved "https://registry.yarnpkg.com/@lion/listbox/-/listbox-0.7.0.tgz#bd1d8cb25098387fd0ae1087f8dd641510f741f0"
integrity sha512-wHGqahRIjpTmMAvU/hDZyDGNhmjRj6FEYSWn7Z3ugE52D9a1PQd7HVc1cVVIRc71jC3w4n5ZYVeZChwR3N3fWw==
resolved "https://registry.yarnpkg.com/@lion/form-core/-/form-core-0.7.0.tgz#0df2cefb62876dd62e2baa980129ed7bf790b3ae"
integrity sha512-5aWqKNQgJKgqJC6VIRNoGe5imz9w0thLEnPqWJ8y6vSru/BC114ZLefvmltK9FG21DPkPOCa+vm4PSjilaqh1w==
dependencies:
"@lion/core" "0.16.0"
"@lion/form-core" "0.11.0"
"@lion/core" "0.13.7"
"@lion/localize" "0.15.4"
"@lion/localize@0.18.0":
version "0.18.0"
resolved "https://registry.yarnpkg.com/@lion/localize/-/localize-0.18.0.tgz#beaf8c161feb58ecab670892c06e7b524527b7e8"
integrity sha512-+adOGlot4IItOy1udLKflZlO2fTKM7R0Ji7iZ5SEVG80XOZxC3RXjVM7mWSd5wqcCUe51j1P/tgKM3vDLF0RAw==
"@lion/listbox@0.4.0":
version "0.4.0"
resolved "https://registry.yarnpkg.com/@lion/listbox/-/listbox-0.4.0.tgz#429838fd75d40662b67e5a3f611bf3ea94b506de"
integrity sha512-bwVIlVX0cQoKKGf6HNqDmTH5JUM0TKAzZuHsrmLcsYG9V5bgMjfiLBXPNQxyy39WOwicPM8f2g+O5rRXBcsIYQ==
dependencies:
"@lion/core" "0.13.7"
"@lion/form-core" "0.7.0"
"@lion/localize@0.15.4":
version "0.15.4"
resolved "https://registry.yarnpkg.com/@lion/localize/-/localize-0.15.4.tgz#b9ed5eb5b3a1304694314b4d6bbbcddc0b85f616"
integrity sha512-OP7Og/JXWl4Wm+AzLNKcCAoeft5eQfZlkvEFqOnRuGAXxotbxwk+yQB3kI/K7QvLURNQbv6mzwdDu2buhZdV9w==
dependencies:
"@bundled-es-modules/message-format" "6.0.4"
"@lion/core" "0.16.0"
singleton-manager "1.4.1"
"@lion/core" "0.13.7"
singleton-manager "1.2.1"
"@lion/overlays@0.26.1", "@lion/overlays@^0.26.1":
version "0.26.1"
resolved "https://registry.yarnpkg.com/@lion/overlays/-/overlays-0.26.1.tgz#d1bfa4f5f97108982afa7b409ba4300f8b2d2ba5"
integrity sha512-1FvphbR/yTQ1WtcB1gNuH772i9qAydQkI6NwibIw8QeOGXisA+6SChv2OHS7CijlpDJnDxNyX44LGdDM1/Pd8A==
"@lion/overlays@0.23.2", "@lion/overlays@^0.23.2":
version "0.23.2"
resolved "https://registry.yarnpkg.com/@lion/overlays/-/overlays-0.23.2.tgz#cfdff6cb7ee4f46cdaa621574affbe2e9c374976"
integrity sha512-nKVSn37arx9+gdmlIj3gEkpJXGTnsUvbOEXcymLEFJBekvdYKCNWDe9bVBX/iTBBsgO0rQ9+eA5RskxwKPdraQ==
dependencies:
"@lion/core" "0.16.0"
"@lion/core" "0.13.7"
"@popperjs/core" "^2.5.4"
singleton-manager "1.4.1"
singleton-manager "1.2.1"
"@manypkg/find-root@^1.1.0":
version "1.1.0"
@@ -1220,14 +1251,6 @@
"@open-wc/dedupe-mixin" "^1.3.0"
lit-html "^1.0.0"
"@open-wc/scoped-elements@^1.3.3":
version "1.3.3"
resolved "https://registry.yarnpkg.com/@open-wc/scoped-elements/-/scoped-elements-1.3.3.tgz#fe008aef4d74fb00c553c900602960638fc1c7b0"
integrity sha512-vFIQVYYjFw67odUE4JzZOpctnF7S/2DX+S+clrL3bQPql7HvEnV0wMFwOWUavQTuCJi0rfU8GTcNMiUybio+Yg==
dependencies:
"@open-wc/dedupe-mixin" "^1.3.0"
lit-html "^1.0.0"
"@open-wc/semantic-dom-diff@^0.13.16":
version "0.13.21"
resolved "https://registry.yarnpkg.com/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.13.21.tgz#718b9ec5f9a98935fc775e577ad094ae8d8b7dea"
@@ -1272,7 +1295,7 @@
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.6.0.tgz#f022195afdfc942e088ee2101285a1d31c7d727f"
integrity sha512-cPqjjzuFWNK3BSKLm0abspP0sp/IGOli4p5I5fKFAzdS8fvjdOwDCfZqAaIiXd9lPkOWi3SUUfZof3hEb7J/uw==
"@rollup/plugin-babel@^5.2.2":
"@rollup/plugin-babel@^5.2.0", "@rollup/plugin-babel@^5.2.2":
version "5.2.2"
resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.2.2.tgz#e5623a01dd8e37e004ba87f2de218c611727d9b2"
integrity sha512-MjmH7GvFT4TW8xFdIeFS3wqIX646y5tACdxkTO+khbHvS3ZcVJL6vkAHLw2wqPmkhwCfWHoNsp15VYNwW6JEJA==
@@ -1312,10 +1335,22 @@
is-module "^1.0.0"
resolve "^1.19.0"
"@rollup/plugin-replace@^2.4.2":
version "2.4.2"
resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a"
integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==
"@rollup/plugin-node-resolve@^9.0.0":
version "9.0.0"
resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz#39bd0034ce9126b39c1699695f440b4b7d2b62e6"
integrity sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==
dependencies:
"@rollup/pluginutils" "^3.1.0"
"@types/resolve" "1.17.1"
builtin-modules "^3.1.0"
deepmerge "^4.2.2"
is-module "^1.0.0"
resolve "^1.17.0"
"@rollup/plugin-replace@^2.3.3", "@rollup/plugin-replace@^2.3.4":
version "2.3.4"
resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.3.4.tgz#7dd84c17755d62b509577f2db37eb524d7ca88ca"
integrity sha512-waBhMzyAtjCL1GwZes2jaE9MjuQ/DQF2BatH3fRivUF3z0JBFrU0U6iBNC/4WR+2rLKhaAhPWDNPYp4mI6RqdQ==
dependencies:
"@rollup/pluginutils" "^3.1.0"
magic-string "^0.25.7"
@@ -1365,6 +1400,14 @@
resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5"
integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==
"@surma/rollup-plugin-off-main-thread@^1.4.1":
version "1.4.2"
resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz#e6786b6af5799f82f7ab3a82e53f6182d2b91a58"
integrity sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==
dependencies:
ejs "^2.6.1"
magic-string "^0.25.0"
"@types/accepts@*":
version "1.3.5"
resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575"
@@ -1735,6 +1778,11 @@
resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
"@vanillawc/wc-monaco-editor@^1.10.12":
version "1.10.12"
resolved "https://registry.yarnpkg.com/@vanillawc/wc-monaco-editor/-/wc-monaco-editor-1.10.12.tgz#73ae976b27fecfbef034df0cd2ea3608f4457180"
integrity sha512-UOFs6eCf30qWQE8J4+e6axlcoZAKfa/rOgcqMB70s7UvAzQYnE0zpbWmTyRPCG6ARmuHXDkaxjkG8DXywZfJDA==
"@web/browser-logs@^0.2.0":
version "0.2.0"
resolved "https://registry.yarnpkg.com/@web/browser-logs/-/browser-logs-0.2.0.tgz#3f39d59154bf668f0bce467026354ff2b9f3e06b"
@@ -1813,32 +1861,25 @@
"@types/parse5" "^5.0.3"
parse5 "^6.0.1"
"@web/parse5-utils@^1.2.2":
version "1.2.2"
resolved "https://registry.yarnpkg.com/@web/parse5-utils/-/parse5-utils-1.2.2.tgz#33eec93321eb07cf364651c131b980a7afd8c4d7"
integrity sha512-B68DoJ5qF8Cu3o7nDA2RQTCf9bslVz2b0WHTk3qir5YCbWfhnPEGhDOedOjbE8xDiHqgzI1zXQsJ2+655aluLA==
"@web/polyfills-loader@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@web/polyfills-loader/-/polyfills-loader-1.0.1.tgz#cee51b6aa956a3c061c5018ce14424958b85946a"
integrity sha512-2c2UQpAYT2xSmo7mwf3RHsl9o7toB+dzVZbLEoDKCRhKX4T4jeiCSL828HrgHffckDI/PDIrsXtJ+SLvu4xGvg==
dependencies:
"@types/parse5" "^5.0.3"
parse5 "^6.0.1"
"@web/polyfills-loader@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@web/polyfills-loader/-/polyfills-loader-1.1.0.tgz#9df3da3d40159fce55c17cc370750052f62798bd"
integrity sha512-1bF1nhFG25isy6NbMhz9jVBCoXqrB1WzxkhT8Pyw9vKhXO+F83+TUWp0QeInsvvDVo0QPIeg+bVz6spRJrvfkg==
dependencies:
"@babel/core" "^7.12.10"
"@babel/core" "^7.11.1"
"@web/parse5-utils" "^1.1.2"
"@webcomponents/webcomponentsjs" "^2.5.0"
abortcontroller-polyfill "^1.5.0"
core-js-bundle "^3.8.1"
abortcontroller-polyfill "^1.4.0"
core-js-bundle "^3.6.0"
deepmerge "^4.2.2"
dynamic-import-polyfill "^0.1.1"
intersection-observer "^0.12.0"
parse5 "^6.0.1"
regenerator-runtime "^0.13.7"
intersection-observer "^0.11.0"
parse5 "^6.0.0"
regenerator-runtime "^0.13.3"
resize-observer-polyfill "^1.5.1"
systemjs "^6.8.1"
terser "^5.5.1"
whatwg-fetch "^3.5.0"
systemjs "^6.7.1"
terser "^5.3.8"
whatwg-fetch "^3.0.0"
"@web/rollup-plugin-copy@^0.2.0":
version "0.2.0"
@@ -1847,12 +1888,12 @@
dependencies:
glob "^7.0.0"
"@web/rollup-plugin-html@^1.6.0":
version "1.6.0"
resolved "https://registry.yarnpkg.com/@web/rollup-plugin-html/-/rollup-plugin-html-1.6.0.tgz#fd3f406fd6d74a0cded581953a3146fe9f0454ad"
integrity sha512-m5xDI6ZhdAI2nfHwU3NXJ/dcDWghR+g/RrlAtIWYlj8NvXk/ZNqVVK1NbJrI/e5RlgDQ/+OycjmKgyAP9W1tWA==
"@web/rollup-plugin-html@^1.4.0":
version "1.4.0"
resolved "https://registry.yarnpkg.com/@web/rollup-plugin-html/-/rollup-plugin-html-1.4.0.tgz#bf94d1ee525e5f41dc527bbff9f7e24973a82238"
integrity sha512-AYOeRuNsPXQmNpxlJRFLlfVMm4EazXcJEz0bbVd6wKQVcEBM71kRboGfupxhoIkDcVyThefw9gETcMZ4ntUcTw==
dependencies:
"@web/parse5-utils" "^1.2.2"
"@web/parse5-utils" "^1.1.2"
glob "^7.1.6"
parse5 "^6.0.1"
@@ -1865,12 +1906,12 @@
estree-walker "^2.0.1"
magic-string "^0.25.7"
"@web/rollup-plugin-polyfills-loader@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@web/rollup-plugin-polyfills-loader/-/rollup-plugin-polyfills-loader-1.1.0.tgz#5d49c11c6e9874550d8bac2934d368e6437c9982"
integrity sha512-p3GtEKeeyRJa5S/sKWpIa3eg+fiPeYux+Z+r85kxyAw4FY+4AOts9vEeg1McEDjCZ/4V40X2vaPTi1alFBNrig==
"@web/rollup-plugin-polyfills-loader@^1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@web/rollup-plugin-polyfills-loader/-/rollup-plugin-polyfills-loader-1.0.3.tgz#26b162c20cf22100117c154793d6be232cbb979b"
integrity sha512-9DkZy0x5F+axj3gDx36x5mxvqg9ugVIS85hCZT2uDEBJ1VBVdSG0pzI5R5zHaLAq/Xk88D999S0zLVRE7DKuHw==
dependencies:
"@web/polyfills-loader" "^1.1.0"
"@web/polyfills-loader" "^1.0.1"
"@web/test-runner-chrome@^0.9.0":
version "0.9.0"
@@ -1974,10 +2015,10 @@ abbrev@1:
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
abortcontroller-polyfill@^1.5.0:
version "1.7.1"
resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.1.tgz#27084bac87d78a7224c8ee78135d05df430c2d2f"
integrity sha512-yml9NiDEH4M4p0G4AcPkg8AAa4mF3nfYF28VQxaokpO67j9H7gWgmsVWJ/f1Rn+PzsnDYvzJzWIQzCqDKRvWlA==
abortcontroller-polyfill@^1.4.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.5.0.tgz#2c562f530869abbcf88d949a2b60d1d402e87a7c"
integrity sha512-O6Xk757Jb4o0LMzMOMdWvxpHWrQzruYBaUruFaIOfAQRnWFxfdXYobw12jrVHGtoXk6WiiyYzc0QWN9aL62HQA==
accepts@^1.3.5, accepts@~1.3.4:
version "1.3.7"
@@ -2950,6 +2991,11 @@ commander@^6.2.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
common-tags@^1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==
commondir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -3092,10 +3138,10 @@ copyfiles@^2.4.1:
untildify "^4.0.0"
yargs "^16.1.0"
core-js-bundle@^3.8.1:
version "3.10.2"
resolved "https://registry.yarnpkg.com/core-js-bundle/-/core-js-bundle-3.10.2.tgz#16734b2674373afa40f0533b985a1c9e87bd426f"
integrity sha512-cU/daFGOLWwtNAdXBksUl2HNqPOaM5g6bMxJ8doMw9PkshbWSzUweog2EEJsIlgmCCAFI0NLDBl4SD2TzZEevw==
core-js-bundle@^3.6.0:
version "3.8.1"
resolved "https://registry.yarnpkg.com/core-js-bundle/-/core-js-bundle-3.8.1.tgz#a4445eff5da56e316f68365ec89648be1027a808"
integrity sha512-bkulwU0ZPkG9aZ79JCRL5ltTSvxP9YsKfyZ6ZpGolJ8BEDGK3BFPPmQ2LlWSuhSshcIxIQzArCSXBYacyGf+aQ==
core-js-compat@^3.8.0:
version "3.8.1"
@@ -3160,6 +3206,11 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2:
shebang-command "^2.0.0"
which "^2.0.1"
crypto-random-string@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
csv-generate@^3.2.4:
version "3.3.0"
resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-3.3.0.tgz#0e25658f1bb9806d94fec7b270896a35c7eedf1a"
@@ -3475,7 +3526,7 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
ejs@^2.7.4:
ejs@^2.6.1, ejs@^2.7.4:
version "2.7.4"
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
@@ -3906,7 +3957,7 @@ fast-glob@^3.1.1, fast-glob@^3.2.2:
micromatch "^4.0.2"
picomatch "^2.2.1"
fast-json-stable-stringify@^2.0.0:
fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
@@ -4699,10 +4750,10 @@ inline-style-parser@0.1.1:
resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1"
integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==
intersection-observer@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.0.tgz#6c84628f67ce8698e5f9ccf857d97718745837aa"
integrity sha512-2Vkz8z46Dv401zTWudDGwO7KiGHNDkMv417T5ItcNYfmvHR/1qCTVBO9vwH8zZmQ0WkA/1ARwpysR9bsnop4NQ==
intersection-observer@^0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.11.0.tgz#f4ea067070326f68393ee161cc0a2ca4c0040c6f"
integrity sha512-KZArj2QVnmdud9zTpKf279m2bbGfG+4/kn16UU0NL3pTVl52ZHiJ9IRNSsnn6jaHrL9EGLFM5eWjTx2fz/+zoQ==
ip@^1.1.5:
version "1.1.5"
@@ -5495,7 +5546,7 @@ luxon@^1.24.1:
resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.25.0.tgz#d86219e90bc0102c0eb299d65b2f5e95efe1fe72"
integrity sha512-hEgLurSH8kQRjY6i4YLey+mcKVAWXbDNlZRmM6AgWDJ1cY3atl8Ztf5wEY7VBReFbmGnwQPz7KYJblL8B2k0jQ==
magic-string@^0.25.7:
magic-string@^0.25.0, magic-string@^0.25.7:
version "0.25.7"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==
@@ -6668,6 +6719,11 @@ prettier@^2.2.1:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5"
integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==
pretty-bytes@^5.3.0, pretty-bytes@^5.4.1:
version "5.5.0"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.5.0.tgz#0cecda50a74a941589498011cf23275aa82b339e"
integrity sha512-p+T744ZyjjiaFlMUZZv6YPC5JrkNj8maRmPaQCWFJFplUAzpIUTRaTcS+7wmZtUoFXHtESJb23ISliaWyz3SHA==
pretty-ms@^0.2.1:
version "0.2.2"
resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-0.2.2.tgz#da879a682ff33a37011046f13d627f67c73b84f6"
@@ -7093,7 +7149,7 @@ regenerator-runtime@^0.11.0:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7:
regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4:
version "0.13.7"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
@@ -7350,7 +7406,7 @@ rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
rollup-plugin-terser@^7.0.2:
rollup-plugin-terser@^7.0.0, rollup-plugin-terser@^7.0.2:
version "7.0.2"
resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d"
integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==
@@ -7360,7 +7416,18 @@ rollup-plugin-terser@^7.0.2:
serialize-javascript "^4.0.0"
terser "^5.0.0"
rollup@^2.35.1:
rollup-plugin-workbox@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/rollup-plugin-workbox/-/rollup-plugin-workbox-6.1.0.tgz#120cde36547769fc8cc45eae97a338c4017ed936"
integrity sha512-BqeEBj53fiqNLjiiyVvuBlic3Apg2Us1mpTkn3zgqaipJoAOC3soi+W9vrOQcm190lHLo9WNvi1wQg/M7olJHg==
dependencies:
"@rollup/plugin-node-resolve" "^11.0.1"
"@rollup/plugin-replace" "^2.3.4"
pretty-bytes "^5.4.1"
rollup-plugin-terser "^7.0.2"
workbox-build "^6.0.2"
rollup@^2.25.0, rollup@^2.35.1:
version "2.35.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.35.1.tgz#e6bc8d10893556a638066f89e8c97f422d03968c"
integrity sha512-q5KxEyWpprAIcainhVy6HfRttD9kutQpHbeqDTWnqAFNJotiojetK6uqmcydNMymBEtC4I8bCYR+J3mTMqeaUA==
@@ -7636,10 +7703,10 @@ simple-swizzle@^0.2.2:
dependencies:
is-arrayish "^0.3.1"
singleton-manager@1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/singleton-manager/-/singleton-manager-1.4.1.tgz#0a9cd1db2b26e5cbc4ecdc20d5a16f284b36aabb"
integrity sha512-HOvKT/WcHvl2cLYGqmO6MaC2J4wAA82LntGwtLn6avnTq15UDLCnSRVXedmglVooLbQGVsQJ+dQz2sKz+2GUZA==
singleton-manager@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/singleton-manager/-/singleton-manager-1.2.1.tgz#9ad080707f0fe1be849e14994d3e7a2308d56f83"
integrity sha512-n+G7rHlANmJsi6Y6K7wV3wluO0oT1veSIL/vazbnG+nXfc4fB855JwsBXHccm1pCi7vNSh63PRGzoIfCBo3b+g==
sinon-chai@^3.3.0:
version "3.5.0"
@@ -7782,6 +7849,11 @@ source-map-support@^0.5.17, source-map-support@~0.5.19:
buffer-from "^1.0.0"
source-map "^0.6.0"
source-map-url@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
source-map@^0.5.0, source-map@~0.5.1:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
@@ -8026,6 +8098,11 @@ strip-bom@^3.0.0:
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
strip-comments@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b"
integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==
strip-eof@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
@@ -8098,10 +8175,10 @@ symbol-observable@1.0.1:
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=
systemjs@^6.8.1:
version "6.8.3"
resolved "https://registry.yarnpkg.com/systemjs/-/systemjs-6.8.3.tgz#67e27f49242e9d81c2b652b204ae54e8bfcc75a3"
integrity sha512-UcTY+FEA1B7e+bpJk1TI+a9Na6LG7wFEqW7ED16cLqLuQfI/9Ri0rsXm3tKlIgNoHyLHZycjdAOijzNbzelgwA==
systemjs@^6.7.1:
version "6.8.2"
resolved "https://registry.yarnpkg.com/systemjs/-/systemjs-6.8.2.tgz#6200ce215ee5eb8d6c2815b9470c52015cb3c867"
integrity sha512-YknH4S+Xq7Rlwdnvyj4QKHWm5YQGPJnnkVXFQLC/Wl/O21nZ+NrV9IjwUQQ0Pl0Jh0Wgf91IeGzSHGELsv5kkA==
table-layout@^1.0.1:
version "1.0.1"
@@ -8144,6 +8221,21 @@ tar-stream@^2.1.4:
inherits "^2.0.3"
readable-stream "^3.1.1"
temp-dir@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e"
integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==
tempy@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.6.0.tgz#65e2c35abc06f1124a97f387b08303442bde59f3"
integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==
dependencies:
is-stream "^2.0.0"
temp-dir "^2.0.0"
type-fest "^0.16.0"
unique-string "^2.0.0"
term-size@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
@@ -8156,7 +8248,7 @@ term-size@^2.1.0:
resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54"
integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==
terser@^5.0.0:
terser@^5.0.0, terser@^5.3.8:
version "5.5.1"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289"
integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==
@@ -8165,15 +8257,6 @@ terser@^5.0.0:
source-map "~0.7.2"
source-map-support "~0.5.19"
terser@^5.5.1:
version "5.6.1"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.6.1.tgz#a48eeac5300c0a09b36854bf90d9c26fb201973c"
integrity sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==
dependencies:
commander "^2.20.0"
source-map "~0.7.2"
source-map-support "~0.5.19"
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@@ -8346,6 +8429,11 @@ type-fest@^0.13.1:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
type-fest@^0.16.0:
version "0.16.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860"
integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==
type-fest@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
@@ -8467,6 +8555,13 @@ unified@^9.1.0, unified@^9.2.0:
trough "^1.0.0"
vfile "^4.0.0"
unique-string@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
dependencies:
crypto-random-string "^2.0.0"
unist-builder@^2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436"
@@ -8562,6 +8657,11 @@ untildify@^4.0.0:
resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
upath@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
uri-js@^4.2.2:
version "4.4.0"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602"
@@ -8649,6 +8749,11 @@ void-elements@^2.0.1:
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=
wasm-flate@^1.0.2-browser:
version "1.0.2-browser"
resolved "https://registry.yarnpkg.com/wasm-flate/-/wasm-flate-1.0.2-browser.tgz#e10e758b37c3d38829b54809fa2fef853b48131c"
integrity sha512-qpqOzvbKtgG/2Mb0DYXVPQ2nOrkKYoAQtpr4QZzgO8SMfKieeODUy2vomMnimQjH/K2RGWnw+kZmO8yf+Yh9qA==
wcwidth@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
@@ -8666,10 +8771,10 @@ webidl-conversions@^6.1.0:
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
whatwg-fetch@^3.5.0:
version "3.6.2"
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c"
integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==
whatwg-fetch@^3.0.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868"
integrity sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A==
whatwg-url@^8.4.0:
version "8.4.0"
@@ -8762,52 +8867,160 @@ wordwrapjs@^4.0.0:
reduce-flatten "^2.0.0"
typical "^5.0.0"
workbox-broadcast-update@^6.1.5:
version "6.1.5"
resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.1.5.tgz#49a2a4cc50c7b1cfe86bed6d8f15edf1891d1e79"
integrity sha512-zGrTTs+n4wHpYtqYMqBg6kl/x5j1UrczGCQnODSHTxIDV8GXLb/GtA1BCZdysNxpMmdVSeLmTcgIYAAqWFamrA==
workbox-background-sync@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.0.2.tgz#9205f5ef7fbf68203b925bdc85bdaa31a34fbbe6"
integrity sha512-KQU2ntvbvFoBvCRm+EDpWAaykt4u/oaF5j3C6io0dZVWhFc/ZwgYDii8fb34LTenug3VPWQELdw9dNBCoP4b0w==
dependencies:
workbox-core "^6.1.5"
workbox-core "^6.0.2"
workbox-cacheable-response@^6.1.5:
version "6.1.5"
resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.1.5.tgz#2772e09a333cba47b0923ed91fd022416b69e75c"
integrity sha512-x8DC71lO/JCgiaJ194l9le8wc8lFPLgUpDkLhp2si7mXV6S/wZO+8Osvw1LLgYa8YYTWGbhbFhFTXIkEMknIIA==
workbox-broadcast-update@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.0.2.tgz#fc034277e631e4193dcee9f6b0a77e415b4ddefb"
integrity sha512-yCXYEln7nU8FkMDysYQPirpgFXtsdBtxruHbvZzRsxMHvAELf3j/o6Ufae1zjl8XanLF696sqSNxehpCGSD6tw==
dependencies:
workbox-core "^6.1.5"
workbox-core "^6.0.2"
workbox-core@^6.1.5:
version "6.1.5"
resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.1.5.tgz#424ff600e2c5448b14ebd58b2f5ac8ed91b73fb9"
integrity sha512-9SOEle7YcJzg3njC0xMSmrPIiFjfsFm9WjwGd5enXmI8Lwk8wLdy63B0nzu5LXoibEmS9k+aWF8EzaKtOWjNSA==
workbox-expiration@^6.1.5:
version "6.1.5"
resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.1.5.tgz#a62a4ac953bb654aa969ede13507ca5bd154adc2"
integrity sha512-6cN+FVbh8fNq56LFKPMchGNKCJeyboHsDuGBqmhDUPvD4uDjsegQpDQzn52VaE0cpywbSIsDF/BSq9E9Yjh5oQ==
workbox-build@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.0.2.tgz#a23eebd6556cf473fedda77c08421b2d093efc32"
integrity sha512-Dukbt+p62Yzb12SXAmycTYvHngJ8aRtXy3hymsC8B6gxTCZmCZ0u5JuKhu7lNLbDwDkYE78lhFvT9SF+MXFz5A==
dependencies:
workbox-core "^6.1.5"
"@babel/core" "^7.11.1"
"@babel/preset-env" "^7.11.0"
"@babel/runtime" "^7.11.2"
"@hapi/joi" "^16.1.8"
"@rollup/plugin-babel" "^5.2.0"
"@rollup/plugin-node-resolve" "^9.0.0"
"@rollup/plugin-replace" "^2.3.3"
"@surma/rollup-plugin-off-main-thread" "^1.4.1"
common-tags "^1.8.0"
fast-json-stable-stringify "^2.1.0"
fs-extra "^9.0.1"
glob "^7.1.6"
lodash "^4.17.20"
pretty-bytes "^5.3.0"
rollup "^2.25.0"
rollup-plugin-terser "^7.0.0"
source-map "^0.7.3"
source-map-url "^0.4.0"
stringify-object "^3.3.0"
strip-comments "^2.0.1"
tempy "^0.6.0"
upath "^1.2.0"
workbox-background-sync "^6.0.2"
workbox-broadcast-update "^6.0.2"
workbox-cacheable-response "^6.0.2"
workbox-core "^6.0.2"
workbox-expiration "^6.0.2"
workbox-google-analytics "^6.0.2"
workbox-navigation-preload "^6.0.2"
workbox-precaching "^6.0.2"
workbox-range-requests "^6.0.2"
workbox-recipes "^6.0.2"
workbox-routing "^6.0.2"
workbox-strategies "^6.0.2"
workbox-streams "^6.0.2"
workbox-sw "^6.0.2"
workbox-window "^6.0.2"
workbox-routing@^6.1.5:
version "6.1.5"
resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.1.5.tgz#15884d6152dba03faef83f0b23331846d8b6ef8e"
integrity sha512-uC/Ctz+4GXGL42h1WxUNKxqKRik/38uS0NZ6VY/EHqL2F1ObLFqMHUZ4ZYvyQsKdyI82cxusvhJZHOrY0a2fIQ==
workbox-cacheable-response@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.0.2.tgz#00b1133c4c846a2874f32ae14206c0636bacfd87"
integrity sha512-OrgFiYWkmFXDIbNRYSu+fchcfoZqyJ4yZbdc8WKUjr9v/MghKHfR9u7UI077xBkjno5J3YNpbwx73/no3HkrzA==
dependencies:
workbox-core "^6.1.5"
workbox-core "^6.0.2"
workbox-strategies@^6.1.5:
version "6.1.5"
resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.1.5.tgz#2549a3e78f0eda371b760c4db21feb0d26143573"
integrity sha512-QhiOn9KT9YGBdbfWOmJT6pXZOIAxaVrs6J6AMYzRpkUegBTEcv36+ZhE/cfHoT0u2fxVtthHnskOQ/snEzaXQw==
dependencies:
workbox-core "^6.1.5"
workbox-core@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.0.2.tgz#2f865cfe633890b4210fd6d6fdb049a6daed0914"
integrity sha512-Ksl6qeikGb+BOCILoCUJGxwlEQOeeqdpOnpOr9UDt3NtacPYbfYBmpYpKArw5DFWK+5geBsFqgUUlXThlCYfKQ==
workbox-window@^6.1.5:
version "6.1.5"
resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.1.5.tgz#017b22342e10c6df6b9672326b575ec950b6cd80"
integrity sha512-akL0X6mAegai2yypnq78RgfazeqvKbsllRtEI4dnbhPcRINEY1NmecFmsQk8SD+zWLK1gw5OdwAOX+zHSRVmeA==
workbox-expiration@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.0.2.tgz#ac01e8d17f48daa31dc0872c09ee6f4d2cf28ccb"
integrity sha512-6+nbR18cklAdI3BPT675ytftXPwnVbXGR8mPWNWTJtl5y2urRYv56ZOJLD7FBFVkZ8EjWiRhNP/A0fkxgdKtWQ==
dependencies:
workbox-core "^6.1.5"
workbox-core "^6.0.2"
workbox-google-analytics@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.0.2.tgz#7e3641adb30a3acb25006b244035631cf6f65019"
integrity sha512-xmYJurR1M6Pzc2SBM/E7AgwmBszhu/YYDzBnU+HJPZFLbTG97ASIJyTXV1vcczA/dNaS0miIf0cFqneozVlDRw==
dependencies:
workbox-background-sync "^6.0.2"
workbox-core "^6.0.2"
workbox-routing "^6.0.2"
workbox-strategies "^6.0.2"
workbox-navigation-preload@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.0.2.tgz#bfd9c61096be921b830153a3004b7212220748dc"
integrity sha512-7+ojLrjXmTFZBfGmUQIcBWB+xrFgXLMJGNQAtxT7Ta9A23rEWo8jqAgeuwAylebcORUlM+ztgYTV7eGp+AD+Yg==
dependencies:
workbox-core "^6.0.2"
workbox-precaching@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.0.2.tgz#cb45f290b0604bef1d9fc96bf42df82385d54e54"
integrity sha512-sqKWL2emzmGnfJpna+9RjUkUiqQO++AKfwljCbgkHg8wBbVLy/rnui3eelKgAI7D8R31LJFfiZkY/kXmwkjtlQ==
dependencies:
workbox-core "^6.0.2"
workbox-routing "^6.0.2"
workbox-strategies "^6.0.2"
workbox-range-requests@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.0.2.tgz#3b50cbe8ddaaed7e3bfaa2dfdcd6a22e02fe7770"
integrity sha512-qCrDbH9AzDbCErde71Nys2iNZO9I9M9Jgl/9/Q67dGQVwFsEq73SuIzS2DGIBKqtIdC5QUigC3d7XJONajclUQ==
dependencies:
workbox-core "^6.0.2"
workbox-recipes@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.0.2.tgz#ad4b3f26a71a7396004c4f617af318f3fd072208"
integrity sha512-ewZIHO4jYE6bnEeUIYS6joQy3l+MydpOsVr2F6EpE8ps++z1ScbSdLtJU+yu6WuO3lH44HFZLeFxYQqYm50QAA==
dependencies:
workbox-cacheable-response "^6.0.2"
workbox-core "^6.0.2"
workbox-expiration "^6.0.2"
workbox-precaching "^6.0.2"
workbox-routing "^6.0.2"
workbox-strategies "^6.0.2"
workbox-routing@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.0.2.tgz#8380bc322a2b1c44978df8ff6ae4e4d723f4e3f8"
integrity sha512-iQ9ch3fL1YpztDLfHNURaHQ0ispgPCdzWmZZhtSHUyy/+YkTlIiDVTbOQCIpHIrWlKQiim6X3K2ItIy1FW9+wA==
dependencies:
workbox-core "^6.0.2"
workbox-strategies@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.0.2.tgz#f4383e2e5d46c1546e6e08048c9f5c9a7beb5137"
integrity sha512-HjLnYCVS60U7OKhl5NIq8NAQXrotJQRDakmIONnRlQIlP2If/kAiQSUP3QCHMq4EeXGiF+/CdlR1/bhYBHZzZg==
dependencies:
workbox-core "^6.0.2"
workbox-streams@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.0.2.tgz#07c19025af309ad3475e737018a05ed538bffacd"
integrity sha512-bckftu/iMlg5LFXPZ6NX/FUc/w4illgxSuwtsZkQAO6Uen1EeegjfLyenO01/dwoyc3D/AlZepMdhv87XhE7HQ==
dependencies:
workbox-core "^6.0.2"
workbox-routing "^6.0.2"
workbox-sw@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.0.2.tgz#cd1b8b02ceaaf1abe5804936158a87ec605d271e"
integrity sha512-EoOjbyy5bpoBoSqt2PIeDOZ/JJ41f+WJjb979PkfIUWw4F+F/w2uKJJrMA5fk+nWnVge83Fwy8nF3dWNsqOrdg==
workbox-window@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.0.2.tgz#9b47fdb7c088aa4e8b7d0c6cfda17c8bfca6bf7f"
integrity sha512-I/X+qUh1AwN9x/MxFbXsPn7DA27BMtzkXo55w1tBD8V54fv8nUCeC5E4RpXt/mlgdSwBztnURCQTWsdhTrSUjg==
dependencies:
workbox-core "^6.0.2"
workerpool@6.0.2:
version "6.0.2"