From 8cb76bcc4e1b1567a7cce223d8f05fc9af578ee3 Mon Sep 17 00:00:00 2001 From: monochromer Date: Wed, 17 Apr 2024 23:37:27 +0500 Subject: [PATCH 01/10] =?UTF-8?q?=D0=9C=D0=B8=D0=B3=D1=80=D0=B8=D1=80?= =?UTF-8?q?=D1=83=D0=B5=D1=82=20=D0=BD=D0=B0=20Eleventy@3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .remarkrc.js | 4 +- eleventy.config.js | 14 +- eslint.config.js | 8 +- gulpfile.js | 39 +- package-lock.json | 918 +++++++----------------- package.json | 3 +- src/articles/articles.11tydata.js | 2 +- src/data/site.js | 2 +- src/eleventy-config/collections.js | 4 +- src/eleventy-config/filters.js | 4 +- src/eleventy-config/markdown-library.js | 8 +- src/eleventy-config/shortcodes.js | 2 +- src/eleventy-config/static-files.js | 2 +- src/eleventy-config/transforms.js | 17 +- src/libs/markdown-it-anchor.js | 2 +- src/libs/pagination.js | 6 +- src/libs/podcasts-service.js | 15 +- src/pages/articles/index.11tydata.js | 4 +- src/pages/index/index.11tydata.js | 2 +- src/pages/podcast/index.11tydata.js | 4 +- src/people/people.11tydata.js | 2 +- 21 files changed, 342 insertions(+), 720 deletions(-) diff --git a/.remarkrc.js b/.remarkrc.js index 6ea24bd91..af52ec19d 100644 --- a/.remarkrc.js +++ b/.remarkrc.js @@ -1,4 +1,4 @@ -const Typograf = require('typograf'); +import Typograf from 'typograf'; const privateLabel = '\uF000'; // Узкий неразрывный пробел для сокращений т.д. и т.п. @@ -43,7 +43,7 @@ const typograf = new Typograf({ typograf.enableRule('ru/nnbsp/abbr'); typograf.disableRule('ru/nbsp/abbr'); -module.exports = { +export default { settings: { commonmark: true, emphasis: '_', diff --git a/eleventy.config.js b/eleventy.config.js index 1c5f711c3..a692dd518 100644 --- a/eleventy.config.js +++ b/eleventy.config.js @@ -1,21 +1,21 @@ -module.exports = function(eleventyConfig) { +export default async function(eleventyConfig) { // Настройка Markdown - require('./src/eleventy-config/markdown-library.js')(eleventyConfig); + (await import('./src/eleventy-config/markdown-library.js')).default(eleventyConfig); // Коллекции - require('./src/eleventy-config/collections.js')(eleventyConfig); + (await import('./src/eleventy-config/collections.js')).default(eleventyConfig); // Фильтры - require('./src/eleventy-config/filters.js')(eleventyConfig); + (await import('./src/eleventy-config/filters.js')).default(eleventyConfig); // Трансформации - require('./src/eleventy-config/transforms.js')(eleventyConfig); + (await import('./src/eleventy-config/transforms.js')).default(eleventyConfig); // Теги - require('./src/eleventy-config/shortcodes.js')(eleventyConfig); + (await import('./src/eleventy-config/shortcodes.js')).default(eleventyConfig); // Копирование - require('./src/eleventy-config/static-files.js')(eleventyConfig); + (await import('./src/eleventy-config/static-files.js')).default(eleventyConfig); return { dir: { diff --git a/eslint.config.js b/eslint.config.js index 9ae99cd29..b462b1138 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,8 +1,8 @@ -const globals = require('globals'); -const js = require('@eslint/js'); -const stylisticJs = require('@stylistic/eslint-plugin-js'); +import globals from 'globals'; +import js from '@eslint/js'; +import stylisticJs from '@stylistic/eslint-plugin-js'; -module.exports = [ +export default [ js.configs.recommended, // Глобальные переменные только для скриптов Node.js diff --git a/gulpfile.js b/gulpfile.js index 0ac308986..147e626b9 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,27 +1,28 @@ -const babel = require('gulp-babel'); -const buffer = require('vinyl-buffer'); -const del = require('del'); -const fs = require('fs'); -const gulp = require('gulp'); -const paths = require('vinyl-paths'); -const postcss = require('gulp-postcss'); -const replace = require('gulp-replace'); -const rev = require('gulp-rev'); -const rewrite = require('gulp-rev-rewrite'); -const rollup = require('rollup-stream'); -const source = require('vinyl-source-stream'); -const terser = require('gulp-terser'); +import babel from 'gulp-babel'; +import buffer from 'vinyl-buffer'; +import del from 'del'; +import fs from 'fs'; +import gulp from 'gulp'; +import paths from 'vinyl-paths'; +import postcss from 'gulp-postcss'; +import replace from 'gulp-replace'; +import rev from 'gulp-rev'; +import rewrite from 'gulp-rev-rewrite'; +import rollup from 'rollup-stream'; +import source from 'vinyl-source-stream'; +import terser from 'gulp-terser'; // Styles +const postCssPlugins = await Promise.all([ + 'postcss-import', + 'postcss-color-hex-alpha', + 'autoprefixer', + 'postcss-csso', +].map((name) => import(name).then(module => module.default))); gulp.task('styles', () => { return gulp.src('dist/styles/{styles,print}.css') - .pipe(postcss([ - require('postcss-import'), - require('postcss-color-hex-alpha'), - require('autoprefixer'), - require('postcss-csso'), - ])) + .pipe(postcss(postCssPlugins)) .pipe(gulp.dest('dist/styles')); }); diff --git a/package-lock.json b/package-lock.json index 77068a527..b5694a75e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,7 @@ "packages": { "": { "devDependencies": { - "@11ty/eleventy": "^2.0.1", + "@11ty/eleventy": "^3.0.0-alpha.6", "@11ty/eleventy-img": "^4.0.2", "@babel/core": "^7.15.5", "@babel/preset-env": "^7.15.6", @@ -60,61 +60,80 @@ } }, "node_modules/@11ty/dependency-tree": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-2.0.1.tgz", - "integrity": "sha512-5R+DsT9LJ9tXiSQ4y+KLFppCkQyXhzAm1AIuBWE/sbU0hSXY5pkhoqQYEcPJQFg/nglL+wD55iv2j+7O96UAvg==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-3.0.0.tgz", + "integrity": "sha512-+M+/KdAptDTK4USkI124CKoScvt2y0v1EoLBjS2rUi9zydjWgEC7+EJJ7Eu1DXuObe0JmY09LORjdBGKNPxgtg==", + "dev": true, + "dependencies": { + "@11ty/eleventy-utils": "^1.0.2" + } + }, + "node_modules/@11ty/dependency-tree-esm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree-esm/-/dependency-tree-esm-1.0.0.tgz", + "integrity": "sha512-Z3KN1Fkv50UM/ZzTR3VBbyOY52HnmhIVCsAV1hn2UzFsGAjyF1Cw8uohhVtheDOSuBR7ZSeo1unwkz1HxFlUtQ==", + "dev": true, + "dependencies": { + "@11ty/eleventy-utils": "^1.0.2", + "acorn": "^8.10.0", + "dependency-graph": "^0.11.0", + "normalize-path": "^3.0.0" + } + }, + "node_modules/@11ty/dependency-tree-esm/node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } }, "node_modules/@11ty/eleventy": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-2.0.1.tgz", - "integrity": "sha512-t8XVUbCJByhVEa1RzO0zS2QzbL3wPY8ot1yUw9noqiSHxJWUwv6jiwm1/MZDPTYtkZH2ZHvdQIRQ5/SjG9XmLw==", + "version": "3.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-3.0.0-alpha.6.tgz", + "integrity": "sha512-wllqMiM3A9qRt1mUA6iETQfhRtpFfUnzCT7v4RK/5RFqX/Bjwmqe18v7dfStHSO+V2zv5hE32skdM23HigG+eg==", "dev": true, "dependencies": { - "@11ty/dependency-tree": "^2.0.1", + "@11ty/dependency-tree": "^3.0.0", + "@11ty/dependency-tree-esm": "^1.0.0", "@11ty/eleventy-dev-server": "^1.0.4", - "@11ty/eleventy-utils": "^1.0.1", + "@11ty/eleventy-utils": "^1.0.2", "@11ty/lodash-custom": "^4.17.21", - "@iarna/toml": "^2.2.5", - "@sindresorhus/slugify": "^1.1.2", - "bcp-47-normalize": "^1.1.1", - "chokidar": "^3.5.3", + "@11ty/posthtml-urls": "^1.0.0", + "@sindresorhus/slugify": "^2.2.1", + "bcp-47-normalize": "^2.3.0", + "chokidar": "^3.6.0", "cross-spawn": "^7.0.3", "debug": "^4.3.4", - "dependency-graph": "^0.11.0", - "ejs": "^3.1.9", - "fast-glob": "^3.2.12", + "dependency-graph": "^1.0.0", + "fast-glob": "^3.3.2", "graceful-fs": "^4.2.11", "gray-matter": "^4.0.3", - "hamljs": "^0.6.2", - "handlebars": "^4.7.7", "is-glob": "^4.0.3", - "iso-639-1": "^2.1.15", + "iso-639-1": "^3.1.2", "kleur": "^4.1.5", - "liquidjs": "^10.7.0", - "luxon": "^3.3.0", - "markdown-it": "^13.0.1", + "liquidjs": "^10.10.2", + "luxon": "^3.4.4", + "markdown-it": "^14.1.0", "micromatch": "^4.0.5", "minimist": "^1.2.8", "moo": "^0.5.2", - "multimatch": "^5.0.0", - "mustache": "^4.2.0", + "multimatch": "^7.0.0", + "node-retrieve-globals": "^5.0.0", "normalize-path": "^3.0.0", - "nunjucks": "^3.2.3", - "path-to-regexp": "^6.2.1", + "nunjucks": "^3.2.4", "please-upgrade-node": "^3.2.0", "posthtml": "^0.16.6", - "posthtml-urls": "^1.0.0", - "pug": "^3.0.2", "recursive-copy": "^2.0.14", - "semver": "^7.3.8", + "semver": "^7.6.0", "slugify": "^1.6.6" }, "bin": { - "eleventy": "cmd.js" + "eleventy": "cmd.cjs" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { "type": "opencollective", @@ -220,6 +239,22 @@ "url": "https://opencollective.com/11ty" } }, + "node_modules/@11ty/posthtml-urls": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@11ty/posthtml-urls/-/posthtml-urls-1.0.0.tgz", + "integrity": "sha512-CcsRdI933x613u7CjM+QGs7iD/m8SaDup3Apohg1+7dybigrEUHc2jGS3mcMgQKvF2+IphqmepD/FrKLlPkPEg==", + "dev": true, + "dependencies": { + "evaluate-value": "^2.0.0", + "http-equiv-refresh": "^2.0.1", + "list-to-array": "^1.1.0", + "object.entries": "^1.1.7", + "parse-srcset": "^1.0.2" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -2234,12 +2269,6 @@ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true - }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.3", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.3.tgz", @@ -3017,44 +3046,58 @@ } }, "node_modules/@sindresorhus/slugify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.2.tgz", - "integrity": "sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", + "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", "dev": true, "dependencies": { - "@sindresorhus/transliterate": "^0.1.1", - "escape-string-regexp": "^4.0.0" + "@sindresorhus/transliterate": "^1.0.0", + "escape-string-regexp": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/slugify/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@sindresorhus/transliterate": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz", - "integrity": "sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz", + "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==", "dev": true, "dependencies": { - "escape-string-regexp": "^2.0.0", - "lodash.deburr": "^4.1.0" + "escape-string-regexp": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@sindresorhus/transliterate/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@stylistic/eslint-plugin-js": { @@ -3177,12 +3220,6 @@ "@types/unist": "*" } }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", @@ -3268,6 +3305,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -3366,12 +3412,6 @@ "node": ">=0.10.0" } }, - "node_modules/any-promise": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", - "integrity": "sha512-lqzY9o+BbeGHRCOyxQkt/Tgvz0IZhTmQiA+LxQW8wSNpcTbj8K+0cZiSEvbpNZZP9/11Gy7dnLO3GNWUXO4d1g==", - "dev": true - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -3461,12 +3501,15 @@ } }, "node_modules/array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-4.0.0.tgz", + "integrity": "sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==", "dev": true, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/array-each": { @@ -3580,27 +3623,12 @@ "node": ">=0.10.0" } }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, - "node_modules/assert-never": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", - "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==", - "dev": true - }, "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -3619,12 +3647,6 @@ "node": ">=8" } }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true - }, "node_modules/async-done": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", @@ -3761,18 +3783,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-walk": { - "version": "3.0.0-canary-5", - "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", - "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.9.6" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/bach": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", @@ -3860,14 +3870,14 @@ ] }, "node_modules/bcp-47": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-1.0.8.tgz", - "integrity": "sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", "dev": true, "dependencies": { - "is-alphabetical": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0" + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" }, "funding": { "type": "github", @@ -3875,9 +3885,9 @@ } }, "node_modules/bcp-47-match": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-1.0.3.tgz", - "integrity": "sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", "dev": true, "funding": { "type": "github", @@ -3885,13 +3895,13 @@ } }, "node_modules/bcp-47-normalize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-1.1.1.tgz", - "integrity": "sha512-jWZ1Jdu3cs0EZdfCkS0UE9Gg01PtxnChjEBySeB+Zo6nkqtFfnvtoQQgP1qU1Oo4qgJgxhTI6Sf9y/pZIhPs0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-2.3.0.tgz", + "integrity": "sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q==", "dev": true, "dependencies": { - "bcp-47": "^1.0.0", - "bcp-47-match": "^1.0.0" + "bcp-47": "^2.0.0", + "bcp-47-match": "^2.0.0" }, "funding": { "type": "github", @@ -4177,15 +4187,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", - "dev": true, - "dependencies": { - "is-regex": "^1.0.3" - } - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -4586,16 +4587,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/constantinople": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", - "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.1" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -4968,12 +4959,12 @@ } }, "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", "dev": true, "engines": { - "node": ">= 0.6.0" + "node": ">=4" } }, "node_modules/dequal": { @@ -5040,12 +5031,6 @@ "node": ">=8" } }, - "node_modules/doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", - "dev": true - }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -5200,21 +5185,6 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/electron-to-chromium": { "version": "1.4.736", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz", @@ -5314,6 +5284,18 @@ "node": ">= 0.4" } }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", @@ -5691,6 +5673,15 @@ "node": ">=8" } }, + "node_modules/esm-import-transformer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/esm-import-transformer/-/esm-import-transformer-3.0.2.tgz", + "integrity": "sha512-PgvO0wro44lTDM9pYeeOIfpS0lGF80jA+rjT7sBd3b07rxv1AxeNMEI5kSCqRKke2W6SPEz17W3kHOLjaiD7Cw==", + "dev": true, + "dependencies": { + "acorn": "^8.11.2" + } + }, "node_modules/esniff": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", @@ -5778,6 +5769,15 @@ "node": ">=0.10.0" } }, + "node_modules/evaluate-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/evaluate-value/-/evaluate-value-2.0.0.tgz", + "integrity": "sha512-VonfiuDJc0z4sOO7W0Pd130VLsXN6vmBWZlrog1mCb/o7o/Nl5Lr25+Kj/nkCCAhG+zqeeGjxhkK9oHpkgTHhQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -6074,36 +6074,6 @@ "dev": true, "optional": true }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fileset": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", @@ -7436,33 +7406,6 @@ "node": ">= 0.10" } }, - "node_modules/hamljs": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/hamljs/-/hamljs-0.6.2.tgz", - "integrity": "sha512-/chXRp4WpL47I+HX1vCCdSbEXAljEG2FBMmgO7Am0bYsqgnEjreeWzUdX1onXqwZtcfgxbCg5WtEYYvuZ5muBg==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -7508,21 +7451,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -7684,12 +7612,12 @@ } }, "node_modules/http-equiv-refresh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-equiv-refresh/-/http-equiv-refresh-1.0.0.tgz", - "integrity": "sha512-TScO04soylRN9i/QdOdgZyhydXg9z6XdaGzEyOgDKycePeDeTT4KvigjBcI+tgfTlieLWauGORMq5F1eIDa+1w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-equiv-refresh/-/http-equiv-refresh-2.0.1.tgz", + "integrity": "sha512-XJpDL/MLkV3dKwLzHwr2dY05dYNfBNlyPu4STQ8WvKCFdc6vC5tPXuq28of663+gHVg03C+16pHHs/+FmmDjcw==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">= 6" } }, "node_modules/hyphen": { @@ -7861,9 +7789,9 @@ } }, "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", "dev": true, "funding": { "type": "github", @@ -7871,13 +7799,13 @@ } }, "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", "dev": true, "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" }, "funding": { "type": "github", @@ -7933,9 +7861,9 @@ } }, "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", "dev": true, "funding": { "type": "github", @@ -7961,28 +7889,6 @@ "integrity": "sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==", "dev": true }, - "node_modules/is-expression": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", - "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "object-assign": "^4.1.1" - } - }, - "node_modules/is-expression/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", @@ -8106,28 +8012,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -8201,9 +8085,9 @@ "dev": true }, "node_modules/iso-639-1": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-2.1.15.tgz", - "integrity": "sha512-7c7mBznZu2ktfvyT582E2msM+Udc1EjOyhVRE/0ZsjD9LBtWSm23h3PtiRh2a35XoUsTQQjJXaJzuLjXsOdFDg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-3.1.2.tgz", + "integrity": "sha512-Le7BRl3Jt9URvaiEHJCDEdvPZCfhiQoXnFgLAWNRhzFMwRFdWO7/5tLRQbiPzE394I9xd7KdRCM7S6qdOhwG5A==", "dev": true, "engines": { "node": ">=6.0" @@ -8252,100 +8136,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", - "dev": true - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8412,16 +8202,6 @@ "node": ">=6" } }, - "node_modules/jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", - "dev": true, - "dependencies": { - "is-promise": "^2.0.0", - "promise": "^7.0.1" - } - }, "node_modules/junk": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz", @@ -8625,12 +8405,12 @@ } }, "node_modules/linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "node_modules/liquidjs": { @@ -8747,12 +8527,6 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "node_modules/lodash.deburr": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", - "integrity": "sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==", - "dev": true - }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", @@ -8937,19 +8711,20 @@ } }, "node_modules/markdown-it": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", - "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "dependencies": { "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, "bin": { - "markdown-it": "bin/markdown-it.js" + "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/markdown-it-multimd-table": { @@ -8958,18 +8733,6 @@ "integrity": "sha512-KepCr2OMJqm7IT6sOIbuqHGe+NERhgy66XMrc5lo6dHW7oaPzMDtYwR1EGwK16/blb6mCSg4jqityOe0o/H7HA==", "dev": true }, - "node_modules/markdown-it/node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/matchdep": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", @@ -9352,9 +9115,9 @@ "dev": true }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, "node_modules/meow": { @@ -9962,31 +9725,56 @@ "dev": true }, "node_modules/multimatch": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", - "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-7.0.0.tgz", + "integrity": "sha512-SYU3HBAdF4psHEL/+jXDKHO95/m5P2RvboHT2Y0WtTttvJLP4H/2WS9WlQPFvF6C8d6SpLw8vjCnQOnVIVOSJQ==", "dev": true, "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" + "array-differ": "^4.0.0", + "array-union": "^3.0.1", + "minimatch": "^9.0.3" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "node_modules/multimatch/node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", "dev": true, - "bin": { - "mustache": "bin/mustache" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/multimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/multimatch/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mute-stdout": { @@ -10051,12 +9839,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -10098,6 +9880,17 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, + "node_modules/node-retrieve-globals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-5.0.0.tgz", + "integrity": "sha512-C4R0rtPEoxJaeo8RnLWx3VMvFgs0fAePFvI6WHBS2BS/aNxuHwL9IK922UBOjHnD5UKVfY1Xef9qk/BkmLrWiw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2", + "acorn-walk": "^8.3.1", + "esm-import-transformer": "^3.0.2" + } + }, "node_modules/node-w3c-validator": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-w3c-validator/-/node-w3c-validator-2.0.2.tgz", @@ -10446,6 +10239,20 @@ "node": ">=0.10.0" } }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", @@ -10952,12 +10759,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -11365,21 +11166,6 @@ "node": ">=12" } }, - "node_modules/posthtml-urls": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/posthtml-urls/-/posthtml-urls-1.0.0.tgz", - "integrity": "sha512-CMJ0L009sGQVUuYM/g6WJdscsq6ooAwhUuF6CDlYPMLxKp2rmCYVebEU+wZGxnQstGJhZPMvXsRhtqekILd5/w==", - "dev": true, - "dependencies": { - "http-equiv-refresh": "^1.0.0", - "list-to-array": "^1.1.0", - "parse-srcset": "^1.0.2", - "promise-each": "^2.2.0" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -11431,145 +11217,12 @@ "asap": "~2.0.3" } }, - "node_modules/promise-each": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/promise-each/-/promise-each-2.2.0.tgz", - "integrity": "sha512-67roqt1k3QDA41DZ8xi0V+rF3GoaMiX7QilbXu0vXimut+9RcKBNZ/t60xCRgcsihmNUsEjh48xLfNqOrKblUg==", - "dev": true, - "dependencies": { - "any-promise": "^0.1.0" - } - }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true }, - "node_modules/pug": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", - "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", - "dev": true, - "dependencies": { - "pug-code-gen": "^3.0.2", - "pug-filters": "^4.0.0", - "pug-lexer": "^5.0.1", - "pug-linker": "^4.0.0", - "pug-load": "^3.0.0", - "pug-parser": "^6.0.0", - "pug-runtime": "^3.0.1", - "pug-strip-comments": "^2.0.0" - } - }, - "node_modules/pug-attrs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", - "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", - "dev": true, - "dependencies": { - "constantinople": "^4.0.1", - "js-stringify": "^1.0.2", - "pug-runtime": "^3.0.0" - } - }, - "node_modules/pug-code-gen": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", - "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", - "dev": true, - "dependencies": { - "constantinople": "^4.0.1", - "doctypes": "^1.1.0", - "js-stringify": "^1.0.2", - "pug-attrs": "^3.0.0", - "pug-error": "^2.0.0", - "pug-runtime": "^3.0.0", - "void-elements": "^3.1.0", - "with": "^7.0.0" - } - }, - "node_modules/pug-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", - "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", - "dev": true - }, - "node_modules/pug-filters": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", - "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", - "dev": true, - "dependencies": { - "constantinople": "^4.0.1", - "jstransformer": "1.0.0", - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0", - "resolve": "^1.15.1" - } - }, - "node_modules/pug-lexer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", - "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", - "dev": true, - "dependencies": { - "character-parser": "^2.2.0", - "is-expression": "^4.0.0", - "pug-error": "^2.0.0" - } - }, - "node_modules/pug-linker": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", - "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", - "dev": true, - "dependencies": { - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0" - } - }, - "node_modules/pug-load": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", - "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "pug-walk": "^2.0.0" - } - }, - "node_modules/pug-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", - "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", - "dev": true, - "dependencies": { - "pug-error": "^2.0.0", - "token-stream": "1.0.0" - } - }, - "node_modules/pug-runtime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", - "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", - "dev": true - }, - "node_modules/pug-strip-comments": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", - "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", - "dev": true, - "dependencies": { - "pug-error": "^2.0.0" - } - }, - "node_modules/pug-walk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", - "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", - "dev": true - }, "node_modules/pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", @@ -11600,6 +11253,15 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/queue": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", @@ -13736,12 +13398,6 @@ "node": ">= 0.10" } }, - "node_modules/token-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", - "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", - "dev": true - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -13811,9 +13467,9 @@ } }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, "node_modules/uglify-js": { @@ -14915,15 +14571,6 @@ "node": ">=0.10" } }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/walk-up-path": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", @@ -14976,27 +14623,6 @@ "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", "dev": true }, - "node_modules/with": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", - "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.9.6", - "@babel/types": "^7.9.6", - "assert-never": "^1.2.1", - "babel-walk": "3.0.0-canary-5" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, "node_modules/wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", diff --git a/package.json b/package.json index 1135143bc..0833f5b83 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "node": ">=16", "npm": ">=8" }, + "type": "module", "scripts": { "start": "cross-env NODE_ENV=development eleventy --serve --quiet --incremental", "editorconfig": "editorconfig-checker", @@ -17,7 +18,7 @@ "deploy": "cd dist && rsync --progress --archive --compress --delete . wst@web-standards.ru:/var/www/web-standards.ru/html/" }, "devDependencies": { - "@11ty/eleventy": "^2.0.1", + "@11ty/eleventy": "^3.0.0-alpha.6", "@11ty/eleventy-img": "^4.0.2", "@babel/core": "^7.15.5", "@babel/preset-env": "^7.15.6", diff --git a/src/articles/articles.11tydata.js b/src/articles/articles.11tydata.js index 341121bee..ecdd8c3f4 100644 --- a/src/articles/articles.11tydata.js +++ b/src/articles/articles.11tydata.js @@ -11,7 +11,7 @@ function filterPeople(peopleList, filterList) { }); } -module.exports = { +export default { layout: 'article.njk', numberOfRelatedArticles: 3, diff --git a/src/data/site.js b/src/data/site.js index bf3d2c146..325f1d496 100644 --- a/src/data/site.js +++ b/src/data/site.js @@ -1,4 +1,4 @@ -module.exports = { +export default { 'title': 'Веб-стандарты', 'subTitle': 'Сообщество разработчиков', 'description': 'Авторские и переводные статьи по фронтенду', diff --git a/src/eleventy-config/collections.js b/src/eleventy-config/collections.js index 51ac4c186..34618aa6c 100644 --- a/src/eleventy-config/collections.js +++ b/src/eleventy-config/collections.js @@ -1,6 +1,6 @@ -const { getEpisodesData } = require('../libs/podcasts-service.js'); +import { getEpisodesData } from '../libs/podcasts-service.js'; -module.exports = function(eleventyConfig) { +export default function(eleventyConfig) { eleventyConfig.addCollection('tagList', (collection) => { const set = new Set(); for (const item of collection.getAllSorted()) { diff --git a/src/eleventy-config/filters.js b/src/eleventy-config/filters.js index 8233635bf..2c521869b 100644 --- a/src/eleventy-config/filters.js +++ b/src/eleventy-config/filters.js @@ -1,6 +1,6 @@ -const hyphenLibRu = require('hyphen/ru'); +import hyphenLibRu from 'hyphen/ru/index.js'; -module.exports = function(eleventyConfig) { +export default function(eleventyConfig) { eleventyConfig.addFilter('limit', (array, limit) => { return array.slice(0, limit); }); diff --git a/src/eleventy-config/markdown-library.js b/src/eleventy-config/markdown-library.js index 0308a5861..d9382bdfc 100644 --- a/src/eleventy-config/markdown-library.js +++ b/src/eleventy-config/markdown-library.js @@ -1,8 +1,8 @@ -const markdownIt = require('markdown-it'); -const markdownItMultimdTable = require('markdown-it-multimd-table'); -const markdownItAnchor = require('../libs/markdown-it-anchor.js'); +import markdownIt from 'markdown-it'; +import markdownItMultimdTable from 'markdown-it-multimd-table'; +import markdownItAnchor from '../libs/markdown-it-anchor.js'; -module.exports = function(eleventyConfig) { +export default function(eleventyConfig) { const md = markdownIt({ html: true, highlight: function(str, lang) { diff --git a/src/eleventy-config/shortcodes.js b/src/eleventy-config/shortcodes.js index 642ed608c..2170636e9 100644 --- a/src/eleventy-config/shortcodes.js +++ b/src/eleventy-config/shortcodes.js @@ -1,4 +1,4 @@ -module.exports = function(eleventyConfig) { +export default function(eleventyConfig) { // генерация псевдослучайных CSS-классов для оформления аватаров eleventyConfig.addShortcode('blob', function(authorName) { const blobColors = [1, 2, 3, 4]; diff --git a/src/eleventy-config/static-files.js b/src/eleventy-config/static-files.js index 81a623f05..baf700d57 100644 --- a/src/eleventy-config/static-files.js +++ b/src/eleventy-config/static-files.js @@ -1,4 +1,4 @@ -module.exports = function(eleventyConfig) { +export default function(eleventyConfig) { [ 'src/favicon.ico', 'src/manifest.json', diff --git a/src/eleventy-config/transforms.js b/src/eleventy-config/transforms.js index 01af79f64..40a5ee053 100644 --- a/src/eleventy-config/transforms.js +++ b/src/eleventy-config/transforms.js @@ -1,11 +1,12 @@ -const path = require('node:path'); -const htmlmin = require('html-minifier'); -const prettydata = require('pretty-data'); -const { parseHTML } = require('linkedom'); -const Image = require('@11ty/eleventy-img'); -const sharp = require('sharp'); +import path from 'node:path'; +import os from 'node:os'; +import htmlmin from 'html-minifier'; +import prettydata from 'pretty-data'; +import { parseHTML } from 'linkedom'; +import Image from '@11ty/eleventy-img'; +import sharp from 'sharp'; -Image.concurrency = require('os').cpus().length; +Image.concurrency = os.availableParallelism ? os.availableParallelism() : os.cpus().length; const isProdMode = process.env.NODE_ENV === 'production'; @@ -41,7 +42,7 @@ async function processImage({ imageElement, inputPath, options, attributes }) { imageElement.replaceWith(tempElement.firstElementChild); } -module.exports = function(eleventyConfig) { +export default function(eleventyConfig) { // преобразование контентных изображений eleventyConfig.addTransform('optimizeContentImages', async function(content) { if (!this.page.inputPath.includes('/articles/')) { diff --git a/src/libs/markdown-it-anchor.js b/src/libs/markdown-it-anchor.js index a3bf91921..062bc78dd 100644 --- a/src/libs/markdown-it-anchor.js +++ b/src/libs/markdown-it-anchor.js @@ -106,4 +106,4 @@ anchor.defaults = { permalinkAttrs, }; -module.exports = anchor; +export default anchor; diff --git a/src/libs/pagination.js b/src/libs/pagination.js index bea2d17c4..fecc707e3 100644 --- a/src/libs/pagination.js +++ b/src/libs/pagination.js @@ -2,7 +2,7 @@ function clamp(min, value, max) { return Math.max(min, Math.min(value, max)); } -function createPaginationModel({ eleventyData, collection, pageRange = 5 }) { +export function createPaginationModel({ eleventyData, collection, pageRange = 5 }) { const { pagination } = eleventyData; const itemsCount = collection.length; @@ -41,7 +41,3 @@ function createPaginationModel({ eleventyData, collection, pageRange = 5 }) { isNeedShowLastDivider: slice.at(-1).originalIndex < pagination.hrefs.length - 2, }; } - -module.exports = { - createPaginationModel, -}; diff --git a/src/libs/podcasts-service.js b/src/libs/podcasts-service.js index d637310e8..69fd43729 100644 --- a/src/libs/podcasts-service.js +++ b/src/libs/podcasts-service.js @@ -1,12 +1,12 @@ -const https = require('https'); -const { once } = require('events'); +import https from 'https'; +import { once } from 'events'; -const NodeXMLStream = require('node-xml-stream'); -const { parseHTML } = require('linkedom'); +import NodeXMLStream from 'node-xml-stream'; +import { parseHTML } from 'linkedom'; const RSS_URL = 'https://web-standards.ru/podcast/feed/'; -async function getEpisodesData() { +async function _getEpisodesData() { const [response] = await once(https.get(RSS_URL), 'response'); response.setEncoding('utf8'); @@ -130,7 +130,6 @@ async function getEpisodesData() { }); } - function withCache(operation) { let cache = null; @@ -142,6 +141,4 @@ function withCache(operation) { }; } -module.exports = { - getEpisodesData: withCache(getEpisodesData), -}; +export const getEpisodesData = withCache(_getEpisodesData); diff --git a/src/pages/articles/index.11tydata.js b/src/pages/articles/index.11tydata.js index 37b3b3d4c..7d0b1659c 100644 --- a/src/pages/articles/index.11tydata.js +++ b/src/pages/articles/index.11tydata.js @@ -1,6 +1,6 @@ -const { createPaginationModel } = require('../../libs/pagination.js'); +import { createPaginationModel } from '../../libs/pagination.js'; -module.exports = { +export default { pagination: { data: 'collections.articles', reverse: true, diff --git a/src/pages/index/index.11tydata.js b/src/pages/index/index.11tydata.js index 27cee9e2e..2916212ac 100644 --- a/src/pages/index/index.11tydata.js +++ b/src/pages/index/index.11tydata.js @@ -1,4 +1,4 @@ -module.exports = { +export default { eleventyComputed: { indexArticles: function(data) { const articles = data.collections.articles.slice().reverse(); diff --git a/src/pages/podcast/index.11tydata.js b/src/pages/podcast/index.11tydata.js index a5d210d83..e67f80b7a 100644 --- a/src/pages/podcast/index.11tydata.js +++ b/src/pages/podcast/index.11tydata.js @@ -1,6 +1,6 @@ -const { createPaginationModel } = require('../../libs/pagination.js'); +import { createPaginationModel } from '../../libs/pagination.js'; -module.exports = { +export default { pagination: { data: 'collections.episodes', alias: 'episodesChunk', diff --git a/src/people/people.11tydata.js b/src/people/people.11tydata.js index 82fef7479..6e95428d1 100644 --- a/src/people/people.11tydata.js +++ b/src/people/people.11tydata.js @@ -1,3 +1,3 @@ -module.exports = { +export default { permalink: false, }; From 3b737bc3447382eeb687891ec566a5506a51a6fd Mon Sep 17 00:00:00 2001 From: monochromer Date: Wed, 24 Apr 2024 22:49:05 +0500 Subject: [PATCH 02/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=B9=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D0=B0=20=D0=BA=D0=B0=D0=BA=20=D0=B8=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D0=B8=D0=BA=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eleventy.config.js | 4 + package-lock.json | 226 +++++++++++++++++++---------- package.json | 8 +- src/data/podcastMeta.yml | 20 +++ src/eleventy-config/collections.js | 54 ++++--- src/eleventy-config/extensions.js | 7 + src/eleventy-config/filters.js | 22 ++- src/eleventy-config/transforms.js | 26 ++-- src/includes/header.njk | 6 +- src/libs/pagination.js | 2 +- src/libs/podcasts-service.js | 144 ------------------ src/pages/episode.11tydata.js | 27 ++++ src/pages/episode.njk | 25 +--- src/pages/index/index.njk | 7 +- src/pages/podcast/feed.11ty.js | 100 +++++++++++++ src/pages/podcast/index.njk | 6 +- 16 files changed, 393 insertions(+), 291 deletions(-) create mode 100644 src/data/podcastMeta.yml create mode 100644 src/eleventy-config/extensions.js delete mode 100644 src/libs/podcasts-service.js create mode 100644 src/pages/episode.11tydata.js create mode 100644 src/pages/podcast/feed.11ty.js diff --git a/eleventy.config.js b/eleventy.config.js index a692dd518..cab2ca0e1 100644 --- a/eleventy.config.js +++ b/eleventy.config.js @@ -17,6 +17,9 @@ export default async function(eleventyConfig) { // Копирование (await import('./src/eleventy-config/static-files.js')).default(eleventyConfig); + // Расширения + (await import('./src/eleventy-config/extensions.js')).default(eleventyConfig); + return { dir: { input: 'src', @@ -31,6 +34,7 @@ export default async function(eleventyConfig) { templateFormats: [ 'md', 'njk', + '11ty.js', ], }; }; diff --git a/package-lock.json b/package-lock.json index b5694a75e..0c4520163 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "del": "6.0.0", "editorconfig-checker": "^5.0.1", "eslint": "^9.0.0", + "fast-glob": "^3.3.2", "globals": "^15.0.0", "gulp": "^4.0.2", "gulp-babel": "^8.0.0", @@ -26,17 +27,18 @@ "gulp-rev": "9.0.0", "gulp-rev-rewrite": "5.0.0", "gulp-terser": "^2.1.0", - "html-minifier": "^4.0.0", + "html-minifier-terser": "^7.2.0", "hyphen": "^1.6.2", + "js-yaml": "^4.1.0", "linkedom": "^0.16.4", "markdown-it-multimd-table": "^4.1.1", + "minify-xml": "^4.4.1", "node-w3c-validator": "^2.0.1", - "node-xml-stream": "^1.0.2", + "podcast": "github:web-standards-ru/podcast", "postcss": "^8.3.8", "postcss-color-hex-alpha": "^9.0.2", "postcss-csso": "^6.0.0", "postcss-import": "^16.0.0", - "pretty-data": "^0.40.0", "remark-cli": "^12.0.0", "remark-frontmatter": "^5.0.0", "remark-lint": "^10.0.0", @@ -59,6 +61,21 @@ "npm": ">=8" } }, + "../web-standards-ru-podcast": { + "name": "podcast", + "extraneous": true, + "devDependencies": { + "@11ty/eleventy": "^3.0.0-alpha.6", + "editorconfig-checker": "^5.1.1", + "html-minifier-terser": "^7.1.0", + "js-yaml": "^4.1.0", + "minify-xml": "3.5.0" + }, + "engines": { + "node": ">=16", + "npm": ">=8" + } + }, "node_modules/@11ty/dependency-tree": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-3.0.0.tgz", @@ -4116,13 +4133,13 @@ } }, "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, "node_modules/camelcase": { @@ -4267,15 +4284,15 @@ } }, "node_modules/clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, "dependencies": { "source-map": "~0.6.0" }, "engines": { - "node": ">= 4.0" + "node": ">= 10.0" } }, "node_modules/clean-stack": { @@ -5086,6 +5103,16 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -7526,15 +7553,6 @@ "node": ">= 0.4" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -7559,25 +7577,34 @@ "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", "dev": true }, - "node_modules/html-minifier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", - "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", "dev": true, "dependencies": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^2.19.0", - "he": "^1.2.0", - "param-case": "^2.1.1", + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", "relateurl": "^0.2.7", - "uglify-js": "^3.5.1" + "terser": "^5.15.1" }, "bin": { - "html-minifier": "cli.js" + "html-minifier-terser": "cli.js" }, "engines": { - "node": ">=6" + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" } }, "node_modules/html-tags": { @@ -8642,10 +8669,13 @@ } }, "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "dev": true + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } }, "node_modules/lru-cache": { "version": "5.1.1", @@ -9633,6 +9663,56 @@ "node": ">=6" } }, + "node_modules/minify-xml": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/minify-xml/-/minify-xml-4.4.1.tgz", + "integrity": "sha512-qPAtnZjc7XqxzawXD3d8yAk+58nEq+rie+fUn2ueqBt5WNeanyhyCRTyw+2+OStusQmDKHBHfR4UMBNLExXRcQ==", + "dev": true, + "dependencies": { + "meow": "^13.2.0", + "pumpify": "^2.0.1", + "replacestream": "^4.0.3" + }, + "bin": { + "minify-xml": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/minify-xml/node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/minify-xml/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/minify-xml/node_modules/pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "dev": true, + "dependencies": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -9846,12 +9926,13 @@ "dev": true }, "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "dependencies": { - "lower-case": "^1.1.1" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, "node_modules/node-fetch": { @@ -9989,12 +10070,6 @@ "node": ">=8" } }, - "node_modules/node-xml-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-xml-stream/-/node-xml-stream-1.0.2.tgz", - "integrity": "sha512-W4LzsKQ1x3TldQQmXZfM/JO+3SPp+zzvA2Nf82chE7vXnZy7LqHjIqQe9yDUw58g2fTOaJo+DlPnIDfmozgsuw==", - "dev": true - }, "node_modules/nopt": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", @@ -10571,12 +10646,13 @@ } }, "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "dependencies": { - "no-case": "^2.2.0" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, "node_modules/parent-module": { @@ -10656,6 +10732,16 @@ "node": ">= 0.8" } }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -10855,6 +10941,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/podcast": { + "resolved": "git+ssh://git@github.com/web-standards-ru/podcast.git#c8d7b67e528a0e46e0650c7b3985382c9cb48d9d", + "dev": true, + "engines": { + "node": ">=16", + "npm": ">=8" + } + }, "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -11175,15 +11269,6 @@ "node": ">= 0.8.0" } }, - "node_modules/pretty-data": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/pretty-data/-/pretty-data-0.40.0.tgz", - "integrity": "sha512-YFLnEdDEDnkt/GEhet5CYZHCvALw6+Elyb/tp8kQG03ZSIuzeaDWpZYndCXwgqu4NAjh1PI534dhDS1mHarRnQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -13418,8 +13503,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true, - "optional": true + "dev": true }, "node_modules/type": { "version": "2.7.2", @@ -13472,18 +13556,6 @@ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/uhyphen": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", @@ -14114,12 +14186,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "dev": true - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/package.json b/package.json index 0833f5b83..26de85966 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "del": "6.0.0", "editorconfig-checker": "^5.0.1", "eslint": "^9.0.0", + "fast-glob": "^3.3.2", "globals": "^15.0.0", "gulp": "^4.0.2", "gulp-babel": "^8.0.0", @@ -39,17 +40,18 @@ "gulp-rev": "9.0.0", "gulp-rev-rewrite": "5.0.0", "gulp-terser": "^2.1.0", - "html-minifier": "^4.0.0", + "html-minifier-terser": "^7.2.0", "hyphen": "^1.6.2", + "js-yaml": "^4.1.0", "linkedom": "^0.16.4", "markdown-it-multimd-table": "^4.1.1", + "minify-xml": "^4.4.1", "node-w3c-validator": "^2.0.1", - "node-xml-stream": "^1.0.2", + "podcast": "github:web-standards-ru/podcast", "postcss": "^8.3.8", "postcss-color-hex-alpha": "^9.0.2", "postcss-csso": "^6.0.0", "postcss-import": "^16.0.0", - "pretty-data": "^0.40.0", "remark-cli": "^12.0.0", "remark-frontmatter": "^5.0.0", "remark-lint": "^10.0.0", diff --git a/src/data/podcastMeta.yml b/src/data/podcastMeta.yml new file mode 100644 index 000000000..78b8139cf --- /dev/null +++ b/src/data/podcastMeta.yml @@ -0,0 +1,20 @@ +title: Веб-стандарты +subtitle: Новости фронтенда за неделю +description: Новости фронтенда в еженедельном подкасте сообщества «[Веб-стандарты](https://web-standards.ru/)» + +url: https://web-standards.ru/podcast/ +author: Сообщество «Веб-стандарты» +type: episodic +categories: + - title: Technology + - title: News + items: + - Tech News +explicit: false +language: ru + +owner: + name: Веб-стандарты + email: wst@web-standards.ru + +copyright: СС BY-NC-ND 4.0 diff --git a/src/eleventy-config/collections.js b/src/eleventy-config/collections.js index 34618aa6c..25bb9f4ae 100644 --- a/src/eleventy-config/collections.js +++ b/src/eleventy-config/collections.js @@ -1,4 +1,7 @@ -import { getEpisodesData } from '../libs/podcasts-service.js'; +import path from 'node:path'; +import fs from 'node:fs'; +import fastGlob from 'fast-glob'; +import yaml from 'js-yaml'; export default function(eleventyConfig) { eleventyConfig.addCollection('tagList', (collection) => { @@ -17,22 +20,39 @@ export default function(eleventyConfig) { return [...set].sort(); }); - /* - Коллекция для выпусков подкаста. - Формат данных одного выпуска: - - episode - - title - - date - - chapters - - time - - title - - content - - hosts - - audio - */ - eleventyConfig.addCollection('episodes', () => { - return getEpisodesData(); - }); + const templatesPaths = fastGlob.sync(['node_modules/podcast/src/episodes/*/*.md']); + for (const templatePath of templatesPaths) { + const episodeFolderPath = path.dirname(templatePath); + const episodeDataFilePath = path.join(episodeFolderPath, 'index.yml'); + const relativePath = path.relative('node_modules/podcast/src/episodes', templatePath); + + const templateContent = fs.readFileSync(templatePath, { encoding: 'utf-8' }); + const templateDataFileContent = fs.readFileSync(episodeDataFilePath, { encoding: 'utf-8' }); + const templateData = yaml.load(templateDataFileContent); + + Object.assign(templateData, { + permalink: false, + layout: false, + tags: ['episodes'], + eleventyComputed: { + episode(data) { + return data?.page?.fileSlug; + }, + id(data) { + return data?.page?.fileSlug; + }, + audio(data) { + return `https://web-standards.ru/podcast/episodes/${data.episode}.mp3`; + }, + // TODO: убрать mock + fileSize() { + return 1024 * 1024 * 10; + }, + }, + }); + + eleventyConfig.addTemplate(`episodes/${relativePath}`, templateContent, templateData); + } eleventyConfig.addCollection('people', (collectionAPI) => { return collectionAPI.getFilteredByGlob('src/people/*/*.md'); diff --git a/src/eleventy-config/extensions.js b/src/eleventy-config/extensions.js new file mode 100644 index 000000000..8e98af772 --- /dev/null +++ b/src/eleventy-config/extensions.js @@ -0,0 +1,7 @@ +import yaml from 'js-yaml'; + +export default async function(eleventyConfig) { + eleventyConfig.addDataExtension('yml', (contents) => { + return yaml.load(contents); + }); +} diff --git a/src/eleventy-config/filters.js b/src/eleventy-config/filters.js index 2c521869b..f4c5800ed 100644 --- a/src/eleventy-config/filters.js +++ b/src/eleventy-config/filters.js @@ -1,4 +1,10 @@ import hyphenLibRu from 'hyphen/ru/index.js'; +import markdownIt from 'markdown-it'; +import htmlmin from 'html-minifier-terser'; + +const markdown = markdownIt({ + html: true, +}); export default function(eleventyConfig) { eleventyConfig.addFilter('limit', (array, limit) => { @@ -48,9 +54,19 @@ export default function(eleventyConfig) { }); eleventyConfig.addFilter('markdown', (value) => { - let markdown = require('markdown-it')({ - html: true, - }); return markdown.render(value); }); + + eleventyConfig.addFilter('inlineMarkdown', (value) => { + return markdown.renderInline(value); + }); + + eleventyConfig.addFilter('htmlmin', (value) => { + return htmlmin.minify( + value, { + collapseWhitespace: true, + removeEmptyElements: true, + } + ); + }); }; diff --git a/src/eleventy-config/transforms.js b/src/eleventy-config/transforms.js index 40a5ee053..3649846a8 100644 --- a/src/eleventy-config/transforms.js +++ b/src/eleventy-config/transforms.js @@ -1,7 +1,7 @@ import path from 'node:path'; import os from 'node:os'; -import htmlmin from 'html-minifier'; -import prettydata from 'pretty-data'; +import htmlmin from 'html-minifier-terser'; +import minifyXml from 'minify-xml'; import { parseHTML } from 'linkedom'; import Image from '@11ty/eleventy-img'; import sharp from 'sharp'; @@ -76,7 +76,8 @@ export default function(eleventyConfig) { widths: ['auto', 600, 1200, 2400], // `sharp`, на данный момент, не поддерживает анимированный avif formats: isProdMode && !isGif - ? ['svg', 'avif', 'webp', 'auto'] + // ? ['svg', 'avif', 'webp', 'auto'] + ? ['svg', 'webp', 'auto'] : ['svg', 'webp', 'auto'], outputDir: outputArticleImagesFolder, urlPath: 'images/', @@ -131,7 +132,8 @@ export default function(eleventyConfig) { return [entry, entry * 2]; }), formats: isProdMode - ? ['svg', 'avif', 'webp', 'auto'] + // ? ['svg', 'avif', 'webp', 'auto'] + ? ['svg', 'webp', 'auto'] : ['svg', 'webp', 'auto'], outputDir: avatarsOutputFolder, urlPath: image.src.split('/').slice(0, -1).join('/'), @@ -146,22 +148,18 @@ export default function(eleventyConfig) { if (isProdMode) { eleventyConfig.addTransform('htmlmin', (content, outputPath) => { if (outputPath && outputPath.endsWith('.html')) { - let result = htmlmin.minify( - content, { - removeComments: true, - collapseWhitespace: true, - collapseBooleanAttributes: true, - } - ); - return result; + return htmlmin.minify(content, { + collapseWhitespace: true, + }); } return content; }); eleventyConfig.addTransform('xmlmin', function(content, outputPath) { if (outputPath && outputPath.endsWith('.xml')) { - let result = prettydata.pd.xmlmin(content); - return result; + return minifyXml(content, { + shortenNamespaces: false, + }); } return content; }); diff --git a/src/includes/header.njk b/src/includes/header.njk index 7c903dcd5..9fb11eb5a 100644 --- a/src/includes/header.njk +++ b/src/includes/header.njk @@ -44,7 +44,7 @@ {% include 'menu.njk' %} {% if isMainPage and lastPodcastEpisode %} - + - {{- lastPodcastEpisode.episode -}} + {{- lastPodcastEpisode.data.episode -}} - {{ lastPodcastEpisode.title }} + {{ lastPodcastEpisode.data.title }} {% endif %} diff --git a/src/libs/pagination.js b/src/libs/pagination.js index fecc707e3..68e18821d 100644 --- a/src/libs/pagination.js +++ b/src/libs/pagination.js @@ -34,7 +34,7 @@ export function createPaginationModel({ eleventyData, collection, pageRange = 5 lastPage: pagination.href.last, currentPageUrl: eleventyData.page.url, isFirstPage: pagination.hrefs[pagination.pageNumber] === pagination.href.first, - islastPage: pagination.hrefs[pagination.pageNumber] === pagination.href.last, + isLastPage: pagination.hrefs[pagination.pageNumber] === pagination.href.last, isNeedShowFirstPage: slice[0].originalIndex >= 1, isNeedShowFirstDivider: slice[0].originalIndex >= 2, isNeedShowLastPage: slice.at(-1).originalIndex < pagination.hrefs.length - 1, diff --git a/src/libs/podcasts-service.js b/src/libs/podcasts-service.js deleted file mode 100644 index 69fd43729..000000000 --- a/src/libs/podcasts-service.js +++ /dev/null @@ -1,144 +0,0 @@ -import https from 'https'; -import { once } from 'events'; - -import NodeXMLStream from 'node-xml-stream'; -import { parseHTML } from 'linkedom'; - -const RSS_URL = 'https://web-standards.ru/podcast/feed/'; - -async function _getEpisodesData() { - const [response] = await once(https.get(RSS_URL), 'response'); - - response.setEncoding('utf8'); - - return new Promise((resolve, reject) => { - const XMLParser = new NodeXMLStream(); - - // список полей для парсинга - const fields = new Set([ - 'item', - 'title', - 'pubDate', - 'description', - 'guid', - 'itunes:episode', - 'itunes:author', - ]); - - let currentItem = null; - let currentField = null; - const items = []; - - XMLParser.on('opentag', (name) => { - if (!fields.has(name)) { - return; - } - - if (name === 'item') { - currentItem = {}; - return; - } - - if (!currentItem) { - return; - } - - currentField = name; - }); - - XMLParser.on('closetag', (name) => { - if (name === 'item') { - const DOM = parseHTML(currentItem.description); - - const titles = Array.from(DOM.document.querySelectorAll('h2')); - - const titlesTextToElementMap = titles.reduce((map, titleElement) => { - map[titleElement.textContent] = titleElement; - return map; - }, {}); - - // удаляем раздел с ведущими из контента - const hostsTitle = titles.filter(title => title.textContent === 'Ведущие' || title.textContent === 'Hosts')[0]; - if (hostsTitle) { - const hostsList = hostsTitle.nextElementSibling; - hostsList && hostsList.remove(); - hostsTitle.remove(); - } - - // парсим раздел с темами с таймкодами и удаляем его из контента - let chapters; - const chaptersTitle = titles.filter(title => title.textContent === 'Темы' || title.textContent === 'Topics')[0]; - if (chaptersTitle) { - const chaptersList = chaptersTitle.nextElementSibling; - if (chaptersList && chaptersList.tagName === 'UL') { - chapters = Array.from(chaptersList.children) - .map(listItem => { - const [time, ...textItems] = listItem.textContent.split(' '); - return { - time, - title: textItems.join(' '), - }; - }); - chaptersList.remove(); - } - chaptersTitle.remove(); - } - - for (const chapter of (chapters || [])) { - const titleElement = titlesTextToElementMap[chapter.title]; - titleElement?.setAttribute('id', chapter.time); - } - - items.push({ - episode: currentItem['itunes:episode'], - title: currentItem.title.replace(currentItem['itunes:episode'] + '. ', ''), - date: new Date(currentItem.pubDate), - chapters, - content: DOM.document.toString(), - hosts: currentItem['itunes:author'].split(',').map(v => v.trim()), - audio: currentItem.guid, - }); - currentItem = null; - } - - if (name === currentField) { - currentField = null; - } - }); - - XMLParser.on('text', text => { - if (currentItem && currentField && currentField !== 'description') { - currentItem[currentField] = text; - } - }); - - XMLParser.on('cdata', cdata => { - if (currentItem && currentField) { - currentItem[currentField] = cdata; - } - }); - - XMLParser.on('error', err => { - reject(err); - }); - - XMLParser.on('finish', () => { - resolve(items); - }); - - response.pipe(XMLParser); - }); -} - -function withCache(operation) { - let cache = null; - - return function() { - if (!cache) { - cache = operation(); - } - return cache; - }; -} - -export const getEpisodesData = withCache(_getEpisodesData); diff --git a/src/pages/episode.11tydata.js b/src/pages/episode.11tydata.js new file mode 100644 index 000000000..15b37ec83 --- /dev/null +++ b/src/pages/episode.11tydata.js @@ -0,0 +1,27 @@ +export default { + layout: 'page.njk', + + pagination: { + data: 'collections.episodes', + size: 1, + alias: 'episode', + }, + + podcastDescription: 'Подкаст «Веб-стандарты»', + + eleventyComputed: { + permalink(data) { + const { episode } = data; + return `/podcast/${episode.data.episode}/`; + }, + + title(data) { + const { episode } = data; + return `Выпуск ${episode.data.episode}`; + }, + + preview(data) { + return ` ${data.title}`; + }, + }, +}; diff --git a/src/pages/episode.njk b/src/pages/episode.njk index 14b6c818d..5de79a7bf 100644 --- a/src/pages/episode.njk +++ b/src/pages/episode.njk @@ -1,32 +1,19 @@ ---- -layout: page.njk -pagination: - data: collections.episodes - size: 1 - alias: episode -permalink: 'podcast/{{ episode.episode }}/index.html' -podcastDescription: 'Подкаст «Веб-стандарты»' -eleventyComputed: - title: "Выпуск {{ episode.episode }}" - preview: ' {{ episode.title }}' ---- - -{% set hasChapters = episode.chapters and episode.chapters.length > 0 %} +{% set hasChapters = episode.data.chapters and episode.data.chapters.length > 0 %}
- Выпуск {{ episode.episode }} + Выпуск {{ episode.data.episode }}

- {{ episode.title }} + {{ episode.data.title }}

Ведущие:

    - {% for host in episode.hosts %} + {% for host in episode.data.hosts %}
  • {{ host }}
  • {% endfor %}
@@ -42,7 +29,7 @@ eleventyComputed: