From fc54d35e1ac9518f998cb1c929e86b58f67750f5 Mon Sep 17 00:00:00 2001 From: June Date: Sat, 5 Jul 2025 18:19:59 +0200 Subject: [PATCH] =?UTF-8?q?11ty=20+=20RIP=E2=80=AFDNS=20Witch=20EU.ORG=20s?= =?UTF-8?q?ervice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eleventy.js | 12 + LICENSE | 39 +- README.md | 6 +- config.toml | 46 - content/_index.fr.md | 39 - content/_index.md | 39 - node_modules/.bin/acorn | 1 + node_modules/.bin/acorn 2 | 1 + node_modules/.bin/eleventy | 1 + node_modules/.bin/eleventy 2 | 1 + node_modules/.bin/eleventy-dev-server | 1 + node_modules/.bin/eleventy-dev-server 2 | 1 + node_modules/.bin/errno | 1 + node_modules/.bin/errno 2 | 1 + node_modules/.bin/esparse | 1 + node_modules/.bin/esvalidate | 1 + node_modules/.bin/js-yaml | 1 + node_modules/.bin/liquid | 1 + node_modules/.bin/liquid 2 | 1 + node_modules/.bin/liquidjs | 1 + node_modules/.bin/liquidjs 2 | 1 + node_modules/.bin/markdown-it | 1 + node_modules/.bin/markdown-it 2 | 1 + node_modules/.bin/mime | 1 + node_modules/.bin/nunjucks-precompile | 1 + node_modules/.bin/semver | 1 + node_modules/.bin/semver 2 | 1 + node_modules/.package-lock.json | 1560 +++ .../.github/workflows/ci.yml | 22 + .../.github/workflows/release.yml | 24 + .../@11ty/dependency-tree-esm/LICENSE | 21 + .../@11ty/dependency-tree-esm/README.md | 40 + .../@11ty/dependency-tree-esm/main.js | 98 + .../@11ty/dependency-tree-esm/package.json | 38 + .../test/stubs/circular-child.js | 1 + .../test/stubs/circular-parent.js | 1 + .../test/stubs/circular-self.js | 2 + .../dependency-tree-esm/test/stubs/empty.js | 0 .../dependency-tree-esm/test/stubs/file.js | 2 + .../test/stubs/import-attributes.js | 3 + .../test/stubs/imported-secondary.js | 3 + .../test/stubs/imported.js | 3 + .../test/stubs/imported.json | 3 + .../test/stubs/nested-grandchild.js | 1 + .../dependency-tree-esm/test/stubs/nested.js | 2 + .../@11ty/dependency-tree-esm/test/test.js | 35 + node_modules/@11ty/dependency-tree/LICENSE | 21 + node_modules/@11ty/dependency-tree/LICENSE 2 | 21 + .../@11ty/dependency-tree/README 2.md | 92 + node_modules/@11ty/dependency-tree/README.md | 94 + node_modules/@11ty/dependency-tree/main 2.js | 120 + node_modules/@11ty/dependency-tree/main.js | 132 + .../@11ty/dependency-tree/package 2.json | 30 + .../@11ty/dependency-tree/package.json | 41 + .../@11ty/eleventy-dev-server/README 2.md | 56 + .../@11ty/eleventy-dev-server/README.md | 60 + .../@11ty/eleventy-dev-server/cli 2.js | 92 + node_modules/@11ty/eleventy-dev-server/cli.js | 89 + .../client/reload-client.js | 336 + .../@11ty/eleventy-dev-server/cmd 2.js | 69 + node_modules/@11ty/eleventy-dev-server/cmd.js | 77 + .../@11ty/eleventy-dev-server/package 2.json | 56 + .../@11ty/eleventy-dev-server/package.json | 57 + .../@11ty/eleventy-dev-server/server 2.js | 807 ++ .../@11ty/eleventy-dev-server/server.js | 1024 ++ .../eleventy-dev-server/server/ipAddress.js | 9 + .../server/wrapResponse.js | 130 + .../@11ty/eleventy-plugin-bundle/README.md | 337 + .../eleventy-plugin-bundle/eleventy.bundle.js | 72 + .../@11ty/eleventy-plugin-bundle/package.json | 62 + .../src/BundleFileOutput.js | 75 + .../eleventy-plugin-bundle/src/CodeManager.js | 231 + .../src/OutOfOrderRender.js | 158 + .../src/bundlePlucker.js | 69 + .../src/eleventy.bundleManagers.js | 85 + .../src/eleventy.pruneEmptyBundles.js | 105 + .../src/eleventy.shortcodes.js | 102 + node_modules/@11ty/eleventy-utils/LICENSE | 21 + node_modules/@11ty/eleventy-utils/LICENSE 2 | 21 + node_modules/@11ty/eleventy-utils/README 2.md | 29 + node_modules/@11ty/eleventy-utils/README.md | 27 + node_modules/@11ty/eleventy-utils/index 2.js | 11 + node_modules/@11ty/eleventy-utils/index.js | 20 + .../@11ty/eleventy-utils/package 2.json | 47 + .../@11ty/eleventy-utils/package.json | 42 + .../@11ty/eleventy-utils/src/Buffer.js | 10 + .../@11ty/eleventy-utils/src/CreateHash.js | 27 + .../@11ty/eleventy-utils/src/DateCompare.js | 41 + .../@11ty/eleventy-utils/src/HashTypes.js | 158 + .../@11ty/eleventy-utils/src/IsPlainObject.js | 24 + .../@11ty/eleventy-utils/src/Merge.js | 84 + .../@11ty/eleventy-utils/src/TemplatePath.js | 373 + node_modules/@11ty/eleventy-utils/src/Url.js | 13 + .../@11ty/eleventy-utils/src/lib-sha256.js | 113 + .../@11ty/eleventy/CODE_OF_CONDUCT 2.md | 48 + .../@11ty/eleventy/CODE_OF_CONDUCT.md | 48 + node_modules/@11ty/eleventy/LICENSE | 21 + node_modules/@11ty/eleventy/LICENSE 2 | 21 + node_modules/@11ty/eleventy/README 2.md | 49 + node_modules/@11ty/eleventy/README.md | 47 + node_modules/@11ty/eleventy/SECURITY 2.md | 5 + node_modules/@11ty/eleventy/SECURITY.md | 9 + node_modules/@11ty/eleventy/cmd.cjs | 155 + .../@11ty/eleventy/node_modules/.bin/js-yaml | 1 + .../node_modules/argparse/CHANGELOG.md | 216 + .../eleventy/node_modules/argparse/LICENSE | 254 + .../eleventy/node_modules/argparse/README.md | 84 + .../node_modules/argparse/argparse.js | 3707 +++++++ .../eleventy/node_modules/argparse/lib/sub.js | 67 + .../node_modules/argparse/lib/textwrap.js | 440 + .../node_modules/argparse/package.json | 31 + .../eleventy/node_modules/entities/LICENSE | 11 + .../node_modules/entities/decode.d.ts | 1 + .../eleventy/node_modules/entities/decode.js | 3 + .../dist/commonjs/decode-codepoint.d.ts | 19 + .../dist/commonjs/decode-codepoint.d.ts.map | 1 + .../dist/commonjs/decode-codepoint.js | 77 + .../dist/commonjs/decode-codepoint.js.map | 1 + .../entities/dist/commonjs/decode.d.ts | 209 + .../entities/dist/commonjs/decode.d.ts.map | 1 + .../entities/dist/commonjs/decode.js | 511 + .../entities/dist/commonjs/decode.js.map | 1 + .../entities/dist/commonjs/encode.d.ts | 22 + .../entities/dist/commonjs/encode.d.ts.map | 1 + .../entities/dist/commonjs/encode.js | 73 + .../entities/dist/commonjs/encode.js.map | 1 + .../entities/dist/commonjs/escape.d.ts | 43 + .../entities/dist/commonjs/escape.d.ts.map | 1 + .../entities/dist/commonjs/escape.js | 121 + .../entities/dist/commonjs/escape.js.map | 1 + .../commonjs/generated/decode-data-html.d.ts | 2 + .../generated/decode-data-html.d.ts.map | 1 + .../commonjs/generated/decode-data-html.js | 10 + .../generated/decode-data-html.js.map | 1 + .../commonjs/generated/decode-data-xml.d.ts | 2 + .../generated/decode-data-xml.d.ts.map | 1 + .../commonjs/generated/decode-data-xml.js | 10 + .../commonjs/generated/decode-data-xml.js.map | 1 + .../dist/commonjs/generated/encode-html.d.ts | 8 + .../commonjs/generated/encode-html.d.ts.map | 1 + .../dist/commonjs/generated/encode-html.js | 13 + .../commonjs/generated/encode-html.js.map | 1 + .../entities/dist/commonjs/index.d.ts | 96 + .../entities/dist/commonjs/index.d.ts.map | 1 + .../entities/dist/commonjs/index.js | 131 + .../entities/dist/commonjs/index.js.map | 1 + .../entities/dist/commonjs/package.json | 3 + .../entities/dist/esm/decode-codepoint.d.ts | 19 + .../dist/esm/decode-codepoint.d.ts.map | 1 + .../entities/dist/esm/decode-codepoint.js | 72 + .../entities/dist/esm/decode-codepoint.js.map | 1 + .../entities/dist/esm/decode.d.ts | 209 + .../entities/dist/esm/decode.d.ts.map | 1 + .../node_modules/entities/dist/esm/decode.js | 497 + .../entities/dist/esm/decode.js.map | 1 + .../entities/dist/esm/encode.d.ts | 22 + .../entities/dist/esm/encode.d.ts.map | 1 + .../node_modules/entities/dist/esm/encode.js | 69 + .../entities/dist/esm/encode.js.map | 1 + .../entities/dist/esm/escape.d.ts | 43 + .../entities/dist/esm/escape.d.ts.map | 1 + .../node_modules/entities/dist/esm/escape.js | 117 + .../entities/dist/esm/escape.js.map | 1 + .../dist/esm/generated/decode-data-html.d.ts | 2 + .../esm/generated/decode-data-html.d.ts.map | 1 + .../dist/esm/generated/decode-data-html.js | 7 + .../esm/generated/decode-data-html.js.map | 1 + .../dist/esm/generated/decode-data-xml.d.ts | 2 + .../esm/generated/decode-data-xml.d.ts.map | 1 + .../dist/esm/generated/decode-data-xml.js | 7 + .../dist/esm/generated/decode-data-xml.js.map | 1 + .../dist/esm/generated/encode-html.d.ts | 8 + .../dist/esm/generated/encode-html.d.ts.map | 1 + .../dist/esm/generated/encode-html.js | 10 + .../dist/esm/generated/encode-html.js.map | 1 + .../node_modules/entities/dist/esm/index.d.ts | 96 + .../entities/dist/esm/index.d.ts.map | 1 + .../node_modules/entities/dist/esm/index.js | 107 + .../entities/dist/esm/index.js.map | 1 + .../entities/dist/esm/package.json | 3 + .../node_modules/entities/escape.d.ts | 1 + .../eleventy/node_modules/entities/escape.js | 3 + .../node_modules/entities/package.json | 118 + .../eleventy/node_modules/entities/readme.md | 122 + .../entities/src/decode-codepoint.ts | 81 + .../node_modules/entities/src/decode.spec.ts | 320 + .../node_modules/entities/src/decode.ts | 620 ++ .../node_modules/entities/src/encode.spec.ts | 78 + .../node_modules/entities/src/encode.ts | 77 + .../node_modules/entities/src/escape.spec.ts | 14 + .../node_modules/entities/src/escape.ts | 148 + .../entities/src/generated/.eslintrc.json | 10 + .../src/generated/decode-data-html.ts | 8 + .../entities/src/generated/decode-data-xml.ts | 8 + .../entities/src/generated/encode-html.ts | 17 + .../node_modules/entities/src/index.spec.ts | 125 + .../node_modules/entities/src/index.ts | 188 + .../node_modules/js-yaml/CHANGELOG.md | 616 ++ .../eleventy/node_modules/js-yaml/LICENSE | 21 + .../eleventy/node_modules/js-yaml/README.md | 246 + .../node_modules/js-yaml/bin/js-yaml.js | 126 + .../node_modules/js-yaml/dist/js-yaml.js | 3874 +++++++ .../node_modules/js-yaml/dist/js-yaml.min.js | 2 + .../node_modules/js-yaml/dist/js-yaml.mjs | 3851 +++++++ .../eleventy/node_modules/js-yaml/index.js | 47 + .../node_modules/js-yaml/lib/common.js | 59 + .../node_modules/js-yaml/lib/dumper.js | 965 ++ .../node_modules/js-yaml/lib/exception.js | 55 + .../node_modules/js-yaml/lib/loader.js | 1727 +++ .../node_modules/js-yaml/lib/schema.js | 121 + .../node_modules/js-yaml/lib/schema/core.js | 11 + .../js-yaml/lib/schema/default.js | 22 + .../js-yaml/lib/schema/failsafe.js | 17 + .../node_modules/js-yaml/lib/schema/json.js | 19 + .../node_modules/js-yaml/lib/snippet.js | 101 + .../eleventy/node_modules/js-yaml/lib/type.js | 66 + .../node_modules/js-yaml/lib/type/binary.js | 125 + .../node_modules/js-yaml/lib/type/bool.js | 35 + .../node_modules/js-yaml/lib/type/float.js | 97 + .../node_modules/js-yaml/lib/type/int.js | 156 + .../node_modules/js-yaml/lib/type/map.js | 8 + .../node_modules/js-yaml/lib/type/merge.js | 12 + .../node_modules/js-yaml/lib/type/null.js | 35 + .../node_modules/js-yaml/lib/type/omap.js | 44 + .../node_modules/js-yaml/lib/type/pairs.js | 53 + .../node_modules/js-yaml/lib/type/seq.js | 8 + .../node_modules/js-yaml/lib/type/set.js | 29 + .../node_modules/js-yaml/lib/type/str.js | 8 + .../js-yaml/lib/type/timestamp.js | 88 + .../node_modules/js-yaml/package.json | 66 + .../eleventy/node_modules/picomatch/LICENSE | 21 + .../eleventy/node_modules/picomatch/README.md | 738 ++ .../eleventy/node_modules/picomatch/index.js | 17 + .../node_modules/picomatch/lib/constants.js | 179 + .../node_modules/picomatch/lib/parse.js | 1085 ++ .../node_modules/picomatch/lib/picomatch.js | 341 + .../node_modules/picomatch/lib/scan.js | 391 + .../node_modules/picomatch/lib/utils.js | 72 + .../node_modules/picomatch/package.json | 83 + .../eleventy/node_modules/picomatch/posix.js | 3 + node_modules/@11ty/eleventy/package 2.json | 137 + node_modules/@11ty/eleventy/package.json | 167 + .../@11ty/eleventy/src/Benchmark/Benchmark.js | 55 + .../eleventy/src/Benchmark/BenchmarkGroup.js | 135 + .../src/Benchmark/BenchmarkManager.js | 73 + .../@11ty/eleventy/src/Data/ComputedData.js | 122 + .../eleventy/src/Data/ComputedDataProxy.js | 131 + .../eleventy/src/Data/ComputedDataQueue.js | 64 + .../src/Data/ComputedDataTemplateString.js | 70 + .../@11ty/eleventy/src/Data/TemplateData.js | 710 ++ .../src/Data/TemplateDataInitialGlobalData.js | 40 + node_modules/@11ty/eleventy/src/Eleventy.js | 1565 +++ .../@11ty/eleventy/src/EleventyCommonJs.cjs | 43 + .../eleventy/src/EleventyExtensionMap.js | 284 + .../@11ty/eleventy/src/EleventyFiles.js | 521 + .../@11ty/eleventy/src/EleventyServe.js | 321 + .../@11ty/eleventy/src/EleventyWatch.js | 131 + .../eleventy/src/EleventyWatchTargets.js | 164 + .../@11ty/eleventy/src/Engines/Custom.js | 339 + .../src/Engines/FrontMatter/JavaScript.js | 34 + .../@11ty/eleventy/src/Engines/Html.js | 33 + .../@11ty/eleventy/src/Engines/JavaScript.js | 240 + .../@11ty/eleventy/src/Engines/Liquid.js | 331 + .../@11ty/eleventy/src/Engines/Markdown.js | 100 + .../@11ty/eleventy/src/Engines/Nunjucks.js | 482 + .../eleventy/src/Engines/TemplateEngine.js | 206 + .../src/Engines/TemplateEngineManager.js | 193 + .../src/Engines/Util/ContextAugmenter.js | 67 + .../Errors/DuplicatePermalinkOutputError.js | 9 + .../eleventy/src/Errors/EleventyBaseError.js | 24 + .../src/Errors/EleventyErrorHandler.js | 152 + .../eleventy/src/Errors/EleventyErrorUtil.js | 70 + .../TemplateContentPrematureUseError.js | 5 + .../TemplateContentUnrenderedTemplateError.js | 5 + ...ngCircularTemplateContentReferenceError.js | 5 + node_modules/@11ty/eleventy/src/EventBus.js | 23 + .../@11ty/eleventy/src/FileSystemSearch.js | 129 + .../eleventy/src/Filters/GetCollectionItem.js | 20 + .../src/Filters/GetCollectionItemIndex.js | 17 + .../src/Filters/GetLocaleCollectionItem.js | 47 + .../@11ty/eleventy/src/Filters/Slug.js | 14 + .../@11ty/eleventy/src/Filters/Slugify.js | 14 + .../@11ty/eleventy/src/Filters/Url.js | 35 + .../@11ty/eleventy/src/GlobalDependencyMap.js | 463 + .../@11ty/eleventy/src/LayoutCache.js | 98 + .../eleventy/src/Plugins/HtmlBasePlugin.js | 160 + .../src/Plugins/HtmlRelativeCopyPlugin.js | 52 + .../@11ty/eleventy/src/Plugins/I18nPlugin.js | 317 + .../eleventy/src/Plugins/IdAttributePlugin.js | 110 + .../eleventy/src/Plugins/InputPathToUrl.js | 191 + .../@11ty/eleventy/src/Plugins/Pagination.js | 379 + .../eleventy/src/Plugins/RenderPlugin.js | 520 + node_modules/@11ty/eleventy/src/Template.js | 1200 +++ .../@11ty/eleventy/src/TemplateBehavior.js | 85 + .../@11ty/eleventy/src/TemplateCollection.js | 77 + .../@11ty/eleventy/src/TemplateConfig.js | 565 + .../@11ty/eleventy/src/TemplateContent.js | 748 ++ .../@11ty/eleventy/src/TemplateFileSlug.js | 57 + .../@11ty/eleventy/src/TemplateGlob.js | 35 + .../@11ty/eleventy/src/TemplateLayout.js | 240 + .../src/TemplateLayoutPathResolver.js | 136 + .../@11ty/eleventy/src/TemplateMap.js | 684 ++ .../@11ty/eleventy/src/TemplatePassthrough.js | 389 + .../src/TemplatePassthroughManager.js | 368 + .../@11ty/eleventy/src/TemplatePermalink.js | 195 + .../@11ty/eleventy/src/TemplateRender.js | 292 + .../@11ty/eleventy/src/TemplateWriter.js | 508 + node_modules/@11ty/eleventy/src/UserConfig.js | 1339 +++ .../@11ty/eleventy/src/Util/ArrayUtil.js | 24 + .../eleventy/src/Util/AsyncEventEmitter.js | 88 + .../@11ty/eleventy/src/Util/Compatibility.js | 59 + .../@11ty/eleventy/src/Util/ConsoleLogger.js | 140 + .../eleventy/src/Util/DateGitFirstAdded.js | 23 + .../eleventy/src/Util/DateGitLastUpdated.js | 23 + .../@11ty/eleventy/src/Util/DirContains.js | 10 + .../@11ty/eleventy/src/Util/EsmResolver.js | 53 + .../@11ty/eleventy/src/Util/EventBusUtil.js | 14 + .../@11ty/eleventy/src/Util/ExistsCache.js | 62 + .../@11ty/eleventy/src/Util/FilePathUtil.js | 19 + .../eleventy/src/Util/FileSystemManager.js | 48 + .../eleventy/src/Util/GetJavaScriptData.js | 30 + .../@11ty/eleventy/src/Util/GlobMatcher.js | 22 + .../@11ty/eleventy/src/Util/GlobRemap.js | 85 + .../eleventy/src/Util/HtmlRelativeCopy.js | 149 + .../eleventy/src/Util/HtmlTransformer.js | 172 + .../@11ty/eleventy/src/Util/ImportJsonSync.js | 77 + .../eleventy/src/Util/IsAsyncFunction.js | 5 + .../src/Util/JavaScriptDependencies.js | 55 + .../eleventy/src/Util/MemoizeFunction.js | 26 + .../eleventy/src/Util/Objects/DeepFreeze.js | 20 + .../eleventy/src/Util/Objects/ObjectFilter.js | 9 + .../eleventy/src/Util/Objects/ProxyWrap.js | 118 + .../src/Util/Objects/SampleModule.mjs | 1 + .../eleventy/src/Util/Objects/Sortable.js | 136 + .../@11ty/eleventy/src/Util/Objects/Unique.js | 3 + .../src/Util/PassthroughCopyBehaviorCheck.js | 16 + .../@11ty/eleventy/src/Util/PathNormalizer.js | 58 + .../@11ty/eleventy/src/Util/PathPrefixer.js | 21 + .../@11ty/eleventy/src/Util/Pluralize.js | 3 + .../eleventy/src/Util/ProjectDirectories.js | 369 + .../src/Util/ProjectTemplateFormats.js | 134 + .../@11ty/eleventy/src/Util/PromiseUtil.js | 15 + .../@11ty/eleventy/src/Util/Require.js | 258 + .../@11ty/eleventy/src/Util/ReservedData.js | 69 + .../@11ty/eleventy/src/Util/SetUnion.js | 11 + .../@11ty/eleventy/src/Util/SpawnAsync.js | 29 + .../eleventy/src/Util/TemplateDepGraph.js | 160 + .../@11ty/eleventy/src/Util/TransformsUtil.js | 70 + .../@11ty/eleventy/src/Util/ValidUrl.js | 9 + .../@11ty/eleventy/src/defaultConfig.js | 178 + node_modules/@11ty/eleventy/tsconfig.json | 117 + node_modules/@11ty/lodash-custom/README.md | 14 + .../@11ty/lodash-custom/lodash.custom.js | 1704 +++ node_modules/@11ty/lodash-custom/package.json | 38 + node_modules/@11ty/posthtml-urls/LICENSE | 21 + node_modules/@11ty/posthtml-urls/README.md | 48 + .../@11ty/posthtml-urls/lib/defaultOptions.js | 37 + node_modules/@11ty/posthtml-urls/lib/index.js | 142 + node_modules/@11ty/posthtml-urls/package.json | 47 + node_modules/@11ty/recursive-copy/README.md | 201 + node_modules/@11ty/recursive-copy/index.d.ts | 117 + node_modules/@11ty/recursive-copy/index.js | 3 + node_modules/@11ty/recursive-copy/lib/copy.js | 436 + .../@11ty/recursive-copy/package.json | 72 + node_modules/@sindresorhus/slugify/index 2.js | 101 + .../@sindresorhus/slugify/index.d 2.ts | 215 + node_modules/@sindresorhus/slugify/index.d.ts | 246 + node_modules/@sindresorhus/slugify/index.js | 127 + node_modules/@sindresorhus/slugify/license | 9 + node_modules/@sindresorhus/slugify/license 2 | 9 + .../slugify/overridable-replacements 2.js | 7 + .../slugify/overridable-replacements.js | 7 + .../@sindresorhus/slugify/package 2.json | 52 + .../@sindresorhus/slugify/package.json | 59 + .../@sindresorhus/slugify/readme 2.md | 236 + node_modules/@sindresorhus/slugify/readme.md | 273 + .../@sindresorhus/transliterate/index 2.js | 35 + .../@sindresorhus/transliterate/index.d 2.ts | 55 + .../@sindresorhus/transliterate/index.d.ts | 48 + .../@sindresorhus/transliterate/index.js | 33 + .../@sindresorhus/transliterate/license | 9 + .../@sindresorhus/transliterate/license 2 | 9 + .../transliterate/package 2.json | 46 + .../@sindresorhus/transliterate/package.json | 47 + .../@sindresorhus/transliterate/readme 2.md | 103 + .../@sindresorhus/transliterate/readme.md | 103 + .../transliterate/replacements 2.js | 797 ++ .../transliterate/replacements.js | 2056 ++++ node_modules/a-sync-waterfall/LICENSE | 21 + node_modules/a-sync-waterfall/README.md | 95 + node_modules/a-sync-waterfall/index.js | 83 + node_modules/a-sync-waterfall/package.json | 21 + node_modules/a-sync-waterfall/test.js | 77 + node_modules/acorn-walk/CHANGELOG.md | 199 + node_modules/acorn-walk/LICENSE | 21 + node_modules/acorn-walk/README.md | 124 + node_modules/acorn-walk/dist/walk.d.mts | 177 + node_modules/acorn-walk/dist/walk.d.ts | 177 + node_modules/acorn-walk/dist/walk.js | 455 + node_modules/acorn-walk/dist/walk.mjs | 437 + node_modules/acorn-walk/package.json | 50 + node_modules/acorn/CHANGELOG 2.md | 620 ++ node_modules/acorn/CHANGELOG.md | 954 ++ node_modules/acorn/LICENSE | 21 + node_modules/acorn/LICENSE 2 | 21 + node_modules/acorn/README 2.md | 269 + node_modules/acorn/README.md | 282 + node_modules/acorn/bin/acorn | 4 + node_modules/acorn/dist/acorn.d.mts | 883 ++ node_modules/acorn/dist/acorn.d.ts | 883 ++ node_modules/acorn/dist/acorn.js | 6262 +++++++++++ node_modules/acorn/dist/acorn.mjs | 6233 +++++++++++ node_modules/acorn/dist/bin.js | 90 + node_modules/acorn/package 2.json | 35 + node_modules/acorn/package.json | 50 + node_modules/anymatch/LICENSE | 15 + node_modules/anymatch/README.md | 87 + node_modules/anymatch/index.d.ts | 20 + node_modules/anymatch/index.js | 104 + node_modules/anymatch/package.json | 48 + node_modules/argparse/CHANGELOG.md | 185 + node_modules/argparse/LICENSE | 21 + node_modules/argparse/README.md | 257 + node_modules/argparse/index.js | 3 + node_modules/argparse/lib/action.js | 146 + node_modules/argparse/lib/action/append.js | 53 + .../argparse/lib/action/append/constant.js | 47 + node_modules/argparse/lib/action/count.js | 40 + node_modules/argparse/lib/action/help.js | 47 + node_modules/argparse/lib/action/store.js | 50 + .../argparse/lib/action/store/constant.js | 43 + .../argparse/lib/action/store/false.js | 27 + .../argparse/lib/action/store/true.js | 26 + .../argparse/lib/action/subparsers.js | 149 + node_modules/argparse/lib/action/version.js | 47 + node_modules/argparse/lib/action_container.js | 482 + node_modules/argparse/lib/argparse.js | 14 + node_modules/argparse/lib/argument/error.js | 50 + .../argparse/lib/argument/exclusive.js | 54 + node_modules/argparse/lib/argument/group.js | 75 + node_modules/argparse/lib/argument_parser.js | 1161 ++ node_modules/argparse/lib/const.js | 21 + .../argparse/lib/help/added_formatters.js | 87 + node_modules/argparse/lib/help/formatter.js | 795 ++ node_modules/argparse/lib/namespace.js | 76 + node_modules/argparse/lib/utils.js | 57 + node_modules/argparse/package.json | 34 + node_modules/array-differ/index 2.js | 8 + node_modules/array-differ/index.js | 7 + node_modules/array-differ/package 2.json | 35 + node_modules/array-differ/package.json | 32 + node_modules/array-differ/readme 2.md | 41 + node_modules/array-differ/readme.md | 41 + node_modules/array-union/index.js | 6 + node_modules/array-union/license | 21 + node_modules/array-union/package.json | 40 + node_modules/array-union/readme.md | 28 + node_modules/array-uniq/index.js | 62 + node_modules/array-uniq/license | 21 + node_modules/array-uniq/package.json | 37 + node_modules/array-uniq/readme.md | 30 + node_modules/arrify/index 2.js | 23 + node_modules/arrify/index.js | 8 + node_modules/arrify/license | 21 + node_modules/arrify/license 2 | 9 + node_modules/arrify/package 2.json | 35 + node_modules/arrify/package.json | 33 + node_modules/arrify/readme 2.md | 39 + node_modules/arrify/readme.md | 36 + node_modules/asap/CHANGES.md | 70 + node_modules/asap/LICENSE.md | 21 + node_modules/asap/README.md | 237 + node_modules/asap/asap.js | 65 + node_modules/asap/browser-asap.js | 66 + node_modules/asap/browser-raw.js | 223 + node_modules/asap/package.json | 58 + node_modules/asap/raw.js | 101 + .../balanced-match/.github/FUNDING.yml | 2 + node_modules/balanced-match/LICENSE.md | 21 + node_modules/balanced-match/README.md | 97 + node_modules/balanced-match/index.js | 62 + node_modules/balanced-match/package.json | 48 + node_modules/bcp-47-match/index.d.ts | 47 + node_modules/bcp-47-match/index.js | 234 + node_modules/bcp-47-match/license | 22 + node_modules/bcp-47-match/package.json | 88 + node_modules/bcp-47-match/readme.md | 315 + node_modules/bcp-47-normalize/index.d.ts | 3 + node_modules/bcp-47-normalize/index.js | 6 + node_modules/bcp-47-normalize/lib/fields.d.ts | 24 + node_modules/bcp-47-normalize/lib/fields.js | 3217 ++++++ node_modules/bcp-47-normalize/lib/index.d.ts | 36 + node_modules/bcp-47-normalize/lib/index.js | 335 + node_modules/bcp-47-normalize/lib/likely.d.ts | 4 + node_modules/bcp-47-normalize/lib/likely.js | 8039 ++++++++++++++ node_modules/bcp-47-normalize/lib/many.d.ts | 10 + node_modules/bcp-47-normalize/lib/many.js | 95 + .../bcp-47-normalize/lib/matches.d.ts | 13 + node_modules/bcp-47-normalize/lib/matches.js | 1859 ++++ node_modules/bcp-47-normalize/license | 22 + node_modules/bcp-47-normalize/package 2.json | 85 + node_modules/bcp-47-normalize/package.json | 91 + node_modules/bcp-47-normalize/readme 2.md | 134 + node_modules/bcp-47-normalize/readme.md | 207 + node_modules/bcp-47/index.d.ts | 6 + node_modules/bcp-47/index.js | 9 + node_modules/bcp-47/lib/normal.d.ts | 2 + node_modules/bcp-47/lib/normal.js | 29 + node_modules/bcp-47/lib/parse.d.ts | 29 + node_modules/bcp-47/lib/parse.js | 310 + node_modules/bcp-47/lib/regular.d.ts | 2 + node_modules/bcp-47/lib/regular.js | 12 + node_modules/bcp-47/lib/stringify.d.ts | 13 + node_modules/bcp-47/lib/stringify.js | 50 + node_modules/bcp-47/license | 22 + node_modules/bcp-47/package.json | 85 + node_modules/bcp-47/readme.md | 344 + .../binary-extensions/binary-extensions.json | 263 + .../binary-extensions.json.d.ts | 3 + node_modules/binary-extensions/index.d.ts | 14 + node_modules/binary-extensions/index.js | 1 + node_modules/binary-extensions/license | 10 + node_modules/binary-extensions/package.json | 40 + node_modules/binary-extensions/readme.md | 25 + node_modules/brace-expansion/LICENSE | 21 + node_modules/brace-expansion/LICENSE 2 | 21 + node_modules/brace-expansion/README 2.md | 129 + node_modules/brace-expansion/README.md | 129 + node_modules/brace-expansion/index 2.js | 201 + node_modules/brace-expansion/index.js | 201 + node_modules/brace-expansion/package 2.json | 47 + node_modules/brace-expansion/package.json | 50 + node_modules/braces/LICENSE | 21 + node_modules/braces/README.md | 586 ++ node_modules/braces/index.js | 170 + node_modules/braces/lib/compile.js | 60 + node_modules/braces/lib/constants.js | 57 + node_modules/braces/lib/expand.js | 113 + node_modules/braces/lib/parse.js | 331 + node_modules/braces/lib/stringify.js | 32 + node_modules/braces/lib/utils.js | 122 + node_modules/braces/package.json | 77 + node_modules/chokidar/LICENSE | 21 + node_modules/chokidar/README.md | 308 + node_modules/chokidar/index.js | 973 ++ node_modules/chokidar/lib/constants.js | 66 + node_modules/chokidar/lib/fsevents-handler.js | 526 + node_modules/chokidar/lib/nodefs-handler.js | 654 ++ node_modules/chokidar/package.json | 70 + node_modules/chokidar/types/index.d.ts | 192 + node_modules/commander/LICENSE | 22 + node_modules/commander/Readme.md | 1134 ++ node_modules/commander/esm.mjs | 16 + node_modules/commander/index.js | 27 + node_modules/commander/lib/argument.js | 147 + node_modules/commander/lib/command.js | 2179 ++++ node_modules/commander/lib/error.js | 45 + node_modules/commander/lib/help.js | 464 + node_modules/commander/lib/option.js | 331 + node_modules/commander/lib/suggestSimilar.js | 100 + node_modules/commander/package-support.json | 16 + node_modules/commander/package.json | 80 + node_modules/commander/typings/index.d.ts | 889 ++ node_modules/concat-map/.travis.yml | 4 + node_modules/concat-map/LICENSE | 18 + node_modules/concat-map/README.markdown | 62 + node_modules/concat-map/example/map.js | 6 + node_modules/concat-map/index.js | 13 + node_modules/concat-map/package.json | 43 + node_modules/concat-map/test/map.js | 39 + node_modules/debug/LICENSE | 20 + node_modules/debug/README.md | 481 + node_modules/debug/package.json | 64 + node_modules/debug/src/browser.js | 272 + node_modules/debug/src/common.js | 292 + node_modules/debug/src/index.js | 10 + node_modules/debug/src/node.js | 263 + node_modules/depd/History.md | 103 + node_modules/depd/LICENSE | 22 + node_modules/depd/Readme.md | 280 + node_modules/depd/index.js | 538 + node_modules/depd/lib/browser/index.js | 77 + node_modules/depd/package.json | 45 + .../.github/workflows/node.js.yml | 24 + node_modules/dependency-graph/CHANGELOG 2.md | 82 + node_modules/dependency-graph/CHANGELOG.md | 88 + node_modules/dependency-graph/LICENSE | 19 + node_modules/dependency-graph/LICENSE 2 | 19 + node_modules/dependency-graph/README 2.md | 78 + node_modules/dependency-graph/README.md | 78 + .../dependency-graph/lib/dep_graph.js | 364 + node_modules/dependency-graph/lib/index.d.ts | 127 + node_modules/dependency-graph/package 2.json | 31 + node_modules/dependency-graph/package.json | 31 + .../dependency-graph/specs/dep_graph_spec.js | 567 + node_modules/dom-serializer/LICENSE | 11 + node_modules/dom-serializer/README.md | 97 + .../dom-serializer/lib/esm/foreignNames.d.ts | 3 + .../lib/esm/foreignNames.d.ts.map | 1 + .../dom-serializer/lib/esm/foreignNames.js | 100 + .../dom-serializer/lib/esm/index.d.ts | 52 + .../dom-serializer/lib/esm/index.d.ts.map | 1 + node_modules/dom-serializer/lib/esm/index.js | 190 + .../dom-serializer/lib/esm/package.json | 1 + .../dom-serializer/lib/foreignNames.d.ts | 3 + .../dom-serializer/lib/foreignNames.d.ts.map | 1 + .../dom-serializer/lib/foreignNames.js | 103 + node_modules/dom-serializer/lib/index.d.ts | 43 + .../dom-serializer/lib/index.d.ts.map | 1 + node_modules/dom-serializer/lib/index.js | 211 + .../node_modules/entities/LICENSE | 11 + .../node_modules/entities/lib/decode.d.ts | 5 + .../node_modules/entities/lib/decode.d.ts.map | 1 + .../node_modules/entities/lib/decode.js | 53 + .../entities/lib/decode_codepoint.d.ts | 2 + .../entities/lib/decode_codepoint.d.ts.map | 1 + .../entities/lib/decode_codepoint.js | 30 + .../node_modules/entities/lib/encode.d.ts | 47 + .../node_modules/entities/lib/encode.d.ts.map | 1 + .../node_modules/entities/lib/encode.js | 136 + .../node_modules/entities/lib/index.d.ts | 27 + .../node_modules/entities/lib/index.d.ts.map | 1 + .../node_modules/entities/lib/index.js | 57 + .../entities/lib/maps/decode.json | 1 + .../entities/lib/maps/entities.json | 1 + .../entities/lib/maps/legacy.json | 1 + .../node_modules/entities/lib/maps/xml.json | 1 + .../node_modules/entities/package.json | 64 + .../node_modules/entities/readme.md | 57 + node_modules/dom-serializer/package.json | 55 + node_modules/domelementtype/LICENSE | 11 + .../domelementtype/lib/esm/index.d.ts | 48 + .../domelementtype/lib/esm/index.d.ts.map | 1 + node_modules/domelementtype/lib/esm/index.js | 51 + .../domelementtype/lib/esm/package.json | 1 + node_modules/domelementtype/lib/index.d.ts | 48 + .../domelementtype/lib/index.d.ts.map | 1 + node_modules/domelementtype/lib/index.js | 55 + node_modules/domelementtype/package.json | 54 + node_modules/domelementtype/readme.md | 1 + node_modules/domhandler/LICENSE | 11 + node_modules/domhandler/lib/index.d.ts | 85 + node_modules/domhandler/lib/index.d.ts.map | 1 + node_modules/domhandler/lib/index.js | 176 + node_modules/domhandler/lib/node.d.ts | 237 + node_modules/domhandler/lib/node.d.ts.map | 1 + node_modules/domhandler/lib/node.js | 444 + node_modules/domhandler/package.json | 58 + node_modules/domhandler/readme.md | 163 + node_modules/domutils/LICENSE | 11 + node_modules/domutils/lib/feeds.d.ts | 45 + node_modules/domutils/lib/feeds.d.ts.map | 1 + node_modules/domutils/lib/feeds.js | 190 + node_modules/domutils/lib/helpers.d.ts | 51 + node_modules/domutils/lib/helpers.d.ts.map | 1 + node_modules/domutils/lib/helpers.js | 125 + node_modules/domutils/lib/index.d.ts | 10 + node_modules/domutils/lib/index.d.ts.map | 1 + node_modules/domutils/lib/index.js | 28 + node_modules/domutils/lib/legacy.d.ts | 47 + node_modules/domutils/lib/legacy.d.ts.map | 1 + node_modules/domutils/lib/legacy.js | 124 + node_modules/domutils/lib/manipulation.d.ts | 43 + .../domutils/lib/manipulation.d.ts.map | 1 + node_modules/domutils/lib/manipulation.js | 129 + node_modules/domutils/lib/querying.d.ts | 55 + node_modules/domutils/lib/querying.d.ts.map | 1 + node_modules/domutils/lib/querying.js | 126 + node_modules/domutils/lib/stringify.d.ts | 41 + node_modules/domutils/lib/stringify.d.ts.map | 1 + node_modules/domutils/lib/stringify.js | 86 + node_modules/domutils/lib/traversal.d.ts | 59 + node_modules/domutils/lib/traversal.d.ts.map | 1 + node_modules/domutils/lib/traversal.js | 117 + node_modules/domutils/package.json | 65 + node_modules/domutils/readme.md | 31 + node_modules/ee-first/LICENSE | 22 + node_modules/ee-first/README.md | 80 + node_modules/ee-first/index.js | 95 + node_modules/ee-first/package.json | 29 + node_modules/encodeurl/LICENSE | 22 + node_modules/encodeurl/LICENSE 2 | 22 + node_modules/encodeurl/README 2.md | 128 + node_modules/encodeurl/README.md | 109 + node_modules/encodeurl/index 2.js | 60 + node_modules/encodeurl/index.js | 60 + node_modules/encodeurl/package 2.json | 40 + node_modules/encodeurl/package.json | 40 + node_modules/entities/LICENSE | 11 + node_modules/entities/lib/decode.d.ts | 15 + node_modules/entities/lib/decode.d.ts.map | 1 + node_modules/entities/lib/decode.js | 145 + .../entities/lib/decode_codepoint.d.ts | 2 + .../entities/lib/decode_codepoint.d.ts.map | 1 + node_modules/entities/lib/decode_codepoint.js | 54 + node_modules/entities/lib/encode-trie.d.ts | 8 + .../entities/lib/encode-trie.d.ts.map | 1 + node_modules/entities/lib/encode-trie.js | 77 + node_modules/entities/lib/encode.d.ts | 46 + node_modules/entities/lib/encode.d.ts.map | 1 + node_modules/entities/lib/encode.js | 126 + .../lib/generated/decode-data-html.d.ts | 3 + .../lib/generated/decode-data-html.d.ts.map | 1 + .../lib/generated/decode-data-html.js | 5 + .../lib/generated/decode-data-xml.d.ts | 3 + .../lib/generated/decode-data-xml.d.ts.map | 1 + .../entities/lib/generated/decode-data-xml.js | 5 + node_modules/entities/lib/index.d.ts | 91 + node_modules/entities/lib/index.d.ts.map | 1 + node_modules/entities/lib/index.js | 118 + node_modules/entities/lib/maps/entities.json | 1 + node_modules/entities/lib/maps/legacy.json | 1 + node_modules/entities/lib/maps/xml.json | 1 + node_modules/entities/package.json | 67 + node_modules/entities/readme.md | 74 + node_modules/errno/.jshintrc | 59 + node_modules/errno/.jshintrc 2 | 59 + node_modules/errno/.travis 2.yml | 19 + node_modules/errno/.travis.yml | 12 + node_modules/errno/README 2.md | 145 + node_modules/errno/README.md | 145 + node_modules/errno/build 2.js | 43 + node_modules/errno/build.js | 43 + node_modules/errno/cli 2.js | 22 + node_modules/errno/cli.js | 22 + node_modules/errno/custom 2.js | 57 + node_modules/errno/custom.js | 57 + node_modules/errno/errno 2.js | 313 + node_modules/errno/errno.js | 313 + node_modules/errno/package 2.json | 33 + node_modules/errno/package.json | 33 + node_modules/errno/test 2.js | 88 + node_modules/errno/test.js | 88 + node_modules/escape-html/LICENSE | 24 + node_modules/escape-html/Readme.md | 43 + node_modules/escape-html/index.js | 78 + node_modules/escape-html/package.json | 24 + node_modules/escape-string-regexp/index.d.ts | 16 + node_modules/escape-string-regexp/index.js | 11 + node_modules/escape-string-regexp/license | 9 + .../escape-string-regexp/package.json | 40 + node_modules/escape-string-regexp/readme.md | 34 + node_modules/esm-import-transformer/README.md | 91 + .../import-transformer.js | 133 + .../esm-import-transformer/package.json | 26 + node_modules/esprima/ChangeLog | 235 + node_modules/esprima/LICENSE.BSD | 21 + node_modules/esprima/README.md | 46 + node_modules/esprima/bin/esparse.js | 139 + node_modules/esprima/bin/esvalidate.js | 236 + node_modules/esprima/dist/esprima.js | 6709 ++++++++++++ node_modules/esprima/package.json | 112 + node_modules/etag/HISTORY.md | 83 + node_modules/etag/LICENSE | 22 + node_modules/etag/README.md | 159 + node_modules/etag/index.js | 131 + node_modules/etag/package.json | 47 + node_modules/evaluate-value/LICENSE | 21 + node_modules/evaluate-value/README.md | 41 + node_modules/evaluate-value/index-es5.js | 17 + node_modules/evaluate-value/index-es5.js.map | 1 + node_modules/evaluate-value/index.js | 17 + node_modules/evaluate-value/package.json | 33 + node_modules/extend-shallow/LICENSE | 21 + node_modules/extend-shallow/README.md | 61 + node_modules/extend-shallow/index.js | 33 + node_modules/extend-shallow/package.json | 56 + node_modules/filesize/LICENSE | 28 + node_modules/filesize/README.md | 113 + node_modules/filesize/dist/filesize.cjs | 238 + node_modules/filesize/dist/filesize.esm.js | 231 + node_modules/filesize/package.json | 60 + node_modules/filesize/types/filesize.d.ts | 56 + node_modules/fill-range/LICENSE | 21 + node_modules/fill-range/README.md | 237 + node_modules/fill-range/index.js | 248 + node_modules/fill-range/package.json | 74 + node_modules/finalhandler/HISTORY.md | 210 + node_modules/finalhandler/LICENSE | 22 + node_modules/finalhandler/README.md | 147 + node_modules/finalhandler/SECURITY.md | 25 + node_modules/finalhandler/index.js | 341 + .../node_modules/debug/.coveralls.yml | 1 + .../finalhandler/node_modules/debug/.eslintrc | 11 + .../node_modules/debug/.npmignore | 9 + .../node_modules/debug/.travis.yml | 14 + .../node_modules/debug/CHANGELOG.md | 362 + .../finalhandler/node_modules/debug/LICENSE | 19 + .../finalhandler/node_modules/debug/Makefile | 50 + .../finalhandler/node_modules/debug/README.md | 312 + .../node_modules/debug/component.json | 19 + .../node_modules/debug/karma.conf.js | 70 + .../finalhandler/node_modules/debug/node.js | 1 + .../node_modules/debug/package.json | 49 + .../node_modules/debug/src/browser.js | 185 + .../node_modules/debug/src/debug.js | 202 + .../node_modules/debug/src/index.js | 10 + .../node_modules/debug/src/inspector-log.js | 15 + .../node_modules/debug/src/node.js | 248 + .../finalhandler/node_modules/ms/index.js | 152 + .../finalhandler/node_modules/ms/license.md | 21 + .../finalhandler/node_modules/ms/package.json | 37 + .../finalhandler/node_modules/ms/readme.md | 51 + node_modules/finalhandler/package.json | 47 + node_modules/fresh/HISTORY.md | 80 + node_modules/fresh/LICENSE | 23 + node_modules/fresh/README.md | 117 + node_modules/fresh/index.js | 136 + node_modules/fresh/package.json | 46 + node_modules/fsevents/LICENSE | 22 + node_modules/fsevents/README.md | 89 + node_modules/fsevents/fsevents.d.ts | 46 + node_modules/fsevents/fsevents.js | 83 + node_modules/fsevents/fsevents.node | Bin 0 -> 163626 bytes node_modules/fsevents/package.json | 62 + node_modules/glob-parent/CHANGELOG.md | 110 + node_modules/glob-parent/LICENSE | 15 + node_modules/glob-parent/README.md | 137 + node_modules/glob-parent/index.js | 42 + node_modules/glob-parent/package.json | 48 + node_modules/gray-matter/CHANGELOG.md | 24 + node_modules/gray-matter/LICENSE | 21 + node_modules/gray-matter/README.md | 565 + node_modules/gray-matter/gray-matter.d.ts | 114 + node_modules/gray-matter/index.js | 228 + node_modules/gray-matter/lib/defaults.js | 18 + node_modules/gray-matter/lib/engine.js | 30 + node_modules/gray-matter/lib/engines.js | 54 + node_modules/gray-matter/lib/excerpt.js | 32 + node_modules/gray-matter/lib/parse.js | 13 + node_modules/gray-matter/lib/stringify.js | 56 + node_modules/gray-matter/lib/to-file.js | 43 + node_modules/gray-matter/lib/utils.js | 66 + node_modules/gray-matter/package.json | 127 + node_modules/htmlparser2/LICENSE | 18 + node_modules/htmlparser2/README.md | 166 + node_modules/htmlparser2/lib/FeedHandler.d.ts | 23 + .../htmlparser2/lib/FeedHandler.d.ts.map | 1 + node_modules/htmlparser2/lib/FeedHandler.js | 68 + node_modules/htmlparser2/lib/Parser.d.ts | 180 + node_modules/htmlparser2/lib/Parser.d.ts.map | 1 + node_modules/htmlparser2/lib/Parser.js | 424 + node_modules/htmlparser2/lib/Tokenizer.d.ts | 173 + .../htmlparser2/lib/Tokenizer.d.ts.map | 1 + node_modules/htmlparser2/lib/Tokenizer.js | 821 ++ .../htmlparser2/lib/WritableStream.d.ts | 16 + .../htmlparser2/lib/WritableStream.d.ts.map | 1 + .../htmlparser2/lib/WritableStream.js | 53 + node_modules/htmlparser2/lib/index.d.ts | 39 + node_modules/htmlparser2/lib/index.d.ts.map | 1 + node_modules/htmlparser2/lib/index.js | 84 + node_modules/htmlparser2/package.json | 75 + node_modules/http-equiv-refresh/README 2.md | 29 + node_modules/http-equiv-refresh/README.md | 31 + node_modules/http-equiv-refresh/index 2.js | 50 + node_modules/http-equiv-refresh/index-es5.js | 30 + .../http-equiv-refresh/index-es5.js.map | 1 + node_modules/http-equiv-refresh/index.js | 24 + node_modules/http-equiv-refresh/license | 21 + node_modules/http-equiv-refresh/license 2 | 21 + .../http-equiv-refresh/package 2.json | 41 + node_modules/http-equiv-refresh/package.json | 42 + node_modules/http-errors/HISTORY.md | 180 + node_modules/http-errors/LICENSE | 23 + node_modules/http-errors/README.md | 169 + node_modules/http-errors/index.js | 289 + node_modules/http-errors/package.json | 50 + node_modules/inherits/LICENSE | 16 + node_modules/inherits/README.md | 42 + node_modules/inherits/inherits.js | 9 + node_modules/inherits/inherits_browser.js | 27 + node_modules/inherits/package.json | 29 + node_modules/is-alphabetical/index 2.js | 14 + node_modules/is-alphabetical/index.d.ts | 8 + node_modules/is-alphabetical/index.js | 16 + node_modules/is-alphabetical/license | 22 + node_modules/is-alphabetical/license 2 | 22 + node_modules/is-alphabetical/package 2.json | 75 + node_modules/is-alphabetical/package.json | 73 + node_modules/is-alphabetical/readme 2.md | 70 + node_modules/is-alphabetical/readme.md | 141 + node_modules/is-alphanumerical/index 2.js | 12 + node_modules/is-alphanumerical/index.d.ts | 8 + node_modules/is-alphanumerical/index.js | 13 + node_modules/is-alphanumerical/license | 22 + node_modules/is-alphanumerical/license 2 | 22 + node_modules/is-alphanumerical/package 2.json | 77 + node_modules/is-alphanumerical/package.json | 79 + node_modules/is-alphanumerical/readme 2.md | 71 + node_modules/is-alphanumerical/readme.md | 142 + node_modules/is-binary-path/index.d.ts | 17 + node_modules/is-binary-path/index.js | 7 + node_modules/is-binary-path/license | 9 + node_modules/is-binary-path/package.json | 40 + node_modules/is-binary-path/readme.md | 34 + node_modules/is-decimal/index 2.js | 11 + node_modules/is-decimal/index.d.ts | 8 + node_modules/is-decimal/index.js | 13 + node_modules/is-decimal/license | 22 + node_modules/is-decimal/license 2 | 22 + node_modules/is-decimal/package 2.json | 72 + node_modules/is-decimal/package.json | 73 + node_modules/is-decimal/readme 2.md | 69 + node_modules/is-decimal/readme.md | 139 + node_modules/is-extendable/LICENSE | 21 + node_modules/is-extendable/README.md | 72 + node_modules/is-extendable/index.js | 13 + node_modules/is-extendable/package.json | 51 + node_modules/is-extglob/LICENSE | 21 + node_modules/is-extglob/README.md | 107 + node_modules/is-extglob/index.js | 20 + node_modules/is-extglob/package.json | 69 + node_modules/is-glob/LICENSE | 21 + node_modules/is-glob/README.md | 206 + node_modules/is-glob/index.js | 150 + node_modules/is-glob/package.json | 81 + node_modules/is-json/.npmignore | 12 + node_modules/is-json/.travis.yml | 14 + node_modules/is-json/LICENSE | 15 + node_modules/is-json/README.md | 41 + node_modules/is-json/index.js | 48 + node_modules/is-json/package.json | 29 + node_modules/is-json/test/index.js | 33 + node_modules/is-number/LICENSE | 21 + node_modules/is-number/README.md | 187 + node_modules/is-number/index.js | 18 + node_modules/is-number/package.json | 82 + node_modules/iso-639-1/.eslintrc | 38 + node_modules/iso-639-1/.eslintrc 2 | 38 + node_modules/iso-639-1/.nvmrc | 1 + node_modules/iso-639-1/.nvmrc 2 | 1 + node_modules/iso-639-1/.prettierrc | 4 + node_modules/iso-639-1/.prettierrc 2 | 4 + node_modules/iso-639-1/.travis 2.yml | 6 + node_modules/iso-639-1/.travis.yml | 6 + node_modules/iso-639-1/.vscode/settings.json | 5 + node_modules/iso-639-1/CHANGELOG 2.md | 34 + node_modules/iso-639-1/CHANGELOG.md | 79 + node_modules/iso-639-1/LICENSE | 21 + node_modules/iso-639-1/LICENSE 2 | 21 + node_modules/iso-639-1/build/index.js | 1 + node_modules/iso-639-1/index.d 2.ts | 205 + node_modules/iso-639-1/index.d.ts | 205 + node_modules/iso-639-1/package 2.json | 46 + node_modules/iso-639-1/package.json | 41 + node_modules/iso-639-1/readme 2.md | 121 + node_modules/iso-639-1/readme.md | 121 + node_modules/iso-639-1/src/data.js | 736 ++ node_modules/iso-639-1/src/index.js | 59 + node_modules/iso-639-1/test/test.js | 92 + node_modules/iso-639-1/webpack.config 2.js | 41 + node_modules/iso-639-1/webpack.config.js | 20 + node_modules/js-yaml/CHANGELOG.md | 557 + node_modules/js-yaml/LICENSE | 21 + node_modules/js-yaml/README.md | 299 + node_modules/js-yaml/bin/js-yaml.js | 132 + node_modules/js-yaml/dist/js-yaml.js | 3989 +++++++ node_modules/js-yaml/dist/js-yaml.min.js | 1 + node_modules/js-yaml/index.js | 7 + node_modules/js-yaml/lib/js-yaml.js | 39 + node_modules/js-yaml/lib/js-yaml/common.js | 59 + node_modules/js-yaml/lib/js-yaml/dumper.js | 850 ++ node_modules/js-yaml/lib/js-yaml/exception.js | 43 + node_modules/js-yaml/lib/js-yaml/loader.js | 1644 +++ node_modules/js-yaml/lib/js-yaml/mark.js | 76 + node_modules/js-yaml/lib/js-yaml/schema.js | 108 + .../js-yaml/lib/js-yaml/schema/core.js | 18 + .../lib/js-yaml/schema/default_full.js | 25 + .../lib/js-yaml/schema/default_safe.js | 28 + .../js-yaml/lib/js-yaml/schema/failsafe.js | 17 + .../js-yaml/lib/js-yaml/schema/json.js | 25 + node_modules/js-yaml/lib/js-yaml/type.js | 61 + .../js-yaml/lib/js-yaml/type/binary.js | 138 + node_modules/js-yaml/lib/js-yaml/type/bool.js | 35 + .../js-yaml/lib/js-yaml/type/float.js | 116 + node_modules/js-yaml/lib/js-yaml/type/int.js | 173 + .../js-yaml/lib/js-yaml/type/js/function.js | 93 + .../js-yaml/lib/js-yaml/type/js/regexp.js | 60 + .../js-yaml/lib/js-yaml/type/js/undefined.js | 28 + node_modules/js-yaml/lib/js-yaml/type/map.js | 8 + .../js-yaml/lib/js-yaml/type/merge.js | 12 + node_modules/js-yaml/lib/js-yaml/type/null.js | 34 + node_modules/js-yaml/lib/js-yaml/type/omap.js | 44 + .../js-yaml/lib/js-yaml/type/pairs.js | 53 + node_modules/js-yaml/lib/js-yaml/type/seq.js | 8 + node_modules/js-yaml/lib/js-yaml/type/set.js | 29 + node_modules/js-yaml/lib/js-yaml/type/str.js | 8 + .../js-yaml/lib/js-yaml/type/timestamp.js | 88 + node_modules/js-yaml/package.json | 49 + node_modules/junk/index 2.js | 30 + node_modules/junk/index.d.ts | 40 + node_modules/junk/index.js | 39 + node_modules/junk/license | 9 + node_modules/junk/license 2 | 21 + node_modules/junk/package 2.json | 37 + node_modules/junk/package.json | 42 + node_modules/junk/readme 2.md | 46 + node_modules/junk/readme.md | 51 + node_modules/kind-of/CHANGELOG.md | 160 + node_modules/kind-of/LICENSE | 21 + node_modules/kind-of/README.md | 367 + node_modules/kind-of/index.js | 129 + node_modules/kind-of/package.json | 88 + node_modules/kleur/colors.d.ts | 38 + node_modules/kleur/colors.js | 53 + node_modules/kleur/colors.mjs | 53 + node_modules/kleur/index.d.ts | 45 + node_modules/kleur/index.js | 110 + node_modules/kleur/index.mjs | 110 + node_modules/kleur/license | 21 + node_modules/kleur/package.json | 51 + node_modules/kleur/readme.md | 232 + node_modules/linkify-it/LICENSE | 22 + node_modules/linkify-it/README.md | 196 + node_modules/linkify-it/build/index.cjs.js | 832 ++ node_modules/linkify-it/index.mjs | 642 ++ node_modules/linkify-it/lib/re.mjs | 189 + node_modules/linkify-it/package.json | 58 + node_modules/liquidjs/LICENSE | 21 + node_modules/liquidjs/LICENSE 2 | 21 + node_modules/liquidjs/README 2.md | 220 + node_modules/liquidjs/README.md | 233 + node_modules/liquidjs/bin/liquid.js | 139 + .../liquidjs/dist/build/fs-impl-browser.d.ts | 7 + .../dist/build/fs-impl-browser.spec.d.ts | 1 + .../dist/build/streamed-emitter-browser.d.ts | 10 + .../build/streamed-emitter-browser.spec.d.ts | 1 + node_modules/liquidjs/dist/cache/cache.d.ts | 7 + node_modules/liquidjs/dist/cache/index.d.ts | 2 + node_modules/liquidjs/dist/cache/lru.d.ts | 14 + .../liquidjs/dist/cache/lru.spec.d.ts | 1 + .../liquidjs/dist/context/block-mode.d.ts | 4 + .../liquidjs/dist/context/context.d.ts | 64 + .../liquidjs/dist/context/context.spec.d.ts | 1 + node_modules/liquidjs/dist/context/index.d.ts | 3 + node_modules/liquidjs/dist/context/scope.d.ts | 6 + .../liquidjs/dist/drop/blank-drop.d.ts | 5 + .../liquidjs/dist/drop/block-drop.d.ts | 11 + .../liquidjs/dist/drop/comparable.d.ts | 8 + node_modules/liquidjs/dist/drop/drop.d.ts | 3 + .../liquidjs/dist/drop/empty-drop.d.ts | 11 + .../liquidjs/dist/drop/forloop-drop.d.ts | 15 + node_modules/liquidjs/dist/drop/index.d.ts | 7 + .../liquidjs/dist/drop/null-drop.d.ts | 10 + .../liquidjs/dist/drop/tablerowloop-drop.d.ts | 10 + .../liquidjs/dist/emitters/emitter.d.ts | 11 + .../liquidjs/dist/emitters/index.d.ts | 4 + .../dist/emitters/keeping-type-emitter.d.ts | 5 + .../dist/emitters/simple-emitter.d.ts | 5 + .../dist/emitters/streamed-emitter.d.ts | 9 + node_modules/liquidjs/dist/filters/array.d.ts | 32 + node_modules/liquidjs/dist/filters/date.d.ts | 6 + node_modules/liquidjs/dist/filters/html.d.ts | 6 + node_modules/liquidjs/dist/filters/index.d.ts | 2 + node_modules/liquidjs/dist/filters/math.d.ts | 11 + node_modules/liquidjs/dist/filters/misc.d.ts | 18 + .../liquidjs/dist/filters/string.d.ts | 27 + node_modules/liquidjs/dist/filters/url.d.ts | 14 + node_modules/liquidjs/dist/fs/fs-impl.d.ts | 9 + .../liquidjs/dist/fs/fs-impl.spec.d.ts | 1 + node_modules/liquidjs/dist/fs/fs.d.ts | 20 + node_modules/liquidjs/dist/fs/index.d.ts | 2 + node_modules/liquidjs/dist/fs/loader.d.ts | 24 + .../liquidjs/dist/fs/loader.spec.d.ts | 1 + node_modules/liquidjs/dist/fs/map-fs.d.ts | 13 + .../liquidjs/dist/fs/map-fs.spec.d.ts | 1 + .../liquidjs/dist/fs/node-require.d.ts | 1 + node_modules/liquidjs/dist/index.d.ts | 15 + .../liquidjs/dist/liquid-options.d.ts | 159 + .../liquidjs/dist/liquid-options.spec.d.ts | 1 + .../liquidjs/dist/liquid.browser.min.js | 2 + .../liquidjs/dist/liquid.browser.min.js.map | 1 + node_modules/liquidjs/dist/liquid.browser.mjs | 4939 +++++++++ .../liquidjs/dist/liquid.browser.umd.js | 7261 +++++++++++++ .../liquidjs/dist/liquid.browser.umd.js.map | 1 + node_modules/liquidjs/dist/liquid.d.ts | 70 + node_modules/liquidjs/dist/liquid.node.js | 4962 +++++++++ node_modules/liquidjs/dist/liquid.node.mjs | 4952 +++++++++ .../liquidjs/dist/parser/filter-arg.d.ts | 5 + node_modules/liquidjs/dist/parser/index.d.ts | 4 + .../liquidjs/dist/parser/parse-stream.d.ts | 15 + .../dist/parser/parse-stream.spec.d.ts | 1 + node_modules/liquidjs/dist/parser/parser.d.ts | 20 + .../liquidjs/dist/parser/parser.spec.d.ts | 1 + .../liquidjs/dist/parser/token-kind.d.ts | 16 + .../liquidjs/dist/parser/tokenizer.d.ts | 63 + .../liquidjs/dist/parser/tokenizer.spec.d.ts | 1 + .../liquidjs/dist/parser/whitespace-ctrl.d.ts | 3 + .../liquidjs/dist/render/boolean.d.ts | 3 + .../liquidjs/dist/render/boolean.spec.d.ts | 1 + .../liquidjs/dist/render/expression.d.ts | 10 + .../liquidjs/dist/render/expression.spec.d.ts | 1 + node_modules/liquidjs/dist/render/index.d.ts | 4 + .../liquidjs/dist/render/operator.d.ts | 8 + node_modules/liquidjs/dist/render/render.d.ts | 8 + .../liquidjs/dist/render/render.spec.d.ts | 1 + node_modules/liquidjs/dist/render/string.d.ts | 1 + .../liquidjs/dist/render/string.spec.d.ts | 1 + node_modules/liquidjs/dist/tags/assign.d.ts | 12 + node_modules/liquidjs/dist/tags/block.d.ts | 11 + node_modules/liquidjs/dist/tags/break.d.ts | 4 + node_modules/liquidjs/dist/tags/capture.d.ts | 13 + node_modules/liquidjs/dist/tags/case.d.ts | 15 + node_modules/liquidjs/dist/tags/comment.d.ts | 5 + node_modules/liquidjs/dist/tags/continue.d.ts | 4 + node_modules/liquidjs/dist/tags/cycle.d.ts | 9 + .../liquidjs/dist/tags/decrement.d.ts | 9 + node_modules/liquidjs/dist/tags/echo.d.ts | 8 + node_modules/liquidjs/dist/tags/for.d.ts | 15 + node_modules/liquidjs/dist/tags/if.d.ts | 14 + node_modules/liquidjs/dist/tags/include.d.ts | 12 + .../liquidjs/dist/tags/increment.d.ts | 9 + node_modules/liquidjs/dist/tags/index.d.ts | 24 + .../liquidjs/dist/tags/inline-comment.d.ts | 5 + node_modules/liquidjs/dist/tags/layout.d.ts | 14 + node_modules/liquidjs/dist/tags/liquid.d.ts | 8 + node_modules/liquidjs/dist/tags/raw.d.ts | 6 + node_modules/liquidjs/dist/tags/render.d.ts | 22 + node_modules/liquidjs/dist/tags/tablerow.d.ts | 14 + node_modules/liquidjs/dist/tags/unless.d.ts | 15 + .../liquidjs/dist/template/analysis.d.ts | 85 + .../liquidjs/dist/template/analysis.spec.d.ts | 1 + .../dist/template/filter-impl-options.d.ts | 14 + .../liquidjs/dist/template/filter.d.ts | 15 + .../liquidjs/dist/template/filter.spec.d.ts | 1 + node_modules/liquidjs/dist/template/hash.d.ts | 18 + .../liquidjs/dist/template/hash.spec.d.ts | 1 + node_modules/liquidjs/dist/template/html.d.ts | 9 + .../liquidjs/dist/template/index.d.ts | 11 + .../liquidjs/dist/template/output.d.ts | 12 + .../liquidjs/dist/template/output.spec.d.ts | 1 + .../dist/template/tag-options-adapter.d.ts | 10 + node_modules/liquidjs/dist/template/tag.d.ts | 18 + .../liquidjs/dist/template/template-impl.d.ts | 4 + .../liquidjs/dist/template/template.d.ts | 36 + .../liquidjs/dist/template/value.d.ts | 15 + .../liquidjs/dist/template/value.spec.d.ts | 1 + .../liquidjs/dist/tokens/delimited-token.d.ts | 9 + .../liquidjs/dist/tokens/filter-token.d.ts | 7 + .../dist/tokens/filtered-value-token.d.ts | 17 + .../liquidjs/dist/tokens/hash-token.d.ts | 12 + .../liquidjs/dist/tokens/html-token.d.ts | 11 + .../dist/tokens/identifier-token.d.ts | 9 + node_modules/liquidjs/dist/tokens/index.d.ts | 18 + .../dist/tokens/liquid-tag-token.d.ts | 12 + .../liquidjs/dist/tokens/literal-token.d.ts | 11 + .../liquidjs/dist/tokens/number-token.d.ts | 9 + .../liquidjs/dist/tokens/operator-token.d.ts | 38 + .../liquidjs/dist/tokens/output-token.d.ts | 5 + .../dist/tokens/property-access-token.d.ts | 12 + .../liquidjs/dist/tokens/quoted-token.d.ts | 9 + .../liquidjs/dist/tokens/range-token.d.ts | 11 + .../liquidjs/dist/tokens/tag-token.d.ts | 9 + node_modules/liquidjs/dist/tokens/token.d.ts | 12 + .../liquidjs/dist/tokens/top-level-token.d.ts | 4 + .../liquidjs/dist/tokens/value-token.d.ts | 6 + node_modules/liquidjs/dist/util/assert.d.ts | 2 + .../liquidjs/dist/util/assert.spec.d.ts | 1 + node_modules/liquidjs/dist/util/async.d.ts | 2 + .../liquidjs/dist/util/async.spec.d.ts | 1 + .../liquidjs/dist/util/character.d.ts | 10 + node_modules/liquidjs/dist/util/error.d.ts | 35 + .../liquidjs/dist/util/error.spec.d.ts | 1 + node_modules/liquidjs/dist/util/index.d.ts | 12 + node_modules/liquidjs/dist/util/intl.d.ts | 6 + node_modules/liquidjs/dist/util/limiter.d.ts | 8 + .../liquidjs/dist/util/liquid-date.d.ts | 52 + .../liquidjs/dist/util/liquid-date.spec.d.ts | 1 + node_modules/liquidjs/dist/util/literal.d.ts | 11 + .../liquidjs/dist/util/operator-trie.d.ts | 14 + .../liquidjs/dist/util/performance.d.ts | 5 + .../liquidjs/dist/util/performance.spec.d.ts | 1 + node_modules/liquidjs/dist/util/strftime.d.ts | 2 + .../liquidjs/dist/util/strftime.spec.d.ts | 1 + .../liquidjs/dist/util/type-guards.d.ts | 13 + .../liquidjs/dist/util/type-guards.spec.d.ts | 1 + .../liquidjs/dist/util/underscore.d.ts | 39 + .../liquidjs/dist/util/underscore.spec.d.ts | 1 + node_modules/liquidjs/package 2.json | 161 + node_modules/liquidjs/package.json | 165 + node_modules/list-to-array/.npmignore | 27 + node_modules/list-to-array/LICENSE | 22 + node_modules/list-to-array/README.md | 52 + node_modules/list-to-array/index.js | 18 + node_modules/list-to-array/package.json | 32 + node_modules/list-to-array/tests.js | 29 + node_modules/luxon/LICENSE 2.md | 7 + node_modules/luxon/LICENSE.md | 7 + node_modules/luxon/README 2.md | 55 + node_modules/luxon/README.md | 55 + node_modules/luxon/build/amd/luxon.js | 8643 +++++++++++++++ node_modules/luxon/build/amd/luxon.js.map | 1 + node_modules/luxon/build/cjs-browser/luxon.js | 8641 +++++++++++++++ .../luxon/build/cjs-browser/luxon.js.map | 1 + node_modules/luxon/build/es6/luxon.js | 8031 ++++++++++++++ node_modules/luxon/build/es6/luxon.js.map | 1 + node_modules/luxon/build/global/luxon.js | 8646 +++++++++++++++ node_modules/luxon/build/global/luxon.js.map | 1 + node_modules/luxon/build/global/luxon.min.js | 1 + .../luxon/build/global/luxon.min.js.map | 1 + node_modules/luxon/build/node/luxon.js | 7702 ++++++++++++++ node_modules/luxon/build/node/luxon.js.map | 1 + node_modules/luxon/package 2.json | 87 + node_modules/luxon/package.json | 87 + node_modules/luxon/src/datetime.js | 2568 +++++ node_modules/luxon/src/duration.js | 990 ++ node_modules/luxon/src/errors.js | 61 + node_modules/luxon/src/impl/conversions.js | 206 + node_modules/luxon/src/impl/diff.js | 95 + node_modules/luxon/src/impl/digits.js | 94 + node_modules/luxon/src/impl/english.js | 233 + node_modules/luxon/src/impl/formats.js | 176 + node_modules/luxon/src/impl/formatter.js | 409 + node_modules/luxon/src/impl/invalid.js | 14 + node_modules/luxon/src/impl/locale.js | 561 + node_modules/luxon/src/impl/regexParser.js | 335 + node_modules/luxon/src/impl/tokenParser.js | 505 + node_modules/luxon/src/impl/util.js | 316 + node_modules/luxon/src/impl/zoneUtil.js | 34 + node_modules/luxon/src/info.js | 205 + node_modules/luxon/src/interval.js | 668 ++ node_modules/luxon/src/luxon.js | 26 + node_modules/luxon/src/package.json | 4 + node_modules/luxon/src/settings.js | 180 + node_modules/luxon/src/zone.js | 97 + node_modules/luxon/src/zones/IANAZone.js | 235 + .../luxon/src/zones/fixedOffsetZone.js | 150 + node_modules/luxon/src/zones/invalidZone.js | 53 + node_modules/luxon/src/zones/systemZone.js | 61 + node_modules/markdown-it/LICENSE | 22 + node_modules/markdown-it/README.md | 324 + node_modules/markdown-it/bin/markdown-it.mjs | 107 + node_modules/markdown-it/dist/index.cjs.js | 5540 ++++++++++ node_modules/markdown-it/dist/markdown-it.js | 6963 ++++++++++++ .../markdown-it/dist/markdown-it.min.js | 2 + node_modules/markdown-it/index.mjs | 1 + .../markdown-it/lib/common/html_blocks.mjs | 67 + .../markdown-it/lib/common/html_re.mjs | 25 + node_modules/markdown-it/lib/common/utils.mjs | 304 + .../markdown-it/lib/helpers/index.mjs | 11 + .../lib/helpers/parse_link_destination.mjs | 77 + .../lib/helpers/parse_link_label.mjs | 49 + .../lib/helpers/parse_link_title.mjs | 66 + node_modules/markdown-it/lib/index.mjs | 565 + node_modules/markdown-it/lib/parser_block.mjs | 134 + node_modules/markdown-it/lib/parser_core.mjs | 62 + .../markdown-it/lib/parser_inline.mjs | 197 + .../markdown-it/lib/presets/commonmark.mjs | 88 + .../markdown-it/lib/presets/default.mjs | 47 + node_modules/markdown-it/lib/presets/zero.mjs | 70 + node_modules/markdown-it/lib/renderer.mjs | 322 + node_modules/markdown-it/lib/ruler.mjs | 340 + .../lib/rules_block/blockquote.mjs | 209 + .../markdown-it/lib/rules_block/code.mjs | 30 + .../markdown-it/lib/rules_block/fence.mjs | 94 + .../markdown-it/lib/rules_block/heading.mjs | 51 + .../markdown-it/lib/rules_block/hr.mjs | 40 + .../lib/rules_block/html_block.mjs | 69 + .../markdown-it/lib/rules_block/lheading.mjs | 82 + .../markdown-it/lib/rules_block/list.mjs | 331 + .../markdown-it/lib/rules_block/paragraph.mjs | 46 + .../markdown-it/lib/rules_block/reference.mjs | 212 + .../lib/rules_block/state_block.mjs | 220 + .../markdown-it/lib/rules_block/table.mjs | 228 + .../markdown-it/lib/rules_core/block.mjs | 13 + .../markdown-it/lib/rules_core/inline.mjs | 11 + .../markdown-it/lib/rules_core/linkify.mjs | 134 + .../markdown-it/lib/rules_core/normalize.mjs | 17 + .../lib/rules_core/replacements.mjs | 101 + .../lib/rules_core/smartquotes.mjs | 193 + .../markdown-it/lib/rules_core/state_core.mjs | 17 + .../markdown-it/lib/rules_core/text_join.mjs | 43 + .../markdown-it/lib/rules_inline/autolink.mjs | 72 + .../lib/rules_inline/backticks.mjs | 60 + .../lib/rules_inline/balance_pairs.mjs | 124 + .../markdown-it/lib/rules_inline/emphasis.mjs | 123 + .../markdown-it/lib/rules_inline/entity.mjs | 51 + .../markdown-it/lib/rules_inline/escape.mjs | 69 + .../lib/rules_inline/fragments_join.mjs | 38 + .../lib/rules_inline/html_inline.mjs | 50 + .../markdown-it/lib/rules_inline/image.mjs | 138 + .../markdown-it/lib/rules_inline/link.mjs | 139 + .../markdown-it/lib/rules_inline/linkify.mjs | 56 + .../markdown-it/lib/rules_inline/newline.mjs | 42 + .../lib/rules_inline/state_inline.mjs | 123 + .../lib/rules_inline/strikethrough.mjs | 127 + .../markdown-it/lib/rules_inline/text.mjs | 86 + node_modules/markdown-it/lib/token.mjs | 191 + .../node_modules/argparse/CHANGELOG.md | 216 + .../markdown-it/node_modules/argparse/LICENSE | 254 + .../node_modules/argparse/README.md | 84 + .../node_modules/argparse/argparse.js | 3707 +++++++ .../node_modules/argparse/lib/sub.js | 67 + .../node_modules/argparse/lib/textwrap.js | 440 + .../node_modules/argparse/package.json | 31 + .../markdown-it/node_modules/entities/LICENSE | 11 + .../node_modules/entities/lib/decode.d.ts | 211 + .../node_modules/entities/lib/decode.d.ts.map | 1 + .../node_modules/entities/lib/decode.js | 536 + .../node_modules/entities/lib/decode.js.map | 1 + .../entities/lib/decode_codepoint.d.ts | 19 + .../entities/lib/decode_codepoint.d.ts.map | 1 + .../entities/lib/decode_codepoint.js | 76 + .../entities/lib/decode_codepoint.js.map | 1 + .../node_modules/entities/lib/encode.d.ts | 22 + .../node_modules/entities/lib/encode.d.ts.map | 1 + .../node_modules/entities/lib/encode.js | 77 + .../node_modules/entities/lib/encode.js.map | 1 + .../node_modules/entities/lib/escape.d.ts | 43 + .../node_modules/entities/lib/escape.d.ts.map | 1 + .../node_modules/entities/lib/escape.js | 122 + .../node_modules/entities/lib/escape.js.map | 1 + .../node_modules/entities/lib/esm/decode.d.ts | 211 + .../entities/lib/esm/decode.d.ts.map | 1 + .../node_modules/entities/lib/esm/decode.js | 496 + .../entities/lib/esm/decode.js.map | 1 + .../entities/lib/esm/decode_codepoint.d.ts | 19 + .../lib/esm/decode_codepoint.d.ts.map | 1 + .../entities/lib/esm/decode_codepoint.js | 71 + .../entities/lib/esm/decode_codepoint.js.map | 1 + .../node_modules/entities/lib/esm/encode.d.ts | 22 + .../entities/lib/esm/encode.d.ts.map | 1 + .../node_modules/entities/lib/esm/encode.js | 69 + .../entities/lib/esm/encode.js.map | 1 + .../node_modules/entities/lib/esm/escape.d.ts | 43 + .../entities/lib/esm/escape.d.ts.map | 1 + .../node_modules/entities/lib/esm/escape.js | 116 + .../entities/lib/esm/escape.js.map | 1 + .../lib/esm/generated/decode-data-html.d.ts | 3 + .../esm/generated/decode-data-html.d.ts.map | 1 + .../lib/esm/generated/decode-data-html.js | 7 + .../lib/esm/generated/decode-data-html.js.map | 1 + .../lib/esm/generated/decode-data-xml.d.ts | 3 + .../esm/generated/decode-data-xml.d.ts.map | 1 + .../lib/esm/generated/decode-data-xml.js | 7 + .../lib/esm/generated/decode-data-xml.js.map | 1 + .../lib/esm/generated/encode-html.d.ts | 8 + .../lib/esm/generated/encode-html.d.ts.map | 1 + .../entities/lib/esm/generated/encode-html.js | 10 + .../lib/esm/generated/encode-html.js.map | 1 + .../node_modules/entities/lib/esm/index.d.ts | 96 + .../entities/lib/esm/index.d.ts.map | 1 + .../node_modules/entities/lib/esm/index.js | 99 + .../entities/lib/esm/index.js.map | 1 + .../entities/lib/esm/package.json | 1 + .../lib/generated/decode-data-html.d.ts | 3 + .../lib/generated/decode-data-html.d.ts.map | 1 + .../lib/generated/decode-data-html.js | 9 + .../lib/generated/decode-data-html.js.map | 1 + .../lib/generated/decode-data-xml.d.ts | 3 + .../lib/generated/decode-data-xml.d.ts.map | 1 + .../entities/lib/generated/decode-data-xml.js | 9 + .../lib/generated/decode-data-xml.js.map | 1 + .../entities/lib/generated/encode-html.d.ts | 8 + .../lib/generated/encode-html.d.ts.map | 1 + .../entities/lib/generated/encode-html.js | 12 + .../entities/lib/generated/encode-html.js.map | 1 + .../node_modules/entities/lib/index.d.ts | 96 + .../node_modules/entities/lib/index.d.ts.map | 1 + .../node_modules/entities/lib/index.js | 126 + .../node_modules/entities/lib/index.js.map | 1 + .../node_modules/entities/package.json | 90 + .../node_modules/entities/readme.md | 122 + node_modules/markdown-it/package.json | 92 + node_modules/maximatch/index.js | 39 + node_modules/maximatch/license | 21 + node_modules/maximatch/package.json | 44 + node_modules/maximatch/readme.md | 71 + node_modules/mdurl/LICENSE | 45 + node_modules/mdurl/LICENSE 2 | 45 + node_modules/mdurl/README 2.md | 102 + node_modules/mdurl/README.md | 102 + node_modules/mdurl/build/index.cjs.js | 534 + node_modules/mdurl/index.mjs | 11 + node_modules/mdurl/lib/decode.mjs | 112 + node_modules/mdurl/lib/encode.mjs | 89 + node_modules/mdurl/lib/format.mjs | 21 + node_modules/mdurl/lib/parse.mjs | 308 + node_modules/mdurl/package 2.json | 16 + node_modules/mdurl/package.json | 37 + node_modules/mime-db/HISTORY.md | 541 + node_modules/mime-db/LICENSE | 23 + node_modules/mime-db/README.md | 109 + node_modules/mime-db/db.json | 9342 +++++++++++++++++ node_modules/mime-db/index.js | 12 + node_modules/mime-db/package.json | 56 + node_modules/mime-types/HISTORY.md | 421 + node_modules/mime-types/LICENSE | 23 + node_modules/mime-types/README.md | 126 + node_modules/mime-types/index.js | 211 + node_modules/mime-types/mimeScore.js | 52 + node_modules/mime-types/package.json | 45 + node_modules/mime/CHANGELOG.md | 312 + node_modules/mime/LICENSE | 21 + node_modules/mime/Mime.js | 97 + node_modules/mime/README.md | 178 + node_modules/mime/cli.js | 46 + node_modules/mime/index.js | 4 + node_modules/mime/lite.js | 4 + node_modules/mime/package.json | 52 + node_modules/mime/types/other.js | 1 + node_modules/mime/types/standard.js | 1 + node_modules/minimatch/LICENSE | 15 + node_modules/minimatch/README.md | 230 + node_modules/minimatch/minimatch.js | 947 ++ node_modules/minimatch/package.json | 33 + node_modules/minimist/.eslintrc | 29 + node_modules/minimist/.github/FUNDING.yml | 12 + node_modules/minimist/.nycrc | 14 + node_modules/minimist/CHANGELOG.md | 298 + node_modules/minimist/LICENSE | 18 + node_modules/minimist/README.md | 121 + node_modules/minimist/example/parse.js | 4 + node_modules/minimist/index.js | 263 + node_modules/minimist/package.json | 75 + node_modules/minimist/test/all_bool.js | 34 + node_modules/minimist/test/bool.js | 177 + node_modules/minimist/test/dash.js | 43 + node_modules/minimist/test/default_bool.js | 37 + node_modules/minimist/test/dotted.js | 24 + node_modules/minimist/test/kv_short.js | 32 + node_modules/minimist/test/long.js | 33 + node_modules/minimist/test/num.js | 38 + node_modules/minimist/test/parse.js | 209 + node_modules/minimist/test/parse_modified.js | 11 + node_modules/minimist/test/proto.js | 64 + node_modules/minimist/test/short.js | 69 + node_modules/minimist/test/stop_early.js | 17 + node_modules/minimist/test/unknown.js | 104 + node_modules/minimist/test/whitespace.js | 10 + node_modules/minipass/LICENSE | 15 + node_modules/minipass/LICENSE 2 | 15 + node_modules/minipass/README 2.md | 728 ++ node_modules/minipass/README.md | 825 ++ .../minipass/dist/commonjs/index.d.ts | 549 + .../minipass/dist/commonjs/index.d.ts.map | 1 + node_modules/minipass/dist/commonjs/index.js | 1028 ++ .../minipass/dist/commonjs/index.js.map | 1 + .../minipass/dist/commonjs/package.json | 3 + node_modules/minipass/dist/esm/index.d.ts | 549 + node_modules/minipass/dist/esm/index.d.ts.map | 1 + node_modules/minipass/dist/esm/index.js | 1018 ++ node_modules/minipass/dist/esm/index.js.map | 1 + node_modules/minipass/dist/esm/package.json | 3 + node_modules/minipass/package 2.json | 56 + node_modules/minipass/package.json | 82 + node_modules/moo/LICENSE | 29 + node_modules/moo/README.md | 383 + node_modules/moo/moo.js | 642 ++ node_modules/moo/package.json | 29 + node_modules/morphdom/CHANGELOG 2.md | 240 + node_modules/morphdom/CHANGELOG.md | 246 + node_modules/morphdom/LICENSE | 21 + node_modules/morphdom/LICENSE 2 | 21 + node_modules/morphdom/README 2.md | 260 + node_modules/morphdom/README.md | 265 + node_modules/morphdom/dist/morphdom-esm.js | 769 ++ .../morphdom/dist/morphdom-factory.js | 705 ++ node_modules/morphdom/dist/morphdom-umd.js | 777 ++ .../morphdom/dist/morphdom-umd.min.js | 1 + node_modules/morphdom/dist/morphdom.js | 771 ++ node_modules/morphdom/docs/old-benchmark.md | 204 + node_modules/morphdom/docs/virtual-dom.md | 38 + node_modules/morphdom/factory 2.js | 1 + node_modules/morphdom/factory.js | 1 + node_modules/morphdom/index.d 2.ts | 19 + node_modules/morphdom/index.d.ts | 19 + node_modules/morphdom/package 2.json | 63 + node_modules/morphdom/package.json | 63 + node_modules/morphdom/src/index.js | 6 + node_modules/morphdom/src/morphAttrs.js | 63 + node_modules/morphdom/src/morphdom.js | 482 + .../morphdom/src/specialElHandlers.js | 115 + node_modules/morphdom/src/util.js | 113 + node_modules/ms/index 2.js | 162 + node_modules/ms/index.js | 162 + node_modules/ms/license 2.md | 21 + node_modules/ms/license.md | 21 + node_modules/ms/package 2.json | 37 + node_modules/ms/package.json | 38 + node_modules/ms/readme 2.md | 60 + node_modules/ms/readme.md | 59 + node_modules/node-retrieve-globals/LICENSE | 21 + node_modules/node-retrieve-globals/README.md | 91 + .../node-retrieve-globals/package.json | 30 + .../node-retrieve-globals/retrieveGlobals.js | 376 + .../util/getWorkingDirectory.js | 18 + .../node-retrieve-globals/util/vmModules.js | 23 + node_modules/normalize-path/LICENSE | 21 + node_modules/normalize-path/README.md | 127 + node_modules/normalize-path/index.js | 35 + node_modules/normalize-path/package.json | 77 + node_modules/nunjucks/LICENSE | 26 + node_modules/nunjucks/README.md | 58 + node_modules/nunjucks/bin/precompile | 58 + node_modules/nunjucks/bin/precompile.cmd | 5 + .../nunjucks/browser/nunjucks-slim.js | 3709 +++++++ .../nunjucks/browser/nunjucks-slim.js.map | 1 + .../nunjucks/browser/nunjucks-slim.min.js | 3 + .../nunjucks/browser/nunjucks-slim.min.js.map | 1 + node_modules/nunjucks/browser/nunjucks.js | 7021 +++++++++++++ node_modules/nunjucks/browser/nunjucks.js.map | 1 + node_modules/nunjucks/browser/nunjucks.min.js | 3 + .../nunjucks/browser/nunjucks.min.js.map | 1 + node_modules/nunjucks/index.js | 82 + .../node_modules/commander/CHANGELOG.md | 385 + .../nunjucks/node_modules/commander/LICENSE | 22 + .../nunjucks/node_modules/commander/Readme.md | 737 ++ .../nunjucks/node_modules/commander/index.js | 1756 ++++ .../node_modules/commander/package.json | 48 + .../node_modules/commander/typings/index.d.ts | 386 + node_modules/nunjucks/package.json | 112 + node_modules/nunjucks/src/compiler.js | 1027 ++ node_modules/nunjucks/src/environment.js | 548 + node_modules/nunjucks/src/express-app.js | 23 + node_modules/nunjucks/src/filters.js | 546 + node_modules/nunjucks/src/globals.js | 65 + node_modules/nunjucks/src/jinja-compat.js | 293 + node_modules/nunjucks/src/lexer.js | 474 + node_modules/nunjucks/src/lib.js | 325 + node_modules/nunjucks/src/loader.js | 21 + node_modules/nunjucks/src/loaders.js | 5 + node_modules/nunjucks/src/node-loaders.js | 139 + node_modules/nunjucks/src/nodes.js | 350 + node_modules/nunjucks/src/object.js | 100 + node_modules/nunjucks/src/parser.js | 1028 ++ .../nunjucks/src/precompile-global.js | 17 + node_modules/nunjucks/src/precompile.js | 108 + .../nunjucks/src/precompiled-loader.js | 31 + node_modules/nunjucks/src/runtime.js | 333 + node_modules/nunjucks/src/tests.js | 265 + node_modules/nunjucks/src/transformer.js | 166 + node_modules/nunjucks/src/web-loaders.js | 94 + node_modules/on-finished/HISTORY.md | 98 + node_modules/on-finished/LICENSE | 23 + node_modules/on-finished/README.md | 162 + node_modules/on-finished/index.js | 234 + node_modules/on-finished/package.json | 39 + node_modules/parse-srcset/.jscs.json | 83 + node_modules/parse-srcset/.jshintrc | 15 + node_modules/parse-srcset/.npmignore | 8 + node_modules/parse-srcset/LICENSE | 22 + node_modules/parse-srcset/README.md | 19 + node_modules/parse-srcset/package.json | 25 + node_modules/parse-srcset/src/parse-srcset.js | 330 + node_modules/parse-srcset/tests/he.js | 329 + node_modules/parse-srcset/tests/intern.js | 74 + node_modules/parse-srcset/tests/unit/ps.js | 345 + node_modules/parseurl/HISTORY.md | 58 + node_modules/parseurl/LICENSE | 24 + node_modules/parseurl/README.md | 133 + node_modules/parseurl/index.js | 158 + node_modules/parseurl/package.json | 40 + node_modules/picomatch/CHANGELOG.md | 136 + node_modules/picomatch/LICENSE | 21 + node_modules/picomatch/README.md | 708 ++ node_modules/picomatch/index.js | 3 + node_modules/picomatch/lib/constants.js | 179 + node_modules/picomatch/lib/parse.js | 1091 ++ node_modules/picomatch/lib/picomatch.js | 342 + node_modules/picomatch/lib/scan.js | 391 + node_modules/picomatch/lib/utils.js | 64 + node_modules/picomatch/package.json | 81 + node_modules/please-upgrade-node/.eslintrc.js | 12 + .../please-upgrade-node/.github/FUNDING.yml | 1 + .../please-upgrade-node}/LICENSE | 2 +- node_modules/please-upgrade-node/README.md | 72 + node_modules/please-upgrade-node/index.d.ts | 11 + node_modules/please-upgrade-node/index.js | 25 + node_modules/please-upgrade-node/package.json | 46 + node_modules/posthtml-match-helper/LICENSE | 21 + node_modules/posthtml-match-helper/README.md | 84 + .../posthtml-match-helper/lib/index.d.ts | 10 + .../posthtml-match-helper/lib/index.js | 149 + .../posthtml-match-helper/package.json | 41 + .../posthtml-parser/dist/chunk.2UQLUWPH.js | 1 + node_modules/posthtml-parser/dist/index.d.ts | 27 + node_modules/posthtml-parser/dist/index.js | 1 + .../dist/location-tracker.d.ts | 17 + .../posthtml-parser/dist/location-tracker.js | 1 + node_modules/posthtml-parser/license | 22 + node_modules/posthtml-parser/package.json | 69 + node_modules/posthtml-parser/readme.md | 130 + node_modules/posthtml-render/changelog.md | 310 + node_modules/posthtml-render/dist/index.d.ts | 67 + node_modules/posthtml-render/dist/index.js | 1 + node_modules/posthtml-render/license | 22 + node_modules/posthtml-render/package.json | 55 + node_modules/posthtml-render/readme.md | 225 + node_modules/posthtml/lib/api.js | 145 + node_modules/posthtml/lib/index.js | 323 + node_modules/posthtml/license | 21 + node_modules/posthtml/package.json | 64 + node_modules/posthtml/readme.md | 412 + node_modules/posthtml/types/posthtml.d.ts | 108 + node_modules/prr/.jshintrc | 61 + node_modules/prr/.npmignore | 1 + node_modules/prr/.travis.yml | 10 + node_modules/prr/LICENSE.md | 11 + node_modules/prr/README.md | 47 + node_modules/prr/package.json | 26 + node_modules/prr/prr.js | 63 + node_modules/prr/test.js | 169 + node_modules/punycode.js/LICENSE-MIT.txt | 20 + node_modules/punycode.js/README.md | 148 + node_modules/punycode.js/package.json | 58 + node_modules/punycode.js/punycode.es6.js | 444 + node_modules/punycode.js/punycode.js | 443 + node_modules/range-parser/HISTORY.md | 56 + node_modules/range-parser/LICENSE | 23 + node_modules/range-parser/README.md | 84 + node_modules/range-parser/index.js | 162 + node_modules/range-parser/package.json | 44 + node_modules/readdirp/LICENSE | 21 + node_modules/readdirp/README.md | 122 + node_modules/readdirp/index.d.ts | 43 + node_modules/readdirp/index.js | 287 + node_modules/readdirp/package.json | 122 + node_modules/section-matter/LICENSE | 21 + node_modules/section-matter/README.md | 236 + node_modules/section-matter/index.js | 136 + node_modules/section-matter/package.json | 55 + node_modules/semver-compare/.travis.yml | 6 + node_modules/semver-compare/LICENSE | 18 + node_modules/semver-compare/example/cmp.js | 13 + node_modules/semver-compare/example/lex.js | 12 + node_modules/semver-compare/index.js | 13 + node_modules/semver-compare/package.json | 31 + node_modules/semver-compare/readme.markdown | 77 + node_modules/semver-compare/test/cmp.js | 29 + node_modules/semver/LICENSE | 15 + node_modules/semver/LICENSE 2 | 15 + node_modules/semver/README 2.md | 654 ++ node_modules/semver/README.md | 664 ++ node_modules/semver/bin/semver.js | 191 + node_modules/semver/classes/comparator.js | 143 + node_modules/semver/classes/index.js | 7 + node_modules/semver/classes/range.js | 556 + node_modules/semver/classes/semver.js | 319 + node_modules/semver/functions/clean.js | 8 + node_modules/semver/functions/cmp.js | 54 + node_modules/semver/functions/coerce.js | 62 + .../semver/functions/compare-build.js | 9 + .../semver/functions/compare-loose.js | 5 + node_modules/semver/functions/compare.js | 7 + node_modules/semver/functions/diff.js | 60 + node_modules/semver/functions/eq.js | 5 + node_modules/semver/functions/gt.js | 5 + node_modules/semver/functions/gte.js | 5 + node_modules/semver/functions/inc.js | 21 + node_modules/semver/functions/lt.js | 5 + node_modules/semver/functions/lte.js | 5 + node_modules/semver/functions/major.js | 5 + node_modules/semver/functions/minor.js | 5 + node_modules/semver/functions/neq.js | 5 + node_modules/semver/functions/parse.js | 18 + node_modules/semver/functions/patch.js | 5 + node_modules/semver/functions/prerelease.js | 8 + node_modules/semver/functions/rcompare.js | 5 + node_modules/semver/functions/rsort.js | 5 + node_modules/semver/functions/satisfies.js | 12 + node_modules/semver/functions/sort.js | 5 + node_modules/semver/functions/valid.js | 8 + node_modules/semver/index 2.js | 89 + node_modules/semver/index.js | 91 + node_modules/semver/internal/constants.js | 37 + node_modules/semver/internal/debug.js | 11 + node_modules/semver/internal/identifiers.js | 25 + node_modules/semver/internal/lrucache.js | 42 + node_modules/semver/internal/parse-options.js | 17 + node_modules/semver/internal/re.js | 223 + node_modules/semver/package 2.json | 77 + node_modules/semver/package.json | 78 + node_modules/semver/preload 2.js | 2 + node_modules/semver/preload.js | 4 + node_modules/semver/range 2.bnf | 16 + node_modules/semver/range.bnf | 16 + node_modules/semver/ranges/gtr.js | 6 + node_modules/semver/ranges/intersects.js | 9 + node_modules/semver/ranges/ltr.js | 6 + node_modules/semver/ranges/max-satisfying.js | 27 + node_modules/semver/ranges/min-satisfying.js | 26 + node_modules/semver/ranges/min-version.js | 63 + node_modules/semver/ranges/outside.js | 82 + node_modules/semver/ranges/simplify.js | 49 + node_modules/semver/ranges/subset.js | 249 + node_modules/semver/ranges/to-comparators.js | 10 + node_modules/semver/ranges/valid.js | 13 + node_modules/send/HISTORY.md | 580 + node_modules/send/LICENSE | 23 + node_modules/send/README.md | 317 + node_modules/send/index.js | 997 ++ node_modules/send/package.json | 60 + node_modules/setprototypeof/LICENSE | 13 + node_modules/setprototypeof/README.md | 31 + node_modules/setprototypeof/index.d.ts | 2 + node_modules/setprototypeof/index.js | 17 + node_modules/setprototypeof/package.json | 38 + node_modules/setprototypeof/test/index.js | 24 + node_modules/slash/index 2.js | 11 + node_modules/slash/index.d.ts | 25 + node_modules/slash/index.js | 11 + node_modules/slash/license | 9 + node_modules/slash/package 2.json | 33 + node_modules/slash/package.json | 35 + node_modules/slash/readme 2.md | 44 + node_modules/slash/readme.md | 44 + node_modules/slugify/CHANGELOG.md | 94 + node_modules/slugify/LICENSE | 21 + node_modules/slugify/README.md | 98 + node_modules/slugify/package.json | 42 + node_modules/slugify/slugify.d.ts | 24 + node_modules/slugify/slugify.js | 69 + node_modules/sprintf-js/.npmignore | 1 + node_modules/sprintf-js/LICENSE | 24 + node_modules/sprintf-js/README.md | 88 + node_modules/sprintf-js/bower.json | 14 + node_modules/sprintf-js/demo/angular.html | 20 + .../sprintf-js/dist/angular-sprintf.min.js | 4 + .../dist/angular-sprintf.min.js.map | 1 + .../sprintf-js/dist/angular-sprintf.min.map | 1 + node_modules/sprintf-js/dist/sprintf.min.js | 4 + .../sprintf-js/dist/sprintf.min.js.map | 1 + node_modules/sprintf-js/dist/sprintf.min.map | 1 + node_modules/sprintf-js/gruntfile.js | 36 + node_modules/sprintf-js/package.json | 22 + .../sprintf-js/src/angular-sprintf.js | 18 + node_modules/sprintf-js/src/sprintf.js | 208 + node_modules/sprintf-js/test/test.js | 82 + node_modules/ssri/LICENSE 2.md | 16 + node_modules/ssri/LICENSE.md | 16 + node_modules/ssri/README 2.md | 528 + node_modules/ssri/README.md | 528 + node_modules/ssri/lib/index.js | 580 + node_modules/ssri/package 2.json | 52 + node_modules/ssri/package.json | 66 + node_modules/statuses/HISTORY.md | 82 + node_modules/statuses/LICENSE | 23 + node_modules/statuses/README.md | 136 + node_modules/statuses/codes.json | 65 + node_modules/statuses/index.js | 146 + node_modules/statuses/package.json | 49 + node_modules/strip-bom-string/LICENSE | 21 + node_modules/strip-bom-string/README.md | 66 + node_modules/strip-bom-string/index.js | 15 + node_modules/strip-bom-string/package.json | 60 + node_modules/tinyglobby/LICENSE | 21 + node_modules/tinyglobby/README.md | 72 + node_modules/tinyglobby/dist/index.d.mts | 46 + node_modules/tinyglobby/dist/index.d.ts | 46 + node_modules/tinyglobby/dist/index.js | 267 + node_modules/tinyglobby/dist/index.mjs | 240 + .../tinyglobby/node_modules/fdir/LICENSE | 7 + .../tinyglobby/node_modules/fdir/README.md | 91 + .../node_modules/fdir/dist/api/async.d.ts | 3 + .../node_modules/fdir/dist/api/async.js | 19 + .../node_modules/fdir/dist/api/counter.d.ts | 12 + .../node_modules/fdir/dist/api/counter.js | 27 + .../fdir/dist/api/functions/get-array.d.ts | 3 + .../fdir/dist/api/functions/get-array.js | 13 + .../fdir/dist/api/functions/group-files.d.ts | 3 + .../fdir/dist/api/functions/group-files.js | 11 + .../dist/api/functions/invoke-callback.d.ts | 3 + .../dist/api/functions/invoke-callback.js | 57 + .../fdir/dist/api/functions/join-path.d.ts | 5 + .../fdir/dist/api/functions/join-path.js | 36 + .../dist/api/functions/push-directory.d.ts | 3 + .../fdir/dist/api/functions/push-directory.js | 37 + .../fdir/dist/api/functions/push-file.d.ts | 3 + .../fdir/dist/api/functions/push-file.js | 33 + .../dist/api/functions/resolve-symlink.d.ts | 5 + .../dist/api/functions/resolve-symlink.js | 67 + .../dist/api/functions/walk-directory.d.ts | 5 + .../fdir/dist/api/functions/walk-directory.js | 40 + .../node_modules/fdir/dist/api/queue.d.ts | 15 + .../node_modules/fdir/dist/api/queue.js | 29 + .../node_modules/fdir/dist/api/sync.d.ts | 2 + .../node_modules/fdir/dist/api/sync.js | 9 + .../node_modules/fdir/dist/api/walker.d.ts | 18 + .../node_modules/fdir/dist/api/walker.js | 129 + .../fdir/dist/builder/api-builder.d.ts | 9 + .../fdir/dist/builder/api-builder.js | 23 + .../node_modules/fdir/dist/builder/index.d.ts | 41 + .../node_modules/fdir/dist/builder/index.js | 136 + .../node_modules/fdir/dist/index.cjs | 572 + .../node_modules/fdir/dist/index.d.cts | 134 + .../node_modules/fdir/dist/index.d.mts | 134 + .../node_modules/fdir/dist/index.d.ts | 4 + .../node_modules/fdir/dist/index.js | 20 + .../node_modules/fdir/dist/index.mjs | 554 + .../node_modules/fdir/dist/types.d.ts | 61 + .../node_modules/fdir/dist/types.js | 2 + .../node_modules/fdir/dist/utils.d.ts | 9 + .../node_modules/fdir/dist/utils.js | 37 + .../tinyglobby/node_modules/fdir/package.json | 90 + .../tinyglobby/node_modules/picomatch/LICENSE | 21 + .../node_modules/picomatch/README.md | 738 ++ .../node_modules/picomatch/index.js | 17 + .../node_modules/picomatch/lib/constants.js | 179 + .../node_modules/picomatch/lib/parse.js | 1085 ++ .../node_modules/picomatch/lib/picomatch.js | 341 + .../node_modules/picomatch/lib/scan.js | 391 + .../node_modules/picomatch/lib/utils.js | 72 + .../node_modules/picomatch/package.json | 83 + .../node_modules/picomatch/posix.js | 3 + node_modules/tinyglobby/package.json | 65 + node_modules/to-regex-range/LICENSE | 21 + node_modules/to-regex-range/README.md | 305 + node_modules/to-regex-range/index.js | 288 + node_modules/to-regex-range/package.json | 88 + node_modules/toidentifier/HISTORY.md | 9 + node_modules/toidentifier/LICENSE | 21 + node_modules/toidentifier/README.md | 61 + node_modules/toidentifier/index.js | 32 + node_modules/toidentifier/package.json | 38 + node_modules/uc.micro/LICENSE 2.txt | 20 + node_modules/uc.micro/LICENSE.txt | 20 + node_modules/uc.micro/README 2.md | 14 + node_modules/uc.micro/README.md | 14 + node_modules/uc.micro/build/index.cjs.js | 20 + node_modules/uc.micro/categories/Cc/regex.mjs | 1 + node_modules/uc.micro/categories/Cf/regex.mjs | 1 + node_modules/uc.micro/categories/P/regex.mjs | 1 + node_modules/uc.micro/categories/S/regex.mjs | 1 + node_modules/uc.micro/categories/Z/regex.mjs | 1 + node_modules/uc.micro/index.mjs | 8 + node_modules/uc.micro/package 2.json | 21 + node_modules/uc.micro/package.json | 37 + .../uc.micro/properties/Any/regex.mjs | 1 + node_modules/unpipe/HISTORY.md | 4 + node_modules/unpipe/LICENSE | 22 + node_modules/unpipe/README.md | 43 + node_modules/unpipe/index.js | 69 + node_modules/unpipe/package.json | 27 + node_modules/urlpattern-polyfill/LICENSE | 19 + node_modules/urlpattern-polyfill/README.md | 242 + .../urlpattern-polyfill/dist/index.d.ts | 9 + .../urlpattern-polyfill/dist/types.d.ts | 49 + .../urlpattern-polyfill/dist/urlpattern.cjs | 1 + .../urlpattern-polyfill/dist/urlpattern.js | 1 + node_modules/urlpattern-polyfill/index.cjs | 7 + node_modules/urlpattern-polyfill/index.js | 7 + node_modules/urlpattern-polyfill/package.json | 149 + node_modules/ws/LICENSE | 20 + node_modules/ws/LICENSE 2 | 20 + node_modules/ws/README 2.md | 548 + node_modules/ws/README.md | 548 + node_modules/ws/browser 2.js | 8 + node_modules/ws/browser.js | 8 + node_modules/ws/index 2.js | 13 + node_modules/ws/index.js | 13 + node_modules/ws/lib/buffer-util.js | 131 + node_modules/ws/lib/constants.js | 18 + node_modules/ws/lib/event-target.js | 292 + node_modules/ws/lib/extension.js | 203 + node_modules/ws/lib/limiter.js | 55 + node_modules/ws/lib/permessage-deflate.js | 528 + node_modules/ws/lib/receiver.js | 706 ++ node_modules/ws/lib/sender.js | 602 ++ node_modules/ws/lib/stream.js | 161 + node_modules/ws/lib/subprotocol.js | 62 + node_modules/ws/lib/validation.js | 152 + node_modules/ws/lib/websocket-server.js | 550 + node_modules/ws/lib/websocket.js | 1388 +++ node_modules/ws/package 2.json | 69 + node_modules/ws/package.json | 69 + node_modules/ws/wrapper 2.mjs | 8 + node_modules/ws/wrapper.mjs | 8 + package-lock.json | 1568 +++ package.json | 17 + src/_includes/base.njk | 20 + src/css/style.css | 176 + src/index.md | 17 + static/fonts/b612-regular.ttf | Bin 142728 -> 0 bytes static/images/Twitter Banner.psd | Bin 291004 -> 0 bytes static/images/dns-witch-social-logo.png | Bin 28247 -> 0 bytes static/images/icon.svg | 31 - static/images/twitter_banner.png | Bin 37391 -> 0 bytes static/images/undraw_link_shortener_mvf6.svg | 1 - .../witch-svgrepo-com-svg-background.png | Bin 25175 -> 0 bytes .../witch-svgrepo-com-svg-background.svg | 50 - static/images/witch-svgrepo-com.svg | 73 - themes/juice/.gitignore | 3 - themes/juice/README.md | 111 - themes/juice/config.toml | 23 - themes/juice/content/_index.md | 114 - themes/juice/content/about.md | 25 - themes/juice/content/changelog.md | 62 - themes/juice/content/cpp-search-extension.png | Bin 144487 -> 0 bytes themes/juice/content/favicon.ico | Bin 15406 -> 0 bytes themes/juice/content/go-search-extension.png | Bin 273700 -> 0 bytes themes/juice/content/juice.svg | 48 - .../juice/content/rust-search-extension.png | Bin 615609 -> 0 bytes themes/juice/content/showcases.md | 44 - themes/juice/sass/_markdown.scss | 45 - themes/juice/sass/_text.scss | 39 - themes/juice/sass/_ultility.scss | 13 - themes/juice/sass/juice.scss | 212 - themes/juice/screenshot.png | Bin 153265 -> 0 bytes themes/juice/static/fonts/b612-regular.ttf | Bin 142728 -> 0 bytes themes/juice/static/normalize.css | 349 - themes/juice/templates/_macros.html | 20 - themes/juice/templates/_variables.html | 16 - themes/juice/templates/index.html | 147 - themes/juice/templates/page.html | 15 - themes/juice/templates/shortcodes/issue.html | 1 - themes/juice/theme.toml | 12 - themes/juice/vercel.json | 10 - 1908 files changed, 346679 insertions(+), 1604 deletions(-) create mode 100644 .eleventy.js delete mode 100644 config.toml delete mode 100644 content/_index.fr.md delete mode 100644 content/_index.md create mode 120000 node_modules/.bin/acorn create mode 120000 node_modules/.bin/acorn 2 create mode 120000 node_modules/.bin/eleventy create mode 120000 node_modules/.bin/eleventy 2 create mode 120000 node_modules/.bin/eleventy-dev-server create mode 120000 node_modules/.bin/eleventy-dev-server 2 create mode 120000 node_modules/.bin/errno create mode 120000 node_modules/.bin/errno 2 create mode 120000 node_modules/.bin/esparse create mode 120000 node_modules/.bin/esvalidate create mode 120000 node_modules/.bin/js-yaml create mode 120000 node_modules/.bin/liquid create mode 120000 node_modules/.bin/liquid 2 create mode 120000 node_modules/.bin/liquidjs create mode 120000 node_modules/.bin/liquidjs 2 create mode 120000 node_modules/.bin/markdown-it create mode 120000 node_modules/.bin/markdown-it 2 create mode 120000 node_modules/.bin/mime create mode 120000 node_modules/.bin/nunjucks-precompile create mode 120000 node_modules/.bin/semver create mode 120000 node_modules/.bin/semver 2 create mode 100644 node_modules/.package-lock.json create mode 100644 node_modules/@11ty/dependency-tree-esm/.github/workflows/ci.yml create mode 100644 node_modules/@11ty/dependency-tree-esm/.github/workflows/release.yml create mode 100644 node_modules/@11ty/dependency-tree-esm/LICENSE create mode 100644 node_modules/@11ty/dependency-tree-esm/README.md create mode 100644 node_modules/@11ty/dependency-tree-esm/main.js create mode 100644 node_modules/@11ty/dependency-tree-esm/package.json create mode 100644 node_modules/@11ty/dependency-tree-esm/test/stubs/circular-child.js create mode 100644 node_modules/@11ty/dependency-tree-esm/test/stubs/circular-parent.js create mode 100644 node_modules/@11ty/dependency-tree-esm/test/stubs/circular-self.js create mode 100644 node_modules/@11ty/dependency-tree-esm/test/stubs/empty.js create mode 100644 node_modules/@11ty/dependency-tree-esm/test/stubs/file.js create mode 100644 node_modules/@11ty/dependency-tree-esm/test/stubs/import-attributes.js create mode 100644 node_modules/@11ty/dependency-tree-esm/test/stubs/imported-secondary.js create mode 100644 node_modules/@11ty/dependency-tree-esm/test/stubs/imported.js create mode 100644 node_modules/@11ty/dependency-tree-esm/test/stubs/imported.json create mode 100644 node_modules/@11ty/dependency-tree-esm/test/stubs/nested-grandchild.js create mode 100644 node_modules/@11ty/dependency-tree-esm/test/stubs/nested.js create mode 100644 node_modules/@11ty/dependency-tree-esm/test/test.js create mode 100644 node_modules/@11ty/dependency-tree/LICENSE create mode 100644 node_modules/@11ty/dependency-tree/LICENSE 2 create mode 100644 node_modules/@11ty/dependency-tree/README 2.md create mode 100644 node_modules/@11ty/dependency-tree/README.md create mode 100644 node_modules/@11ty/dependency-tree/main 2.js create mode 100644 node_modules/@11ty/dependency-tree/main.js create mode 100644 node_modules/@11ty/dependency-tree/package 2.json create mode 100644 node_modules/@11ty/dependency-tree/package.json create mode 100644 node_modules/@11ty/eleventy-dev-server/README 2.md create mode 100644 node_modules/@11ty/eleventy-dev-server/README.md create mode 100644 node_modules/@11ty/eleventy-dev-server/cli 2.js create mode 100644 node_modules/@11ty/eleventy-dev-server/cli.js create mode 100644 node_modules/@11ty/eleventy-dev-server/client/reload-client.js create mode 100755 node_modules/@11ty/eleventy-dev-server/cmd 2.js create mode 100755 node_modules/@11ty/eleventy-dev-server/cmd.js create mode 100644 node_modules/@11ty/eleventy-dev-server/package 2.json create mode 100644 node_modules/@11ty/eleventy-dev-server/package.json create mode 100644 node_modules/@11ty/eleventy-dev-server/server 2.js create mode 100644 node_modules/@11ty/eleventy-dev-server/server.js create mode 100644 node_modules/@11ty/eleventy-dev-server/server/ipAddress.js create mode 100644 node_modules/@11ty/eleventy-dev-server/server/wrapResponse.js create mode 100644 node_modules/@11ty/eleventy-plugin-bundle/README.md create mode 100644 node_modules/@11ty/eleventy-plugin-bundle/eleventy.bundle.js create mode 100644 node_modules/@11ty/eleventy-plugin-bundle/package.json create mode 100644 node_modules/@11ty/eleventy-plugin-bundle/src/BundleFileOutput.js create mode 100644 node_modules/@11ty/eleventy-plugin-bundle/src/CodeManager.js create mode 100644 node_modules/@11ty/eleventy-plugin-bundle/src/OutOfOrderRender.js create mode 100644 node_modules/@11ty/eleventy-plugin-bundle/src/bundlePlucker.js create mode 100644 node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.bundleManagers.js create mode 100644 node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.pruneEmptyBundles.js create mode 100644 node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.shortcodes.js create mode 100644 node_modules/@11ty/eleventy-utils/LICENSE create mode 100644 node_modules/@11ty/eleventy-utils/LICENSE 2 create mode 100644 node_modules/@11ty/eleventy-utils/README 2.md create mode 100644 node_modules/@11ty/eleventy-utils/README.md create mode 100644 node_modules/@11ty/eleventy-utils/index 2.js create mode 100644 node_modules/@11ty/eleventy-utils/index.js create mode 100644 node_modules/@11ty/eleventy-utils/package 2.json create mode 100644 node_modules/@11ty/eleventy-utils/package.json create mode 100644 node_modules/@11ty/eleventy-utils/src/Buffer.js create mode 100644 node_modules/@11ty/eleventy-utils/src/CreateHash.js create mode 100644 node_modules/@11ty/eleventy-utils/src/DateCompare.js create mode 100644 node_modules/@11ty/eleventy-utils/src/HashTypes.js create mode 100644 node_modules/@11ty/eleventy-utils/src/IsPlainObject.js create mode 100644 node_modules/@11ty/eleventy-utils/src/Merge.js create mode 100644 node_modules/@11ty/eleventy-utils/src/TemplatePath.js create mode 100644 node_modules/@11ty/eleventy-utils/src/Url.js create mode 100644 node_modules/@11ty/eleventy-utils/src/lib-sha256.js create mode 100644 node_modules/@11ty/eleventy/CODE_OF_CONDUCT 2.md create mode 100644 node_modules/@11ty/eleventy/CODE_OF_CONDUCT.md create mode 100644 node_modules/@11ty/eleventy/LICENSE create mode 100644 node_modules/@11ty/eleventy/LICENSE 2 create mode 100644 node_modules/@11ty/eleventy/README 2.md create mode 100644 node_modules/@11ty/eleventy/README.md create mode 100644 node_modules/@11ty/eleventy/SECURITY 2.md create mode 100644 node_modules/@11ty/eleventy/SECURITY.md create mode 100755 node_modules/@11ty/eleventy/cmd.cjs create mode 120000 node_modules/@11ty/eleventy/node_modules/.bin/js-yaml create mode 100644 node_modules/@11ty/eleventy/node_modules/argparse/CHANGELOG.md create mode 100644 node_modules/@11ty/eleventy/node_modules/argparse/LICENSE create mode 100644 node_modules/@11ty/eleventy/node_modules/argparse/README.md create mode 100644 node_modules/@11ty/eleventy/node_modules/argparse/argparse.js create mode 100644 node_modules/@11ty/eleventy/node_modules/argparse/lib/sub.js create mode 100644 node_modules/@11ty/eleventy/node_modules/argparse/lib/textwrap.js create mode 100644 node_modules/@11ty/eleventy/node_modules/argparse/package.json create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/LICENSE create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/decode.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/decode.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/package.json create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.d.ts.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.js.map create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/dist/esm/package.json create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/escape.d.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/escape.js create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/package.json create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/readme.md create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/src/decode-codepoint.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/src/decode.spec.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/src/decode.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/src/encode.spec.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/src/encode.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/src/escape.spec.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/src/escape.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/src/generated/.eslintrc.json create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/src/generated/decode-data-html.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/src/generated/decode-data-xml.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/src/generated/encode-html.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/src/index.spec.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/entities/src/index.ts create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/CHANGELOG.md create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/LICENSE create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/README.md create mode 100755 node_modules/@11ty/eleventy/node_modules/js-yaml/bin/js-yaml.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/dist/js-yaml.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/dist/js-yaml.min.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/dist/js-yaml.mjs create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/index.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/common.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/dumper.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/exception.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/loader.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/core.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/default.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/failsafe.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/json.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/snippet.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/binary.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/bool.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/float.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/int.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/map.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/merge.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/null.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/omap.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/pairs.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/seq.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/set.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/str.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/timestamp.js create mode 100644 node_modules/@11ty/eleventy/node_modules/js-yaml/package.json create mode 100644 node_modules/@11ty/eleventy/node_modules/picomatch/LICENSE create mode 100644 node_modules/@11ty/eleventy/node_modules/picomatch/README.md create mode 100644 node_modules/@11ty/eleventy/node_modules/picomatch/index.js create mode 100644 node_modules/@11ty/eleventy/node_modules/picomatch/lib/constants.js create mode 100644 node_modules/@11ty/eleventy/node_modules/picomatch/lib/parse.js create mode 100644 node_modules/@11ty/eleventy/node_modules/picomatch/lib/picomatch.js create mode 100644 node_modules/@11ty/eleventy/node_modules/picomatch/lib/scan.js create mode 100644 node_modules/@11ty/eleventy/node_modules/picomatch/lib/utils.js create mode 100644 node_modules/@11ty/eleventy/node_modules/picomatch/package.json create mode 100644 node_modules/@11ty/eleventy/node_modules/picomatch/posix.js create mode 100755 node_modules/@11ty/eleventy/package 2.json create mode 100644 node_modules/@11ty/eleventy/package.json create mode 100644 node_modules/@11ty/eleventy/src/Benchmark/Benchmark.js create mode 100644 node_modules/@11ty/eleventy/src/Benchmark/BenchmarkGroup.js create mode 100644 node_modules/@11ty/eleventy/src/Benchmark/BenchmarkManager.js create mode 100644 node_modules/@11ty/eleventy/src/Data/ComputedData.js create mode 100644 node_modules/@11ty/eleventy/src/Data/ComputedDataProxy.js create mode 100644 node_modules/@11ty/eleventy/src/Data/ComputedDataQueue.js create mode 100644 node_modules/@11ty/eleventy/src/Data/ComputedDataTemplateString.js create mode 100644 node_modules/@11ty/eleventy/src/Data/TemplateData.js create mode 100644 node_modules/@11ty/eleventy/src/Data/TemplateDataInitialGlobalData.js create mode 100644 node_modules/@11ty/eleventy/src/Eleventy.js create mode 100644 node_modules/@11ty/eleventy/src/EleventyCommonJs.cjs create mode 100644 node_modules/@11ty/eleventy/src/EleventyExtensionMap.js create mode 100644 node_modules/@11ty/eleventy/src/EleventyFiles.js create mode 100644 node_modules/@11ty/eleventy/src/EleventyServe.js create mode 100755 node_modules/@11ty/eleventy/src/EleventyWatch.js create mode 100644 node_modules/@11ty/eleventy/src/EleventyWatchTargets.js create mode 100644 node_modules/@11ty/eleventy/src/Engines/Custom.js create mode 100644 node_modules/@11ty/eleventy/src/Engines/FrontMatter/JavaScript.js create mode 100644 node_modules/@11ty/eleventy/src/Engines/Html.js create mode 100644 node_modules/@11ty/eleventy/src/Engines/JavaScript.js create mode 100644 node_modules/@11ty/eleventy/src/Engines/Liquid.js create mode 100644 node_modules/@11ty/eleventy/src/Engines/Markdown.js create mode 100755 node_modules/@11ty/eleventy/src/Engines/Nunjucks.js create mode 100644 node_modules/@11ty/eleventy/src/Engines/TemplateEngine.js create mode 100644 node_modules/@11ty/eleventy/src/Engines/TemplateEngineManager.js create mode 100644 node_modules/@11ty/eleventy/src/Engines/Util/ContextAugmenter.js create mode 100644 node_modules/@11ty/eleventy/src/Errors/DuplicatePermalinkOutputError.js create mode 100644 node_modules/@11ty/eleventy/src/Errors/EleventyBaseError.js create mode 100644 node_modules/@11ty/eleventy/src/Errors/EleventyErrorHandler.js create mode 100644 node_modules/@11ty/eleventy/src/Errors/EleventyErrorUtil.js create mode 100644 node_modules/@11ty/eleventy/src/Errors/TemplateContentPrematureUseError.js create mode 100644 node_modules/@11ty/eleventy/src/Errors/TemplateContentUnrenderedTemplateError.js create mode 100644 node_modules/@11ty/eleventy/src/Errors/UsingCircularTemplateContentReferenceError.js create mode 100644 node_modules/@11ty/eleventy/src/EventBus.js create mode 100644 node_modules/@11ty/eleventy/src/FileSystemSearch.js create mode 100644 node_modules/@11ty/eleventy/src/Filters/GetCollectionItem.js create mode 100644 node_modules/@11ty/eleventy/src/Filters/GetCollectionItemIndex.js create mode 100644 node_modules/@11ty/eleventy/src/Filters/GetLocaleCollectionItem.js create mode 100644 node_modules/@11ty/eleventy/src/Filters/Slug.js create mode 100644 node_modules/@11ty/eleventy/src/Filters/Slugify.js create mode 100644 node_modules/@11ty/eleventy/src/Filters/Url.js create mode 100644 node_modules/@11ty/eleventy/src/GlobalDependencyMap.js create mode 100644 node_modules/@11ty/eleventy/src/LayoutCache.js create mode 100644 node_modules/@11ty/eleventy/src/Plugins/HtmlBasePlugin.js create mode 100644 node_modules/@11ty/eleventy/src/Plugins/HtmlRelativeCopyPlugin.js create mode 100644 node_modules/@11ty/eleventy/src/Plugins/I18nPlugin.js create mode 100644 node_modules/@11ty/eleventy/src/Plugins/IdAttributePlugin.js create mode 100644 node_modules/@11ty/eleventy/src/Plugins/InputPathToUrl.js create mode 100755 node_modules/@11ty/eleventy/src/Plugins/Pagination.js create mode 100644 node_modules/@11ty/eleventy/src/Plugins/RenderPlugin.js create mode 100755 node_modules/@11ty/eleventy/src/Template.js create mode 100644 node_modules/@11ty/eleventy/src/TemplateBehavior.js create mode 100755 node_modules/@11ty/eleventy/src/TemplateCollection.js create mode 100644 node_modules/@11ty/eleventy/src/TemplateConfig.js create mode 100644 node_modules/@11ty/eleventy/src/TemplateContent.js create mode 100644 node_modules/@11ty/eleventy/src/TemplateFileSlug.js create mode 100644 node_modules/@11ty/eleventy/src/TemplateGlob.js create mode 100644 node_modules/@11ty/eleventy/src/TemplateLayout.js create mode 100644 node_modules/@11ty/eleventy/src/TemplateLayoutPathResolver.js create mode 100644 node_modules/@11ty/eleventy/src/TemplateMap.js create mode 100644 node_modules/@11ty/eleventy/src/TemplatePassthrough.js create mode 100644 node_modules/@11ty/eleventy/src/TemplatePassthroughManager.js create mode 100644 node_modules/@11ty/eleventy/src/TemplatePermalink.js create mode 100644 node_modules/@11ty/eleventy/src/TemplateRender.js create mode 100755 node_modules/@11ty/eleventy/src/TemplateWriter.js create mode 100644 node_modules/@11ty/eleventy/src/UserConfig.js create mode 100644 node_modules/@11ty/eleventy/src/Util/ArrayUtil.js create mode 100644 node_modules/@11ty/eleventy/src/Util/AsyncEventEmitter.js create mode 100644 node_modules/@11ty/eleventy/src/Util/Compatibility.js create mode 100644 node_modules/@11ty/eleventy/src/Util/ConsoleLogger.js create mode 100644 node_modules/@11ty/eleventy/src/Util/DateGitFirstAdded.js create mode 100644 node_modules/@11ty/eleventy/src/Util/DateGitLastUpdated.js create mode 100644 node_modules/@11ty/eleventy/src/Util/DirContains.js create mode 100644 node_modules/@11ty/eleventy/src/Util/EsmResolver.js create mode 100644 node_modules/@11ty/eleventy/src/Util/EventBusUtil.js create mode 100644 node_modules/@11ty/eleventy/src/Util/ExistsCache.js create mode 100644 node_modules/@11ty/eleventy/src/Util/FilePathUtil.js create mode 100644 node_modules/@11ty/eleventy/src/Util/FileSystemManager.js create mode 100644 node_modules/@11ty/eleventy/src/Util/GetJavaScriptData.js create mode 100644 node_modules/@11ty/eleventy/src/Util/GlobMatcher.js create mode 100644 node_modules/@11ty/eleventy/src/Util/GlobRemap.js create mode 100644 node_modules/@11ty/eleventy/src/Util/HtmlRelativeCopy.js create mode 100644 node_modules/@11ty/eleventy/src/Util/HtmlTransformer.js create mode 100644 node_modules/@11ty/eleventy/src/Util/ImportJsonSync.js create mode 100644 node_modules/@11ty/eleventy/src/Util/IsAsyncFunction.js create mode 100644 node_modules/@11ty/eleventy/src/Util/JavaScriptDependencies.js create mode 100644 node_modules/@11ty/eleventy/src/Util/MemoizeFunction.js create mode 100644 node_modules/@11ty/eleventy/src/Util/Objects/DeepFreeze.js create mode 100644 node_modules/@11ty/eleventy/src/Util/Objects/ObjectFilter.js create mode 100644 node_modules/@11ty/eleventy/src/Util/Objects/ProxyWrap.js create mode 100644 node_modules/@11ty/eleventy/src/Util/Objects/SampleModule.mjs create mode 100644 node_modules/@11ty/eleventy/src/Util/Objects/Sortable.js create mode 100644 node_modules/@11ty/eleventy/src/Util/Objects/Unique.js create mode 100644 node_modules/@11ty/eleventy/src/Util/PassthroughCopyBehaviorCheck.js create mode 100644 node_modules/@11ty/eleventy/src/Util/PathNormalizer.js create mode 100644 node_modules/@11ty/eleventy/src/Util/PathPrefixer.js create mode 100644 node_modules/@11ty/eleventy/src/Util/Pluralize.js create mode 100644 node_modules/@11ty/eleventy/src/Util/ProjectDirectories.js create mode 100644 node_modules/@11ty/eleventy/src/Util/ProjectTemplateFormats.js create mode 100644 node_modules/@11ty/eleventy/src/Util/PromiseUtil.js create mode 100644 node_modules/@11ty/eleventy/src/Util/Require.js create mode 100644 node_modules/@11ty/eleventy/src/Util/ReservedData.js create mode 100644 node_modules/@11ty/eleventy/src/Util/SetUnion.js create mode 100644 node_modules/@11ty/eleventy/src/Util/SpawnAsync.js create mode 100644 node_modules/@11ty/eleventy/src/Util/TemplateDepGraph.js create mode 100644 node_modules/@11ty/eleventy/src/Util/TransformsUtil.js create mode 100644 node_modules/@11ty/eleventy/src/Util/ValidUrl.js create mode 100644 node_modules/@11ty/eleventy/src/defaultConfig.js create mode 100644 node_modules/@11ty/eleventy/tsconfig.json create mode 100644 node_modules/@11ty/lodash-custom/README.md create mode 100644 node_modules/@11ty/lodash-custom/lodash.custom.js create mode 100644 node_modules/@11ty/lodash-custom/package.json create mode 100644 node_modules/@11ty/posthtml-urls/LICENSE create mode 100644 node_modules/@11ty/posthtml-urls/README.md create mode 100644 node_modules/@11ty/posthtml-urls/lib/defaultOptions.js create mode 100644 node_modules/@11ty/posthtml-urls/lib/index.js create mode 100644 node_modules/@11ty/posthtml-urls/package.json create mode 100644 node_modules/@11ty/recursive-copy/README.md create mode 100644 node_modules/@11ty/recursive-copy/index.d.ts create mode 100644 node_modules/@11ty/recursive-copy/index.js create mode 100644 node_modules/@11ty/recursive-copy/lib/copy.js create mode 100644 node_modules/@11ty/recursive-copy/package.json create mode 100644 node_modules/@sindresorhus/slugify/index 2.js create mode 100644 node_modules/@sindresorhus/slugify/index.d 2.ts create mode 100644 node_modules/@sindresorhus/slugify/index.d.ts create mode 100644 node_modules/@sindresorhus/slugify/index.js create mode 100644 node_modules/@sindresorhus/slugify/license create mode 100644 node_modules/@sindresorhus/slugify/license 2 create mode 100644 node_modules/@sindresorhus/slugify/overridable-replacements 2.js create mode 100644 node_modules/@sindresorhus/slugify/overridable-replacements.js create mode 100644 node_modules/@sindresorhus/slugify/package 2.json create mode 100644 node_modules/@sindresorhus/slugify/package.json create mode 100644 node_modules/@sindresorhus/slugify/readme 2.md create mode 100644 node_modules/@sindresorhus/slugify/readme.md create mode 100644 node_modules/@sindresorhus/transliterate/index 2.js create mode 100644 node_modules/@sindresorhus/transliterate/index.d 2.ts create mode 100644 node_modules/@sindresorhus/transliterate/index.d.ts create mode 100644 node_modules/@sindresorhus/transliterate/index.js create mode 100644 node_modules/@sindresorhus/transliterate/license create mode 100644 node_modules/@sindresorhus/transliterate/license 2 create mode 100644 node_modules/@sindresorhus/transliterate/package 2.json create mode 100644 node_modules/@sindresorhus/transliterate/package.json create mode 100644 node_modules/@sindresorhus/transliterate/readme 2.md create mode 100644 node_modules/@sindresorhus/transliterate/readme.md create mode 100644 node_modules/@sindresorhus/transliterate/replacements 2.js create mode 100644 node_modules/@sindresorhus/transliterate/replacements.js create mode 100644 node_modules/a-sync-waterfall/LICENSE create mode 100644 node_modules/a-sync-waterfall/README.md create mode 100644 node_modules/a-sync-waterfall/index.js create mode 100644 node_modules/a-sync-waterfall/package.json create mode 100644 node_modules/a-sync-waterfall/test.js create mode 100644 node_modules/acorn-walk/CHANGELOG.md create mode 100644 node_modules/acorn-walk/LICENSE create mode 100644 node_modules/acorn-walk/README.md create mode 100644 node_modules/acorn-walk/dist/walk.d.mts create mode 100644 node_modules/acorn-walk/dist/walk.d.ts create mode 100644 node_modules/acorn-walk/dist/walk.js create mode 100644 node_modules/acorn-walk/dist/walk.mjs create mode 100644 node_modules/acorn-walk/package.json create mode 100644 node_modules/acorn/CHANGELOG 2.md create mode 100644 node_modules/acorn/CHANGELOG.md create mode 100644 node_modules/acorn/LICENSE create mode 100644 node_modules/acorn/LICENSE 2 create mode 100644 node_modules/acorn/README 2.md create mode 100644 node_modules/acorn/README.md create mode 100755 node_modules/acorn/bin/acorn create mode 100644 node_modules/acorn/dist/acorn.d.mts create mode 100644 node_modules/acorn/dist/acorn.d.ts create mode 100644 node_modules/acorn/dist/acorn.js create mode 100644 node_modules/acorn/dist/acorn.mjs create mode 100644 node_modules/acorn/dist/bin.js create mode 100644 node_modules/acorn/package 2.json create mode 100644 node_modules/acorn/package.json create mode 100644 node_modules/anymatch/LICENSE create mode 100644 node_modules/anymatch/README.md create mode 100644 node_modules/anymatch/index.d.ts create mode 100644 node_modules/anymatch/index.js create mode 100644 node_modules/anymatch/package.json create mode 100644 node_modules/argparse/CHANGELOG.md create mode 100644 node_modules/argparse/LICENSE create mode 100644 node_modules/argparse/README.md create mode 100644 node_modules/argparse/index.js create mode 100644 node_modules/argparse/lib/action.js create mode 100644 node_modules/argparse/lib/action/append.js create mode 100644 node_modules/argparse/lib/action/append/constant.js create mode 100644 node_modules/argparse/lib/action/count.js create mode 100644 node_modules/argparse/lib/action/help.js create mode 100644 node_modules/argparse/lib/action/store.js create mode 100644 node_modules/argparse/lib/action/store/constant.js create mode 100644 node_modules/argparse/lib/action/store/false.js create mode 100644 node_modules/argparse/lib/action/store/true.js create mode 100644 node_modules/argparse/lib/action/subparsers.js create mode 100644 node_modules/argparse/lib/action/version.js create mode 100644 node_modules/argparse/lib/action_container.js create mode 100644 node_modules/argparse/lib/argparse.js create mode 100644 node_modules/argparse/lib/argument/error.js create mode 100644 node_modules/argparse/lib/argument/exclusive.js create mode 100644 node_modules/argparse/lib/argument/group.js create mode 100644 node_modules/argparse/lib/argument_parser.js create mode 100644 node_modules/argparse/lib/const.js create mode 100644 node_modules/argparse/lib/help/added_formatters.js create mode 100644 node_modules/argparse/lib/help/formatter.js create mode 100644 node_modules/argparse/lib/namespace.js create mode 100644 node_modules/argparse/lib/utils.js create mode 100644 node_modules/argparse/package.json create mode 100644 node_modules/array-differ/index 2.js create mode 100644 node_modules/array-differ/index.js create mode 100644 node_modules/array-differ/package 2.json create mode 100644 node_modules/array-differ/package.json create mode 100644 node_modules/array-differ/readme 2.md create mode 100644 node_modules/array-differ/readme.md create mode 100644 node_modules/array-union/index.js create mode 100644 node_modules/array-union/license create mode 100644 node_modules/array-union/package.json create mode 100644 node_modules/array-union/readme.md create mode 100644 node_modules/array-uniq/index.js create mode 100644 node_modules/array-uniq/license create mode 100644 node_modules/array-uniq/package.json create mode 100644 node_modules/array-uniq/readme.md create mode 100644 node_modules/arrify/index 2.js create mode 100644 node_modules/arrify/index.js create mode 100644 node_modules/arrify/license create mode 100644 node_modules/arrify/license 2 create mode 100644 node_modules/arrify/package 2.json create mode 100644 node_modules/arrify/package.json create mode 100644 node_modules/arrify/readme 2.md create mode 100644 node_modules/arrify/readme.md create mode 100644 node_modules/asap/CHANGES.md create mode 100644 node_modules/asap/LICENSE.md create mode 100644 node_modules/asap/README.md create mode 100644 node_modules/asap/asap.js create mode 100644 node_modules/asap/browser-asap.js create mode 100644 node_modules/asap/browser-raw.js create mode 100644 node_modules/asap/package.json create mode 100644 node_modules/asap/raw.js create mode 100644 node_modules/balanced-match/.github/FUNDING.yml create mode 100644 node_modules/balanced-match/LICENSE.md create mode 100644 node_modules/balanced-match/README.md create mode 100644 node_modules/balanced-match/index.js create mode 100644 node_modules/balanced-match/package.json create mode 100644 node_modules/bcp-47-match/index.d.ts create mode 100644 node_modules/bcp-47-match/index.js create mode 100644 node_modules/bcp-47-match/license create mode 100644 node_modules/bcp-47-match/package.json create mode 100644 node_modules/bcp-47-match/readme.md create mode 100644 node_modules/bcp-47-normalize/index.d.ts create mode 100644 node_modules/bcp-47-normalize/index.js create mode 100644 node_modules/bcp-47-normalize/lib/fields.d.ts create mode 100644 node_modules/bcp-47-normalize/lib/fields.js create mode 100644 node_modules/bcp-47-normalize/lib/index.d.ts create mode 100644 node_modules/bcp-47-normalize/lib/index.js create mode 100644 node_modules/bcp-47-normalize/lib/likely.d.ts create mode 100644 node_modules/bcp-47-normalize/lib/likely.js create mode 100644 node_modules/bcp-47-normalize/lib/many.d.ts create mode 100644 node_modules/bcp-47-normalize/lib/many.js create mode 100644 node_modules/bcp-47-normalize/lib/matches.d.ts create mode 100644 node_modules/bcp-47-normalize/lib/matches.js create mode 100644 node_modules/bcp-47-normalize/license create mode 100644 node_modules/bcp-47-normalize/package 2.json create mode 100644 node_modules/bcp-47-normalize/package.json create mode 100644 node_modules/bcp-47-normalize/readme 2.md create mode 100644 node_modules/bcp-47-normalize/readme.md create mode 100644 node_modules/bcp-47/index.d.ts create mode 100644 node_modules/bcp-47/index.js create mode 100644 node_modules/bcp-47/lib/normal.d.ts create mode 100644 node_modules/bcp-47/lib/normal.js create mode 100644 node_modules/bcp-47/lib/parse.d.ts create mode 100644 node_modules/bcp-47/lib/parse.js create mode 100644 node_modules/bcp-47/lib/regular.d.ts create mode 100644 node_modules/bcp-47/lib/regular.js create mode 100644 node_modules/bcp-47/lib/stringify.d.ts create mode 100644 node_modules/bcp-47/lib/stringify.js create mode 100644 node_modules/bcp-47/license create mode 100644 node_modules/bcp-47/package.json create mode 100644 node_modules/bcp-47/readme.md create mode 100644 node_modules/binary-extensions/binary-extensions.json create mode 100644 node_modules/binary-extensions/binary-extensions.json.d.ts create mode 100644 node_modules/binary-extensions/index.d.ts create mode 100644 node_modules/binary-extensions/index.js create mode 100644 node_modules/binary-extensions/license create mode 100644 node_modules/binary-extensions/package.json create mode 100644 node_modules/binary-extensions/readme.md create mode 100644 node_modules/brace-expansion/LICENSE create mode 100644 node_modules/brace-expansion/LICENSE 2 create mode 100644 node_modules/brace-expansion/README 2.md create mode 100644 node_modules/brace-expansion/README.md create mode 100644 node_modules/brace-expansion/index 2.js create mode 100644 node_modules/brace-expansion/index.js create mode 100644 node_modules/brace-expansion/package 2.json create mode 100644 node_modules/brace-expansion/package.json create mode 100644 node_modules/braces/LICENSE create mode 100644 node_modules/braces/README.md create mode 100644 node_modules/braces/index.js create mode 100644 node_modules/braces/lib/compile.js create mode 100644 node_modules/braces/lib/constants.js create mode 100644 node_modules/braces/lib/expand.js create mode 100644 node_modules/braces/lib/parse.js create mode 100644 node_modules/braces/lib/stringify.js create mode 100644 node_modules/braces/lib/utils.js create mode 100644 node_modules/braces/package.json create mode 100644 node_modules/chokidar/LICENSE create mode 100644 node_modules/chokidar/README.md create mode 100644 node_modules/chokidar/index.js create mode 100644 node_modules/chokidar/lib/constants.js create mode 100644 node_modules/chokidar/lib/fsevents-handler.js create mode 100644 node_modules/chokidar/lib/nodefs-handler.js create mode 100644 node_modules/chokidar/package.json create mode 100644 node_modules/chokidar/types/index.d.ts create mode 100644 node_modules/commander/LICENSE create mode 100644 node_modules/commander/Readme.md create mode 100644 node_modules/commander/esm.mjs create mode 100644 node_modules/commander/index.js create mode 100644 node_modules/commander/lib/argument.js create mode 100644 node_modules/commander/lib/command.js create mode 100644 node_modules/commander/lib/error.js create mode 100644 node_modules/commander/lib/help.js create mode 100644 node_modules/commander/lib/option.js create mode 100644 node_modules/commander/lib/suggestSimilar.js create mode 100644 node_modules/commander/package-support.json create mode 100644 node_modules/commander/package.json create mode 100644 node_modules/commander/typings/index.d.ts create mode 100644 node_modules/concat-map/.travis.yml create mode 100644 node_modules/concat-map/LICENSE create mode 100644 node_modules/concat-map/README.markdown create mode 100644 node_modules/concat-map/example/map.js create mode 100644 node_modules/concat-map/index.js create mode 100644 node_modules/concat-map/package.json create mode 100644 node_modules/concat-map/test/map.js create mode 100644 node_modules/debug/LICENSE create mode 100644 node_modules/debug/README.md create mode 100644 node_modules/debug/package.json create mode 100644 node_modules/debug/src/browser.js create mode 100644 node_modules/debug/src/common.js create mode 100644 node_modules/debug/src/index.js create mode 100644 node_modules/debug/src/node.js create mode 100644 node_modules/depd/History.md create mode 100644 node_modules/depd/LICENSE create mode 100644 node_modules/depd/Readme.md create mode 100644 node_modules/depd/index.js create mode 100644 node_modules/depd/lib/browser/index.js create mode 100644 node_modules/depd/package.json create mode 100755 node_modules/dependency-graph/.github/workflows/node.js.yml create mode 100755 node_modules/dependency-graph/CHANGELOG 2.md create mode 100755 node_modules/dependency-graph/CHANGELOG.md create mode 100755 node_modules/dependency-graph/LICENSE create mode 100755 node_modules/dependency-graph/LICENSE 2 create mode 100755 node_modules/dependency-graph/README 2.md create mode 100755 node_modules/dependency-graph/README.md create mode 100755 node_modules/dependency-graph/lib/dep_graph.js create mode 100755 node_modules/dependency-graph/lib/index.d.ts create mode 100755 node_modules/dependency-graph/package 2.json create mode 100755 node_modules/dependency-graph/package.json create mode 100755 node_modules/dependency-graph/specs/dep_graph_spec.js create mode 100644 node_modules/dom-serializer/LICENSE create mode 100644 node_modules/dom-serializer/README.md create mode 100644 node_modules/dom-serializer/lib/esm/foreignNames.d.ts create mode 100644 node_modules/dom-serializer/lib/esm/foreignNames.d.ts.map create mode 100644 node_modules/dom-serializer/lib/esm/foreignNames.js create mode 100644 node_modules/dom-serializer/lib/esm/index.d.ts create mode 100644 node_modules/dom-serializer/lib/esm/index.d.ts.map create mode 100644 node_modules/dom-serializer/lib/esm/index.js create mode 100644 node_modules/dom-serializer/lib/esm/package.json create mode 100644 node_modules/dom-serializer/lib/foreignNames.d.ts create mode 100644 node_modules/dom-serializer/lib/foreignNames.d.ts.map create mode 100644 node_modules/dom-serializer/lib/foreignNames.js create mode 100644 node_modules/dom-serializer/lib/index.d.ts create mode 100644 node_modules/dom-serializer/lib/index.d.ts.map create mode 100644 node_modules/dom-serializer/lib/index.js create mode 100644 node_modules/dom-serializer/node_modules/entities/LICENSE create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/decode.d.ts create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/decode.d.ts.map create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/decode.js create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/decode_codepoint.d.ts create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/decode_codepoint.d.ts.map create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/decode_codepoint.js create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/encode.d.ts create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/encode.d.ts.map create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/encode.js create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/index.d.ts create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/index.d.ts.map create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/index.js create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/maps/decode.json create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/maps/entities.json create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/maps/legacy.json create mode 100644 node_modules/dom-serializer/node_modules/entities/lib/maps/xml.json create mode 100644 node_modules/dom-serializer/node_modules/entities/package.json create mode 100644 node_modules/dom-serializer/node_modules/entities/readme.md create mode 100644 node_modules/dom-serializer/package.json create mode 100644 node_modules/domelementtype/LICENSE create mode 100644 node_modules/domelementtype/lib/esm/index.d.ts create mode 100644 node_modules/domelementtype/lib/esm/index.d.ts.map create mode 100644 node_modules/domelementtype/lib/esm/index.js create mode 100644 node_modules/domelementtype/lib/esm/package.json create mode 100644 node_modules/domelementtype/lib/index.d.ts create mode 100644 node_modules/domelementtype/lib/index.d.ts.map create mode 100644 node_modules/domelementtype/lib/index.js create mode 100644 node_modules/domelementtype/package.json create mode 100644 node_modules/domelementtype/readme.md create mode 100644 node_modules/domhandler/LICENSE create mode 100644 node_modules/domhandler/lib/index.d.ts create mode 100644 node_modules/domhandler/lib/index.d.ts.map create mode 100644 node_modules/domhandler/lib/index.js create mode 100644 node_modules/domhandler/lib/node.d.ts create mode 100644 node_modules/domhandler/lib/node.d.ts.map create mode 100644 node_modules/domhandler/lib/node.js create mode 100644 node_modules/domhandler/package.json create mode 100644 node_modules/domhandler/readme.md create mode 100644 node_modules/domutils/LICENSE create mode 100644 node_modules/domutils/lib/feeds.d.ts create mode 100644 node_modules/domutils/lib/feeds.d.ts.map create mode 100644 node_modules/domutils/lib/feeds.js create mode 100644 node_modules/domutils/lib/helpers.d.ts create mode 100644 node_modules/domutils/lib/helpers.d.ts.map create mode 100644 node_modules/domutils/lib/helpers.js create mode 100644 node_modules/domutils/lib/index.d.ts create mode 100644 node_modules/domutils/lib/index.d.ts.map create mode 100644 node_modules/domutils/lib/index.js create mode 100644 node_modules/domutils/lib/legacy.d.ts create mode 100644 node_modules/domutils/lib/legacy.d.ts.map create mode 100644 node_modules/domutils/lib/legacy.js create mode 100644 node_modules/domutils/lib/manipulation.d.ts create mode 100644 node_modules/domutils/lib/manipulation.d.ts.map create mode 100644 node_modules/domutils/lib/manipulation.js create mode 100644 node_modules/domutils/lib/querying.d.ts create mode 100644 node_modules/domutils/lib/querying.d.ts.map create mode 100644 node_modules/domutils/lib/querying.js create mode 100644 node_modules/domutils/lib/stringify.d.ts create mode 100644 node_modules/domutils/lib/stringify.d.ts.map create mode 100644 node_modules/domutils/lib/stringify.js create mode 100644 node_modules/domutils/lib/traversal.d.ts create mode 100644 node_modules/domutils/lib/traversal.d.ts.map create mode 100644 node_modules/domutils/lib/traversal.js create mode 100644 node_modules/domutils/package.json create mode 100644 node_modules/domutils/readme.md create mode 100644 node_modules/ee-first/LICENSE create mode 100644 node_modules/ee-first/README.md create mode 100644 node_modules/ee-first/index.js create mode 100644 node_modules/ee-first/package.json create mode 100644 node_modules/encodeurl/LICENSE create mode 100644 node_modules/encodeurl/LICENSE 2 create mode 100644 node_modules/encodeurl/README 2.md create mode 100644 node_modules/encodeurl/README.md create mode 100644 node_modules/encodeurl/index 2.js create mode 100644 node_modules/encodeurl/index.js create mode 100644 node_modules/encodeurl/package 2.json create mode 100644 node_modules/encodeurl/package.json create mode 100644 node_modules/entities/LICENSE create mode 100644 node_modules/entities/lib/decode.d.ts create mode 100644 node_modules/entities/lib/decode.d.ts.map create mode 100644 node_modules/entities/lib/decode.js create mode 100644 node_modules/entities/lib/decode_codepoint.d.ts create mode 100644 node_modules/entities/lib/decode_codepoint.d.ts.map create mode 100644 node_modules/entities/lib/decode_codepoint.js create mode 100644 node_modules/entities/lib/encode-trie.d.ts create mode 100644 node_modules/entities/lib/encode-trie.d.ts.map create mode 100644 node_modules/entities/lib/encode-trie.js create mode 100644 node_modules/entities/lib/encode.d.ts create mode 100644 node_modules/entities/lib/encode.d.ts.map create mode 100644 node_modules/entities/lib/encode.js create mode 100644 node_modules/entities/lib/generated/decode-data-html.d.ts create mode 100644 node_modules/entities/lib/generated/decode-data-html.d.ts.map create mode 100644 node_modules/entities/lib/generated/decode-data-html.js create mode 100644 node_modules/entities/lib/generated/decode-data-xml.d.ts create mode 100644 node_modules/entities/lib/generated/decode-data-xml.d.ts.map create mode 100644 node_modules/entities/lib/generated/decode-data-xml.js create mode 100644 node_modules/entities/lib/index.d.ts create mode 100644 node_modules/entities/lib/index.d.ts.map create mode 100644 node_modules/entities/lib/index.js create mode 100644 node_modules/entities/lib/maps/entities.json create mode 100644 node_modules/entities/lib/maps/legacy.json create mode 100644 node_modules/entities/lib/maps/xml.json create mode 100644 node_modules/entities/package.json create mode 100644 node_modules/entities/readme.md create mode 100644 node_modules/errno/.jshintrc create mode 100644 node_modules/errno/.jshintrc 2 create mode 100644 node_modules/errno/.travis 2.yml create mode 100644 node_modules/errno/.travis.yml create mode 100644 node_modules/errno/README 2.md create mode 100644 node_modules/errno/README.md create mode 100755 node_modules/errno/build 2.js create mode 100755 node_modules/errno/build.js create mode 100755 node_modules/errno/cli 2.js create mode 100755 node_modules/errno/cli.js create mode 100644 node_modules/errno/custom 2.js create mode 100644 node_modules/errno/custom.js create mode 100644 node_modules/errno/errno 2.js create mode 100644 node_modules/errno/errno.js create mode 100644 node_modules/errno/package 2.json create mode 100644 node_modules/errno/package.json create mode 100644 node_modules/errno/test 2.js create mode 100644 node_modules/errno/test.js create mode 100644 node_modules/escape-html/LICENSE create mode 100644 node_modules/escape-html/Readme.md create mode 100644 node_modules/escape-html/index.js create mode 100644 node_modules/escape-html/package.json create mode 100644 node_modules/escape-string-regexp/index.d.ts create mode 100644 node_modules/escape-string-regexp/index.js create mode 100644 node_modules/escape-string-regexp/license create mode 100644 node_modules/escape-string-regexp/package.json create mode 100644 node_modules/escape-string-regexp/readme.md create mode 100644 node_modules/esm-import-transformer/README.md create mode 100644 node_modules/esm-import-transformer/import-transformer.js create mode 100644 node_modules/esm-import-transformer/package.json create mode 100644 node_modules/esprima/ChangeLog create mode 100644 node_modules/esprima/LICENSE.BSD create mode 100644 node_modules/esprima/README.md create mode 100755 node_modules/esprima/bin/esparse.js create mode 100755 node_modules/esprima/bin/esvalidate.js create mode 100644 node_modules/esprima/dist/esprima.js create mode 100644 node_modules/esprima/package.json create mode 100644 node_modules/etag/HISTORY.md create mode 100644 node_modules/etag/LICENSE create mode 100644 node_modules/etag/README.md create mode 100644 node_modules/etag/index.js create mode 100644 node_modules/etag/package.json create mode 100644 node_modules/evaluate-value/LICENSE create mode 100644 node_modules/evaluate-value/README.md create mode 100644 node_modules/evaluate-value/index-es5.js create mode 100644 node_modules/evaluate-value/index-es5.js.map create mode 100644 node_modules/evaluate-value/index.js create mode 100644 node_modules/evaluate-value/package.json create mode 100644 node_modules/extend-shallow/LICENSE create mode 100644 node_modules/extend-shallow/README.md create mode 100644 node_modules/extend-shallow/index.js create mode 100644 node_modules/extend-shallow/package.json create mode 100644 node_modules/filesize/LICENSE create mode 100644 node_modules/filesize/README.md create mode 100644 node_modules/filesize/dist/filesize.cjs create mode 100644 node_modules/filesize/dist/filesize.esm.js create mode 100644 node_modules/filesize/package.json create mode 100644 node_modules/filesize/types/filesize.d.ts create mode 100644 node_modules/fill-range/LICENSE create mode 100644 node_modules/fill-range/README.md create mode 100644 node_modules/fill-range/index.js create mode 100644 node_modules/fill-range/package.json create mode 100644 node_modules/finalhandler/HISTORY.md create mode 100644 node_modules/finalhandler/LICENSE create mode 100644 node_modules/finalhandler/README.md create mode 100644 node_modules/finalhandler/SECURITY.md create mode 100644 node_modules/finalhandler/index.js create mode 100644 node_modules/finalhandler/node_modules/debug/.coveralls.yml create mode 100644 node_modules/finalhandler/node_modules/debug/.eslintrc create mode 100644 node_modules/finalhandler/node_modules/debug/.npmignore create mode 100644 node_modules/finalhandler/node_modules/debug/.travis.yml create mode 100644 node_modules/finalhandler/node_modules/debug/CHANGELOG.md create mode 100644 node_modules/finalhandler/node_modules/debug/LICENSE create mode 100644 node_modules/finalhandler/node_modules/debug/Makefile create mode 100644 node_modules/finalhandler/node_modules/debug/README.md create mode 100644 node_modules/finalhandler/node_modules/debug/component.json create mode 100644 node_modules/finalhandler/node_modules/debug/karma.conf.js create mode 100644 node_modules/finalhandler/node_modules/debug/node.js create mode 100644 node_modules/finalhandler/node_modules/debug/package.json create mode 100644 node_modules/finalhandler/node_modules/debug/src/browser.js create mode 100644 node_modules/finalhandler/node_modules/debug/src/debug.js create mode 100644 node_modules/finalhandler/node_modules/debug/src/index.js create mode 100644 node_modules/finalhandler/node_modules/debug/src/inspector-log.js create mode 100644 node_modules/finalhandler/node_modules/debug/src/node.js create mode 100644 node_modules/finalhandler/node_modules/ms/index.js create mode 100644 node_modules/finalhandler/node_modules/ms/license.md create mode 100644 node_modules/finalhandler/node_modules/ms/package.json create mode 100644 node_modules/finalhandler/node_modules/ms/readme.md create mode 100644 node_modules/finalhandler/package.json create mode 100644 node_modules/fresh/HISTORY.md create mode 100644 node_modules/fresh/LICENSE create mode 100644 node_modules/fresh/README.md create mode 100644 node_modules/fresh/index.js create mode 100644 node_modules/fresh/package.json create mode 100644 node_modules/fsevents/LICENSE create mode 100644 node_modules/fsevents/README.md create mode 100644 node_modules/fsevents/fsevents.d.ts create mode 100644 node_modules/fsevents/fsevents.js create mode 100755 node_modules/fsevents/fsevents.node create mode 100644 node_modules/fsevents/package.json create mode 100644 node_modules/glob-parent/CHANGELOG.md create mode 100644 node_modules/glob-parent/LICENSE create mode 100644 node_modules/glob-parent/README.md create mode 100644 node_modules/glob-parent/index.js create mode 100644 node_modules/glob-parent/package.json create mode 100644 node_modules/gray-matter/CHANGELOG.md create mode 100644 node_modules/gray-matter/LICENSE create mode 100644 node_modules/gray-matter/README.md create mode 100644 node_modules/gray-matter/gray-matter.d.ts create mode 100644 node_modules/gray-matter/index.js create mode 100644 node_modules/gray-matter/lib/defaults.js create mode 100644 node_modules/gray-matter/lib/engine.js create mode 100644 node_modules/gray-matter/lib/engines.js create mode 100644 node_modules/gray-matter/lib/excerpt.js create mode 100644 node_modules/gray-matter/lib/parse.js create mode 100644 node_modules/gray-matter/lib/stringify.js create mode 100644 node_modules/gray-matter/lib/to-file.js create mode 100644 node_modules/gray-matter/lib/utils.js create mode 100644 node_modules/gray-matter/package.json create mode 100644 node_modules/htmlparser2/LICENSE create mode 100644 node_modules/htmlparser2/README.md create mode 100644 node_modules/htmlparser2/lib/FeedHandler.d.ts create mode 100644 node_modules/htmlparser2/lib/FeedHandler.d.ts.map create mode 100644 node_modules/htmlparser2/lib/FeedHandler.js create mode 100644 node_modules/htmlparser2/lib/Parser.d.ts create mode 100644 node_modules/htmlparser2/lib/Parser.d.ts.map create mode 100644 node_modules/htmlparser2/lib/Parser.js create mode 100644 node_modules/htmlparser2/lib/Tokenizer.d.ts create mode 100644 node_modules/htmlparser2/lib/Tokenizer.d.ts.map create mode 100644 node_modules/htmlparser2/lib/Tokenizer.js create mode 100644 node_modules/htmlparser2/lib/WritableStream.d.ts create mode 100644 node_modules/htmlparser2/lib/WritableStream.d.ts.map create mode 100644 node_modules/htmlparser2/lib/WritableStream.js create mode 100644 node_modules/htmlparser2/lib/index.d.ts create mode 100644 node_modules/htmlparser2/lib/index.d.ts.map create mode 100644 node_modules/htmlparser2/lib/index.js create mode 100644 node_modules/htmlparser2/package.json create mode 100644 node_modules/http-equiv-refresh/README 2.md create mode 100644 node_modules/http-equiv-refresh/README.md create mode 100644 node_modules/http-equiv-refresh/index 2.js create mode 100644 node_modules/http-equiv-refresh/index-es5.js create mode 100644 node_modules/http-equiv-refresh/index-es5.js.map create mode 100644 node_modules/http-equiv-refresh/index.js create mode 100644 node_modules/http-equiv-refresh/license create mode 100644 node_modules/http-equiv-refresh/license 2 create mode 100644 node_modules/http-equiv-refresh/package 2.json create mode 100644 node_modules/http-equiv-refresh/package.json create mode 100644 node_modules/http-errors/HISTORY.md create mode 100644 node_modules/http-errors/LICENSE create mode 100644 node_modules/http-errors/README.md create mode 100644 node_modules/http-errors/index.js create mode 100644 node_modules/http-errors/package.json create mode 100644 node_modules/inherits/LICENSE create mode 100644 node_modules/inherits/README.md create mode 100644 node_modules/inherits/inherits.js create mode 100644 node_modules/inherits/inherits_browser.js create mode 100644 node_modules/inherits/package.json create mode 100644 node_modules/is-alphabetical/index 2.js create mode 100644 node_modules/is-alphabetical/index.d.ts create mode 100644 node_modules/is-alphabetical/index.js create mode 100644 node_modules/is-alphabetical/license create mode 100644 node_modules/is-alphabetical/license 2 create mode 100644 node_modules/is-alphabetical/package 2.json create mode 100644 node_modules/is-alphabetical/package.json create mode 100644 node_modules/is-alphabetical/readme 2.md create mode 100644 node_modules/is-alphabetical/readme.md create mode 100644 node_modules/is-alphanumerical/index 2.js create mode 100644 node_modules/is-alphanumerical/index.d.ts create mode 100644 node_modules/is-alphanumerical/index.js create mode 100644 node_modules/is-alphanumerical/license create mode 100644 node_modules/is-alphanumerical/license 2 create mode 100644 node_modules/is-alphanumerical/package 2.json create mode 100644 node_modules/is-alphanumerical/package.json create mode 100644 node_modules/is-alphanumerical/readme 2.md create mode 100644 node_modules/is-alphanumerical/readme.md create mode 100644 node_modules/is-binary-path/index.d.ts create mode 100644 node_modules/is-binary-path/index.js create mode 100644 node_modules/is-binary-path/license create mode 100644 node_modules/is-binary-path/package.json create mode 100644 node_modules/is-binary-path/readme.md create mode 100644 node_modules/is-decimal/index 2.js create mode 100644 node_modules/is-decimal/index.d.ts create mode 100644 node_modules/is-decimal/index.js create mode 100644 node_modules/is-decimal/license create mode 100644 node_modules/is-decimal/license 2 create mode 100644 node_modules/is-decimal/package 2.json create mode 100644 node_modules/is-decimal/package.json create mode 100644 node_modules/is-decimal/readme 2.md create mode 100644 node_modules/is-decimal/readme.md create mode 100644 node_modules/is-extendable/LICENSE create mode 100644 node_modules/is-extendable/README.md create mode 100644 node_modules/is-extendable/index.js create mode 100644 node_modules/is-extendable/package.json create mode 100644 node_modules/is-extglob/LICENSE create mode 100644 node_modules/is-extglob/README.md create mode 100644 node_modules/is-extglob/index.js create mode 100644 node_modules/is-extglob/package.json create mode 100644 node_modules/is-glob/LICENSE create mode 100644 node_modules/is-glob/README.md create mode 100644 node_modules/is-glob/index.js create mode 100644 node_modules/is-glob/package.json create mode 100644 node_modules/is-json/.npmignore create mode 100644 node_modules/is-json/.travis.yml create mode 100644 node_modules/is-json/LICENSE create mode 100644 node_modules/is-json/README.md create mode 100644 node_modules/is-json/index.js create mode 100644 node_modules/is-json/package.json create mode 100644 node_modules/is-json/test/index.js create mode 100644 node_modules/is-number/LICENSE create mode 100644 node_modules/is-number/README.md create mode 100644 node_modules/is-number/index.js create mode 100644 node_modules/is-number/package.json create mode 100644 node_modules/iso-639-1/.eslintrc create mode 100644 node_modules/iso-639-1/.eslintrc 2 create mode 100644 node_modules/iso-639-1/.nvmrc create mode 100644 node_modules/iso-639-1/.nvmrc 2 create mode 100644 node_modules/iso-639-1/.prettierrc create mode 100644 node_modules/iso-639-1/.prettierrc 2 create mode 100644 node_modules/iso-639-1/.travis 2.yml create mode 100644 node_modules/iso-639-1/.travis.yml create mode 100644 node_modules/iso-639-1/.vscode/settings.json create mode 100644 node_modules/iso-639-1/CHANGELOG 2.md create mode 100644 node_modules/iso-639-1/CHANGELOG.md create mode 100644 node_modules/iso-639-1/LICENSE create mode 100644 node_modules/iso-639-1/LICENSE 2 create mode 100644 node_modules/iso-639-1/build/index.js create mode 100644 node_modules/iso-639-1/index.d 2.ts create mode 100644 node_modules/iso-639-1/index.d.ts create mode 100644 node_modules/iso-639-1/package 2.json create mode 100644 node_modules/iso-639-1/package.json create mode 100644 node_modules/iso-639-1/readme 2.md create mode 100644 node_modules/iso-639-1/readme.md create mode 100644 node_modules/iso-639-1/src/data.js create mode 100644 node_modules/iso-639-1/src/index.js create mode 100644 node_modules/iso-639-1/test/test.js create mode 100644 node_modules/iso-639-1/webpack.config 2.js create mode 100644 node_modules/iso-639-1/webpack.config.js create mode 100644 node_modules/js-yaml/CHANGELOG.md create mode 100644 node_modules/js-yaml/LICENSE create mode 100644 node_modules/js-yaml/README.md create mode 100755 node_modules/js-yaml/bin/js-yaml.js create mode 100644 node_modules/js-yaml/dist/js-yaml.js create mode 100644 node_modules/js-yaml/dist/js-yaml.min.js create mode 100644 node_modules/js-yaml/index.js create mode 100644 node_modules/js-yaml/lib/js-yaml.js create mode 100644 node_modules/js-yaml/lib/js-yaml/common.js create mode 100644 node_modules/js-yaml/lib/js-yaml/dumper.js create mode 100644 node_modules/js-yaml/lib/js-yaml/exception.js create mode 100644 node_modules/js-yaml/lib/js-yaml/loader.js create mode 100644 node_modules/js-yaml/lib/js-yaml/mark.js create mode 100644 node_modules/js-yaml/lib/js-yaml/schema.js create mode 100644 node_modules/js-yaml/lib/js-yaml/schema/core.js create mode 100644 node_modules/js-yaml/lib/js-yaml/schema/default_full.js create mode 100644 node_modules/js-yaml/lib/js-yaml/schema/default_safe.js create mode 100644 node_modules/js-yaml/lib/js-yaml/schema/failsafe.js create mode 100644 node_modules/js-yaml/lib/js-yaml/schema/json.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/binary.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/bool.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/float.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/int.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/js/function.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/js/regexp.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/js/undefined.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/map.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/merge.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/null.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/omap.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/pairs.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/seq.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/set.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/str.js create mode 100644 node_modules/js-yaml/lib/js-yaml/type/timestamp.js create mode 100644 node_modules/js-yaml/package.json create mode 100644 node_modules/junk/index 2.js create mode 100644 node_modules/junk/index.d.ts create mode 100644 node_modules/junk/index.js create mode 100644 node_modules/junk/license create mode 100644 node_modules/junk/license 2 create mode 100644 node_modules/junk/package 2.json create mode 100644 node_modules/junk/package.json create mode 100644 node_modules/junk/readme 2.md create mode 100644 node_modules/junk/readme.md create mode 100644 node_modules/kind-of/CHANGELOG.md create mode 100644 node_modules/kind-of/LICENSE create mode 100644 node_modules/kind-of/README.md create mode 100644 node_modules/kind-of/index.js create mode 100644 node_modules/kind-of/package.json create mode 100644 node_modules/kleur/colors.d.ts create mode 100644 node_modules/kleur/colors.js create mode 100644 node_modules/kleur/colors.mjs create mode 100644 node_modules/kleur/index.d.ts create mode 100644 node_modules/kleur/index.js create mode 100644 node_modules/kleur/index.mjs create mode 100644 node_modules/kleur/license create mode 100644 node_modules/kleur/package.json create mode 100644 node_modules/kleur/readme.md create mode 100644 node_modules/linkify-it/LICENSE create mode 100644 node_modules/linkify-it/README.md create mode 100644 node_modules/linkify-it/build/index.cjs.js create mode 100644 node_modules/linkify-it/index.mjs create mode 100644 node_modules/linkify-it/lib/re.mjs create mode 100644 node_modules/linkify-it/package.json create mode 100644 node_modules/liquidjs/LICENSE create mode 100644 node_modules/liquidjs/LICENSE 2 create mode 100644 node_modules/liquidjs/README 2.md create mode 100644 node_modules/liquidjs/README.md create mode 100755 node_modules/liquidjs/bin/liquid.js create mode 100644 node_modules/liquidjs/dist/build/fs-impl-browser.d.ts create mode 100644 node_modules/liquidjs/dist/build/fs-impl-browser.spec.d.ts create mode 100644 node_modules/liquidjs/dist/build/streamed-emitter-browser.d.ts create mode 100644 node_modules/liquidjs/dist/build/streamed-emitter-browser.spec.d.ts create mode 100644 node_modules/liquidjs/dist/cache/cache.d.ts create mode 100644 node_modules/liquidjs/dist/cache/index.d.ts create mode 100644 node_modules/liquidjs/dist/cache/lru.d.ts create mode 100644 node_modules/liquidjs/dist/cache/lru.spec.d.ts create mode 100644 node_modules/liquidjs/dist/context/block-mode.d.ts create mode 100644 node_modules/liquidjs/dist/context/context.d.ts create mode 100644 node_modules/liquidjs/dist/context/context.spec.d.ts create mode 100644 node_modules/liquidjs/dist/context/index.d.ts create mode 100644 node_modules/liquidjs/dist/context/scope.d.ts create mode 100644 node_modules/liquidjs/dist/drop/blank-drop.d.ts create mode 100644 node_modules/liquidjs/dist/drop/block-drop.d.ts create mode 100644 node_modules/liquidjs/dist/drop/comparable.d.ts create mode 100644 node_modules/liquidjs/dist/drop/drop.d.ts create mode 100644 node_modules/liquidjs/dist/drop/empty-drop.d.ts create mode 100644 node_modules/liquidjs/dist/drop/forloop-drop.d.ts create mode 100644 node_modules/liquidjs/dist/drop/index.d.ts create mode 100644 node_modules/liquidjs/dist/drop/null-drop.d.ts create mode 100644 node_modules/liquidjs/dist/drop/tablerowloop-drop.d.ts create mode 100644 node_modules/liquidjs/dist/emitters/emitter.d.ts create mode 100644 node_modules/liquidjs/dist/emitters/index.d.ts create mode 100644 node_modules/liquidjs/dist/emitters/keeping-type-emitter.d.ts create mode 100644 node_modules/liquidjs/dist/emitters/simple-emitter.d.ts create mode 100644 node_modules/liquidjs/dist/emitters/streamed-emitter.d.ts create mode 100644 node_modules/liquidjs/dist/filters/array.d.ts create mode 100644 node_modules/liquidjs/dist/filters/date.d.ts create mode 100644 node_modules/liquidjs/dist/filters/html.d.ts create mode 100644 node_modules/liquidjs/dist/filters/index.d.ts create mode 100644 node_modules/liquidjs/dist/filters/math.d.ts create mode 100644 node_modules/liquidjs/dist/filters/misc.d.ts create mode 100644 node_modules/liquidjs/dist/filters/string.d.ts create mode 100644 node_modules/liquidjs/dist/filters/url.d.ts create mode 100644 node_modules/liquidjs/dist/fs/fs-impl.d.ts create mode 100644 node_modules/liquidjs/dist/fs/fs-impl.spec.d.ts create mode 100644 node_modules/liquidjs/dist/fs/fs.d.ts create mode 100644 node_modules/liquidjs/dist/fs/index.d.ts create mode 100644 node_modules/liquidjs/dist/fs/loader.d.ts create mode 100644 node_modules/liquidjs/dist/fs/loader.spec.d.ts create mode 100644 node_modules/liquidjs/dist/fs/map-fs.d.ts create mode 100644 node_modules/liquidjs/dist/fs/map-fs.spec.d.ts create mode 100644 node_modules/liquidjs/dist/fs/node-require.d.ts create mode 100644 node_modules/liquidjs/dist/index.d.ts create mode 100644 node_modules/liquidjs/dist/liquid-options.d.ts create mode 100644 node_modules/liquidjs/dist/liquid-options.spec.d.ts create mode 100644 node_modules/liquidjs/dist/liquid.browser.min.js create mode 100644 node_modules/liquidjs/dist/liquid.browser.min.js.map create mode 100644 node_modules/liquidjs/dist/liquid.browser.mjs create mode 100644 node_modules/liquidjs/dist/liquid.browser.umd.js create mode 100644 node_modules/liquidjs/dist/liquid.browser.umd.js.map create mode 100644 node_modules/liquidjs/dist/liquid.d.ts create mode 100644 node_modules/liquidjs/dist/liquid.node.js create mode 100644 node_modules/liquidjs/dist/liquid.node.mjs create mode 100644 node_modules/liquidjs/dist/parser/filter-arg.d.ts create mode 100644 node_modules/liquidjs/dist/parser/index.d.ts create mode 100644 node_modules/liquidjs/dist/parser/parse-stream.d.ts create mode 100644 node_modules/liquidjs/dist/parser/parse-stream.spec.d.ts create mode 100644 node_modules/liquidjs/dist/parser/parser.d.ts create mode 100644 node_modules/liquidjs/dist/parser/parser.spec.d.ts create mode 100644 node_modules/liquidjs/dist/parser/token-kind.d.ts create mode 100644 node_modules/liquidjs/dist/parser/tokenizer.d.ts create mode 100644 node_modules/liquidjs/dist/parser/tokenizer.spec.d.ts create mode 100644 node_modules/liquidjs/dist/parser/whitespace-ctrl.d.ts create mode 100644 node_modules/liquidjs/dist/render/boolean.d.ts create mode 100644 node_modules/liquidjs/dist/render/boolean.spec.d.ts create mode 100644 node_modules/liquidjs/dist/render/expression.d.ts create mode 100644 node_modules/liquidjs/dist/render/expression.spec.d.ts create mode 100644 node_modules/liquidjs/dist/render/index.d.ts create mode 100644 node_modules/liquidjs/dist/render/operator.d.ts create mode 100644 node_modules/liquidjs/dist/render/render.d.ts create mode 100644 node_modules/liquidjs/dist/render/render.spec.d.ts create mode 100644 node_modules/liquidjs/dist/render/string.d.ts create mode 100644 node_modules/liquidjs/dist/render/string.spec.d.ts create mode 100644 node_modules/liquidjs/dist/tags/assign.d.ts create mode 100644 node_modules/liquidjs/dist/tags/block.d.ts create mode 100644 node_modules/liquidjs/dist/tags/break.d.ts create mode 100644 node_modules/liquidjs/dist/tags/capture.d.ts create mode 100644 node_modules/liquidjs/dist/tags/case.d.ts create mode 100644 node_modules/liquidjs/dist/tags/comment.d.ts create mode 100644 node_modules/liquidjs/dist/tags/continue.d.ts create mode 100644 node_modules/liquidjs/dist/tags/cycle.d.ts create mode 100644 node_modules/liquidjs/dist/tags/decrement.d.ts create mode 100644 node_modules/liquidjs/dist/tags/echo.d.ts create mode 100644 node_modules/liquidjs/dist/tags/for.d.ts create mode 100644 node_modules/liquidjs/dist/tags/if.d.ts create mode 100644 node_modules/liquidjs/dist/tags/include.d.ts create mode 100644 node_modules/liquidjs/dist/tags/increment.d.ts create mode 100644 node_modules/liquidjs/dist/tags/index.d.ts create mode 100644 node_modules/liquidjs/dist/tags/inline-comment.d.ts create mode 100644 node_modules/liquidjs/dist/tags/layout.d.ts create mode 100644 node_modules/liquidjs/dist/tags/liquid.d.ts create mode 100644 node_modules/liquidjs/dist/tags/raw.d.ts create mode 100644 node_modules/liquidjs/dist/tags/render.d.ts create mode 100644 node_modules/liquidjs/dist/tags/tablerow.d.ts create mode 100644 node_modules/liquidjs/dist/tags/unless.d.ts create mode 100644 node_modules/liquidjs/dist/template/analysis.d.ts create mode 100644 node_modules/liquidjs/dist/template/analysis.spec.d.ts create mode 100644 node_modules/liquidjs/dist/template/filter-impl-options.d.ts create mode 100644 node_modules/liquidjs/dist/template/filter.d.ts create mode 100644 node_modules/liquidjs/dist/template/filter.spec.d.ts create mode 100644 node_modules/liquidjs/dist/template/hash.d.ts create mode 100644 node_modules/liquidjs/dist/template/hash.spec.d.ts create mode 100644 node_modules/liquidjs/dist/template/html.d.ts create mode 100644 node_modules/liquidjs/dist/template/index.d.ts create mode 100644 node_modules/liquidjs/dist/template/output.d.ts create mode 100644 node_modules/liquidjs/dist/template/output.spec.d.ts create mode 100644 node_modules/liquidjs/dist/template/tag-options-adapter.d.ts create mode 100644 node_modules/liquidjs/dist/template/tag.d.ts create mode 100644 node_modules/liquidjs/dist/template/template-impl.d.ts create mode 100644 node_modules/liquidjs/dist/template/template.d.ts create mode 100644 node_modules/liquidjs/dist/template/value.d.ts create mode 100644 node_modules/liquidjs/dist/template/value.spec.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/delimited-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/filter-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/filtered-value-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/hash-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/html-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/identifier-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/index.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/liquid-tag-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/literal-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/number-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/operator-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/output-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/property-access-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/quoted-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/range-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/tag-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/top-level-token.d.ts create mode 100644 node_modules/liquidjs/dist/tokens/value-token.d.ts create mode 100644 node_modules/liquidjs/dist/util/assert.d.ts create mode 100644 node_modules/liquidjs/dist/util/assert.spec.d.ts create mode 100644 node_modules/liquidjs/dist/util/async.d.ts create mode 100644 node_modules/liquidjs/dist/util/async.spec.d.ts create mode 100644 node_modules/liquidjs/dist/util/character.d.ts create mode 100644 node_modules/liquidjs/dist/util/error.d.ts create mode 100644 node_modules/liquidjs/dist/util/error.spec.d.ts create mode 100644 node_modules/liquidjs/dist/util/index.d.ts create mode 100644 node_modules/liquidjs/dist/util/intl.d.ts create mode 100644 node_modules/liquidjs/dist/util/limiter.d.ts create mode 100644 node_modules/liquidjs/dist/util/liquid-date.d.ts create mode 100644 node_modules/liquidjs/dist/util/liquid-date.spec.d.ts create mode 100644 node_modules/liquidjs/dist/util/literal.d.ts create mode 100644 node_modules/liquidjs/dist/util/operator-trie.d.ts create mode 100644 node_modules/liquidjs/dist/util/performance.d.ts create mode 100644 node_modules/liquidjs/dist/util/performance.spec.d.ts create mode 100644 node_modules/liquidjs/dist/util/strftime.d.ts create mode 100644 node_modules/liquidjs/dist/util/strftime.spec.d.ts create mode 100644 node_modules/liquidjs/dist/util/type-guards.d.ts create mode 100644 node_modules/liquidjs/dist/util/type-guards.spec.d.ts create mode 100644 node_modules/liquidjs/dist/util/underscore.d.ts create mode 100644 node_modules/liquidjs/dist/util/underscore.spec.d.ts create mode 100644 node_modules/liquidjs/package 2.json create mode 100644 node_modules/liquidjs/package.json create mode 100644 node_modules/list-to-array/.npmignore create mode 100644 node_modules/list-to-array/LICENSE create mode 100644 node_modules/list-to-array/README.md create mode 100644 node_modules/list-to-array/index.js create mode 100644 node_modules/list-to-array/package.json create mode 100644 node_modules/list-to-array/tests.js create mode 100644 node_modules/luxon/LICENSE 2.md create mode 100644 node_modules/luxon/LICENSE.md create mode 100644 node_modules/luxon/README 2.md create mode 100644 node_modules/luxon/README.md create mode 100644 node_modules/luxon/build/amd/luxon.js create mode 100644 node_modules/luxon/build/amd/luxon.js.map create mode 100644 node_modules/luxon/build/cjs-browser/luxon.js create mode 100644 node_modules/luxon/build/cjs-browser/luxon.js.map create mode 100644 node_modules/luxon/build/es6/luxon.js create mode 100644 node_modules/luxon/build/es6/luxon.js.map create mode 100644 node_modules/luxon/build/global/luxon.js create mode 100644 node_modules/luxon/build/global/luxon.js.map create mode 100644 node_modules/luxon/build/global/luxon.min.js create mode 100644 node_modules/luxon/build/global/luxon.min.js.map create mode 100644 node_modules/luxon/build/node/luxon.js create mode 100644 node_modules/luxon/build/node/luxon.js.map create mode 100644 node_modules/luxon/package 2.json create mode 100644 node_modules/luxon/package.json create mode 100644 node_modules/luxon/src/datetime.js create mode 100644 node_modules/luxon/src/duration.js create mode 100644 node_modules/luxon/src/errors.js create mode 100644 node_modules/luxon/src/impl/conversions.js create mode 100644 node_modules/luxon/src/impl/diff.js create mode 100644 node_modules/luxon/src/impl/digits.js create mode 100644 node_modules/luxon/src/impl/english.js create mode 100644 node_modules/luxon/src/impl/formats.js create mode 100644 node_modules/luxon/src/impl/formatter.js create mode 100644 node_modules/luxon/src/impl/invalid.js create mode 100644 node_modules/luxon/src/impl/locale.js create mode 100644 node_modules/luxon/src/impl/regexParser.js create mode 100644 node_modules/luxon/src/impl/tokenParser.js create mode 100644 node_modules/luxon/src/impl/util.js create mode 100644 node_modules/luxon/src/impl/zoneUtil.js create mode 100644 node_modules/luxon/src/info.js create mode 100644 node_modules/luxon/src/interval.js create mode 100644 node_modules/luxon/src/luxon.js create mode 100644 node_modules/luxon/src/package.json create mode 100644 node_modules/luxon/src/settings.js create mode 100644 node_modules/luxon/src/zone.js create mode 100644 node_modules/luxon/src/zones/IANAZone.js create mode 100644 node_modules/luxon/src/zones/fixedOffsetZone.js create mode 100644 node_modules/luxon/src/zones/invalidZone.js create mode 100644 node_modules/luxon/src/zones/systemZone.js create mode 100644 node_modules/markdown-it/LICENSE create mode 100644 node_modules/markdown-it/README.md create mode 100755 node_modules/markdown-it/bin/markdown-it.mjs create mode 100644 node_modules/markdown-it/dist/index.cjs.js create mode 100644 node_modules/markdown-it/dist/markdown-it.js create mode 100644 node_modules/markdown-it/dist/markdown-it.min.js create mode 100644 node_modules/markdown-it/index.mjs create mode 100644 node_modules/markdown-it/lib/common/html_blocks.mjs create mode 100644 node_modules/markdown-it/lib/common/html_re.mjs create mode 100644 node_modules/markdown-it/lib/common/utils.mjs create mode 100644 node_modules/markdown-it/lib/helpers/index.mjs create mode 100644 node_modules/markdown-it/lib/helpers/parse_link_destination.mjs create mode 100644 node_modules/markdown-it/lib/helpers/parse_link_label.mjs create mode 100644 node_modules/markdown-it/lib/helpers/parse_link_title.mjs create mode 100644 node_modules/markdown-it/lib/index.mjs create mode 100644 node_modules/markdown-it/lib/parser_block.mjs create mode 100644 node_modules/markdown-it/lib/parser_core.mjs create mode 100644 node_modules/markdown-it/lib/parser_inline.mjs create mode 100644 node_modules/markdown-it/lib/presets/commonmark.mjs create mode 100644 node_modules/markdown-it/lib/presets/default.mjs create mode 100644 node_modules/markdown-it/lib/presets/zero.mjs create mode 100644 node_modules/markdown-it/lib/renderer.mjs create mode 100644 node_modules/markdown-it/lib/ruler.mjs create mode 100644 node_modules/markdown-it/lib/rules_block/blockquote.mjs create mode 100644 node_modules/markdown-it/lib/rules_block/code.mjs create mode 100644 node_modules/markdown-it/lib/rules_block/fence.mjs create mode 100644 node_modules/markdown-it/lib/rules_block/heading.mjs create mode 100644 node_modules/markdown-it/lib/rules_block/hr.mjs create mode 100644 node_modules/markdown-it/lib/rules_block/html_block.mjs create mode 100644 node_modules/markdown-it/lib/rules_block/lheading.mjs create mode 100644 node_modules/markdown-it/lib/rules_block/list.mjs create mode 100644 node_modules/markdown-it/lib/rules_block/paragraph.mjs create mode 100644 node_modules/markdown-it/lib/rules_block/reference.mjs create mode 100644 node_modules/markdown-it/lib/rules_block/state_block.mjs create mode 100644 node_modules/markdown-it/lib/rules_block/table.mjs create mode 100644 node_modules/markdown-it/lib/rules_core/block.mjs create mode 100644 node_modules/markdown-it/lib/rules_core/inline.mjs create mode 100644 node_modules/markdown-it/lib/rules_core/linkify.mjs create mode 100644 node_modules/markdown-it/lib/rules_core/normalize.mjs create mode 100644 node_modules/markdown-it/lib/rules_core/replacements.mjs create mode 100644 node_modules/markdown-it/lib/rules_core/smartquotes.mjs create mode 100644 node_modules/markdown-it/lib/rules_core/state_core.mjs create mode 100644 node_modules/markdown-it/lib/rules_core/text_join.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/autolink.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/backticks.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/balance_pairs.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/emphasis.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/entity.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/escape.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/fragments_join.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/html_inline.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/image.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/link.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/linkify.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/newline.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/state_inline.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/strikethrough.mjs create mode 100644 node_modules/markdown-it/lib/rules_inline/text.mjs create mode 100644 node_modules/markdown-it/lib/token.mjs create mode 100644 node_modules/markdown-it/node_modules/argparse/CHANGELOG.md create mode 100644 node_modules/markdown-it/node_modules/argparse/LICENSE create mode 100644 node_modules/markdown-it/node_modules/argparse/README.md create mode 100644 node_modules/markdown-it/node_modules/argparse/argparse.js create mode 100644 node_modules/markdown-it/node_modules/argparse/lib/sub.js create mode 100644 node_modules/markdown-it/node_modules/argparse/lib/textwrap.js create mode 100644 node_modules/markdown-it/node_modules/argparse/package.json create mode 100644 node_modules/markdown-it/node_modules/entities/LICENSE create mode 100644 node_modules/markdown-it/node_modules/entities/lib/decode.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/decode.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/decode.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/decode.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/decode_codepoint.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/decode_codepoint.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/decode_codepoint.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/decode_codepoint.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/encode.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/encode.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/encode.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/encode.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/escape.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/escape.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/escape.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/escape.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/decode.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/decode.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/decode.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/decode.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/decode_codepoint.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/decode_codepoint.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/decode_codepoint.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/decode_codepoint.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/encode.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/encode.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/encode.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/encode.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/escape.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/escape.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/escape.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/escape.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/generated/decode-data-html.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/generated/decode-data-html.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/generated/decode-data-html.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/generated/decode-data-html.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/generated/decode-data-xml.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/generated/decode-data-xml.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/generated/decode-data-xml.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/generated/decode-data-xml.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/generated/encode-html.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/generated/encode-html.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/generated/encode-html.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/generated/encode-html.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/index.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/index.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/index.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/index.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/esm/package.json create mode 100644 node_modules/markdown-it/node_modules/entities/lib/generated/decode-data-html.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/generated/decode-data-html.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/generated/decode-data-html.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/generated/decode-data-html.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/generated/decode-data-xml.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/generated/decode-data-xml.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/generated/decode-data-xml.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/generated/decode-data-xml.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/generated/encode-html.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/generated/encode-html.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/generated/encode-html.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/generated/encode-html.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/index.d.ts create mode 100644 node_modules/markdown-it/node_modules/entities/lib/index.d.ts.map create mode 100644 node_modules/markdown-it/node_modules/entities/lib/index.js create mode 100644 node_modules/markdown-it/node_modules/entities/lib/index.js.map create mode 100644 node_modules/markdown-it/node_modules/entities/package.json create mode 100644 node_modules/markdown-it/node_modules/entities/readme.md create mode 100644 node_modules/markdown-it/package.json create mode 100644 node_modules/maximatch/index.js create mode 100644 node_modules/maximatch/license create mode 100644 node_modules/maximatch/package.json create mode 100644 node_modules/maximatch/readme.md create mode 100644 node_modules/mdurl/LICENSE create mode 100644 node_modules/mdurl/LICENSE 2 create mode 100644 node_modules/mdurl/README 2.md create mode 100644 node_modules/mdurl/README.md create mode 100644 node_modules/mdurl/build/index.cjs.js create mode 100644 node_modules/mdurl/index.mjs create mode 100644 node_modules/mdurl/lib/decode.mjs create mode 100644 node_modules/mdurl/lib/encode.mjs create mode 100644 node_modules/mdurl/lib/format.mjs create mode 100644 node_modules/mdurl/lib/parse.mjs create mode 100644 node_modules/mdurl/package 2.json create mode 100644 node_modules/mdurl/package.json create mode 100644 node_modules/mime-db/HISTORY.md create mode 100644 node_modules/mime-db/LICENSE create mode 100644 node_modules/mime-db/README.md create mode 100644 node_modules/mime-db/db.json create mode 100644 node_modules/mime-db/index.js create mode 100644 node_modules/mime-db/package.json create mode 100644 node_modules/mime-types/HISTORY.md create mode 100644 node_modules/mime-types/LICENSE create mode 100644 node_modules/mime-types/README.md create mode 100644 node_modules/mime-types/index.js create mode 100644 node_modules/mime-types/mimeScore.js create mode 100644 node_modules/mime-types/package.json create mode 100644 node_modules/mime/CHANGELOG.md create mode 100644 node_modules/mime/LICENSE create mode 100644 node_modules/mime/Mime.js create mode 100644 node_modules/mime/README.md create mode 100755 node_modules/mime/cli.js create mode 100644 node_modules/mime/index.js create mode 100644 node_modules/mime/lite.js create mode 100644 node_modules/mime/package.json create mode 100644 node_modules/mime/types/other.js create mode 100644 node_modules/mime/types/standard.js create mode 100644 node_modules/minimatch/LICENSE create mode 100644 node_modules/minimatch/README.md create mode 100644 node_modules/minimatch/minimatch.js create mode 100644 node_modules/minimatch/package.json create mode 100644 node_modules/minimist/.eslintrc create mode 100644 node_modules/minimist/.github/FUNDING.yml create mode 100644 node_modules/minimist/.nycrc create mode 100644 node_modules/minimist/CHANGELOG.md create mode 100644 node_modules/minimist/LICENSE create mode 100644 node_modules/minimist/README.md create mode 100644 node_modules/minimist/example/parse.js create mode 100644 node_modules/minimist/index.js create mode 100644 node_modules/minimist/package.json create mode 100644 node_modules/minimist/test/all_bool.js create mode 100644 node_modules/minimist/test/bool.js create mode 100644 node_modules/minimist/test/dash.js create mode 100644 node_modules/minimist/test/default_bool.js create mode 100644 node_modules/minimist/test/dotted.js create mode 100644 node_modules/minimist/test/kv_short.js create mode 100644 node_modules/minimist/test/long.js create mode 100644 node_modules/minimist/test/num.js create mode 100644 node_modules/minimist/test/parse.js create mode 100644 node_modules/minimist/test/parse_modified.js create mode 100644 node_modules/minimist/test/proto.js create mode 100644 node_modules/minimist/test/short.js create mode 100644 node_modules/minimist/test/stop_early.js create mode 100644 node_modules/minimist/test/unknown.js create mode 100644 node_modules/minimist/test/whitespace.js create mode 100644 node_modules/minipass/LICENSE create mode 100644 node_modules/minipass/LICENSE 2 create mode 100644 node_modules/minipass/README 2.md create mode 100644 node_modules/minipass/README.md create mode 100644 node_modules/minipass/dist/commonjs/index.d.ts create mode 100644 node_modules/minipass/dist/commonjs/index.d.ts.map create mode 100644 node_modules/minipass/dist/commonjs/index.js create mode 100644 node_modules/minipass/dist/commonjs/index.js.map create mode 100644 node_modules/minipass/dist/commonjs/package.json create mode 100644 node_modules/minipass/dist/esm/index.d.ts create mode 100644 node_modules/minipass/dist/esm/index.d.ts.map create mode 100644 node_modules/minipass/dist/esm/index.js create mode 100644 node_modules/minipass/dist/esm/index.js.map create mode 100644 node_modules/minipass/dist/esm/package.json create mode 100644 node_modules/minipass/package 2.json create mode 100644 node_modules/minipass/package.json create mode 100644 node_modules/moo/LICENSE create mode 100644 node_modules/moo/README.md create mode 100644 node_modules/moo/moo.js create mode 100644 node_modules/moo/package.json create mode 100644 node_modules/morphdom/CHANGELOG 2.md create mode 100644 node_modules/morphdom/CHANGELOG.md create mode 100644 node_modules/morphdom/LICENSE create mode 100644 node_modules/morphdom/LICENSE 2 create mode 100644 node_modules/morphdom/README 2.md create mode 100644 node_modules/morphdom/README.md create mode 100644 node_modules/morphdom/dist/morphdom-esm.js create mode 100644 node_modules/morphdom/dist/morphdom-factory.js create mode 100644 node_modules/morphdom/dist/morphdom-umd.js create mode 100644 node_modules/morphdom/dist/morphdom-umd.min.js create mode 100644 node_modules/morphdom/dist/morphdom.js create mode 100644 node_modules/morphdom/docs/old-benchmark.md create mode 100644 node_modules/morphdom/docs/virtual-dom.md create mode 100644 node_modules/morphdom/factory 2.js create mode 100644 node_modules/morphdom/factory.js create mode 100644 node_modules/morphdom/index.d 2.ts create mode 100644 node_modules/morphdom/index.d.ts create mode 100644 node_modules/morphdom/package 2.json create mode 100644 node_modules/morphdom/package.json create mode 100644 node_modules/morphdom/src/index.js create mode 100644 node_modules/morphdom/src/morphAttrs.js create mode 100644 node_modules/morphdom/src/morphdom.js create mode 100644 node_modules/morphdom/src/specialElHandlers.js create mode 100644 node_modules/morphdom/src/util.js create mode 100644 node_modules/ms/index 2.js create mode 100644 node_modules/ms/index.js create mode 100644 node_modules/ms/license 2.md create mode 100644 node_modules/ms/license.md create mode 100644 node_modules/ms/package 2.json create mode 100644 node_modules/ms/package.json create mode 100644 node_modules/ms/readme 2.md create mode 100644 node_modules/ms/readme.md create mode 100644 node_modules/node-retrieve-globals/LICENSE create mode 100644 node_modules/node-retrieve-globals/README.md create mode 100644 node_modules/node-retrieve-globals/package.json create mode 100644 node_modules/node-retrieve-globals/retrieveGlobals.js create mode 100644 node_modules/node-retrieve-globals/util/getWorkingDirectory.js create mode 100644 node_modules/node-retrieve-globals/util/vmModules.js create mode 100644 node_modules/normalize-path/LICENSE create mode 100644 node_modules/normalize-path/README.md create mode 100644 node_modules/normalize-path/index.js create mode 100644 node_modules/normalize-path/package.json create mode 100644 node_modules/nunjucks/LICENSE create mode 100644 node_modules/nunjucks/README.md create mode 100755 node_modules/nunjucks/bin/precompile create mode 100644 node_modules/nunjucks/bin/precompile.cmd create mode 100644 node_modules/nunjucks/browser/nunjucks-slim.js create mode 100644 node_modules/nunjucks/browser/nunjucks-slim.js.map create mode 100644 node_modules/nunjucks/browser/nunjucks-slim.min.js create mode 100644 node_modules/nunjucks/browser/nunjucks-slim.min.js.map create mode 100644 node_modules/nunjucks/browser/nunjucks.js create mode 100644 node_modules/nunjucks/browser/nunjucks.js.map create mode 100644 node_modules/nunjucks/browser/nunjucks.min.js create mode 100644 node_modules/nunjucks/browser/nunjucks.min.js.map create mode 100644 node_modules/nunjucks/index.js create mode 100644 node_modules/nunjucks/node_modules/commander/CHANGELOG.md create mode 100644 node_modules/nunjucks/node_modules/commander/LICENSE create mode 100644 node_modules/nunjucks/node_modules/commander/Readme.md create mode 100644 node_modules/nunjucks/node_modules/commander/index.js create mode 100644 node_modules/nunjucks/node_modules/commander/package.json create mode 100644 node_modules/nunjucks/node_modules/commander/typings/index.d.ts create mode 100644 node_modules/nunjucks/package.json create mode 100644 node_modules/nunjucks/src/compiler.js create mode 100644 node_modules/nunjucks/src/environment.js create mode 100644 node_modules/nunjucks/src/express-app.js create mode 100644 node_modules/nunjucks/src/filters.js create mode 100644 node_modules/nunjucks/src/globals.js create mode 100644 node_modules/nunjucks/src/jinja-compat.js create mode 100644 node_modules/nunjucks/src/lexer.js create mode 100644 node_modules/nunjucks/src/lib.js create mode 100644 node_modules/nunjucks/src/loader.js create mode 100644 node_modules/nunjucks/src/loaders.js create mode 100644 node_modules/nunjucks/src/node-loaders.js create mode 100644 node_modules/nunjucks/src/nodes.js create mode 100644 node_modules/nunjucks/src/object.js create mode 100644 node_modules/nunjucks/src/parser.js create mode 100644 node_modules/nunjucks/src/precompile-global.js create mode 100644 node_modules/nunjucks/src/precompile.js create mode 100644 node_modules/nunjucks/src/precompiled-loader.js create mode 100644 node_modules/nunjucks/src/runtime.js create mode 100644 node_modules/nunjucks/src/tests.js create mode 100644 node_modules/nunjucks/src/transformer.js create mode 100644 node_modules/nunjucks/src/web-loaders.js create mode 100644 node_modules/on-finished/HISTORY.md create mode 100644 node_modules/on-finished/LICENSE create mode 100644 node_modules/on-finished/README.md create mode 100644 node_modules/on-finished/index.js create mode 100644 node_modules/on-finished/package.json create mode 100644 node_modules/parse-srcset/.jscs.json create mode 100644 node_modules/parse-srcset/.jshintrc create mode 100644 node_modules/parse-srcset/.npmignore create mode 100644 node_modules/parse-srcset/LICENSE create mode 100644 node_modules/parse-srcset/README.md create mode 100644 node_modules/parse-srcset/package.json create mode 100644 node_modules/parse-srcset/src/parse-srcset.js create mode 100755 node_modules/parse-srcset/tests/he.js create mode 100644 node_modules/parse-srcset/tests/intern.js create mode 100644 node_modules/parse-srcset/tests/unit/ps.js create mode 100644 node_modules/parseurl/HISTORY.md create mode 100644 node_modules/parseurl/LICENSE create mode 100644 node_modules/parseurl/README.md create mode 100644 node_modules/parseurl/index.js create mode 100644 node_modules/parseurl/package.json create mode 100644 node_modules/picomatch/CHANGELOG.md create mode 100644 node_modules/picomatch/LICENSE create mode 100644 node_modules/picomatch/README.md create mode 100644 node_modules/picomatch/index.js create mode 100644 node_modules/picomatch/lib/constants.js create mode 100644 node_modules/picomatch/lib/parse.js create mode 100644 node_modules/picomatch/lib/picomatch.js create mode 100644 node_modules/picomatch/lib/scan.js create mode 100644 node_modules/picomatch/lib/utils.js create mode 100644 node_modules/picomatch/package.json create mode 100644 node_modules/please-upgrade-node/.eslintrc.js create mode 100644 node_modules/please-upgrade-node/.github/FUNDING.yml rename {themes/juice => node_modules/please-upgrade-node}/LICENSE (97%) create mode 100644 node_modules/please-upgrade-node/README.md create mode 100644 node_modules/please-upgrade-node/index.d.ts create mode 100644 node_modules/please-upgrade-node/index.js create mode 100644 node_modules/please-upgrade-node/package.json create mode 100644 node_modules/posthtml-match-helper/LICENSE create mode 100644 node_modules/posthtml-match-helper/README.md create mode 100644 node_modules/posthtml-match-helper/lib/index.d.ts create mode 100644 node_modules/posthtml-match-helper/lib/index.js create mode 100644 node_modules/posthtml-match-helper/package.json create mode 100644 node_modules/posthtml-parser/dist/chunk.2UQLUWPH.js create mode 100644 node_modules/posthtml-parser/dist/index.d.ts create mode 100644 node_modules/posthtml-parser/dist/index.js create mode 100644 node_modules/posthtml-parser/dist/location-tracker.d.ts create mode 100644 node_modules/posthtml-parser/dist/location-tracker.js create mode 100644 node_modules/posthtml-parser/license create mode 100644 node_modules/posthtml-parser/package.json create mode 100644 node_modules/posthtml-parser/readme.md create mode 100644 node_modules/posthtml-render/changelog.md create mode 100644 node_modules/posthtml-render/dist/index.d.ts create mode 100644 node_modules/posthtml-render/dist/index.js create mode 100644 node_modules/posthtml-render/license create mode 100644 node_modules/posthtml-render/package.json create mode 100644 node_modules/posthtml-render/readme.md create mode 100644 node_modules/posthtml/lib/api.js create mode 100644 node_modules/posthtml/lib/index.js create mode 100644 node_modules/posthtml/license create mode 100644 node_modules/posthtml/package.json create mode 100644 node_modules/posthtml/readme.md create mode 100644 node_modules/posthtml/types/posthtml.d.ts create mode 100644 node_modules/prr/.jshintrc create mode 100644 node_modules/prr/.npmignore create mode 100644 node_modules/prr/.travis.yml create mode 100644 node_modules/prr/LICENSE.md create mode 100644 node_modules/prr/README.md create mode 100644 node_modules/prr/package.json create mode 100644 node_modules/prr/prr.js create mode 100644 node_modules/prr/test.js create mode 100644 node_modules/punycode.js/LICENSE-MIT.txt create mode 100644 node_modules/punycode.js/README.md create mode 100644 node_modules/punycode.js/package.json create mode 100644 node_modules/punycode.js/punycode.es6.js create mode 100644 node_modules/punycode.js/punycode.js create mode 100644 node_modules/range-parser/HISTORY.md create mode 100644 node_modules/range-parser/LICENSE create mode 100644 node_modules/range-parser/README.md create mode 100644 node_modules/range-parser/index.js create mode 100644 node_modules/range-parser/package.json create mode 100644 node_modules/readdirp/LICENSE create mode 100644 node_modules/readdirp/README.md create mode 100644 node_modules/readdirp/index.d.ts create mode 100644 node_modules/readdirp/index.js create mode 100644 node_modules/readdirp/package.json create mode 100644 node_modules/section-matter/LICENSE create mode 100644 node_modules/section-matter/README.md create mode 100644 node_modules/section-matter/index.js create mode 100644 node_modules/section-matter/package.json create mode 100644 node_modules/semver-compare/.travis.yml create mode 100644 node_modules/semver-compare/LICENSE create mode 100644 node_modules/semver-compare/example/cmp.js create mode 100644 node_modules/semver-compare/example/lex.js create mode 100644 node_modules/semver-compare/index.js create mode 100644 node_modules/semver-compare/package.json create mode 100644 node_modules/semver-compare/readme.markdown create mode 100644 node_modules/semver-compare/test/cmp.js create mode 100644 node_modules/semver/LICENSE create mode 100644 node_modules/semver/LICENSE 2 create mode 100644 node_modules/semver/README 2.md create mode 100644 node_modules/semver/README.md create mode 100755 node_modules/semver/bin/semver.js create mode 100644 node_modules/semver/classes/comparator.js create mode 100644 node_modules/semver/classes/index.js create mode 100644 node_modules/semver/classes/range.js create mode 100644 node_modules/semver/classes/semver.js create mode 100644 node_modules/semver/functions/clean.js create mode 100644 node_modules/semver/functions/cmp.js create mode 100644 node_modules/semver/functions/coerce.js create mode 100644 node_modules/semver/functions/compare-build.js create mode 100644 node_modules/semver/functions/compare-loose.js create mode 100644 node_modules/semver/functions/compare.js create mode 100644 node_modules/semver/functions/diff.js create mode 100644 node_modules/semver/functions/eq.js create mode 100644 node_modules/semver/functions/gt.js create mode 100644 node_modules/semver/functions/gte.js create mode 100644 node_modules/semver/functions/inc.js create mode 100644 node_modules/semver/functions/lt.js create mode 100644 node_modules/semver/functions/lte.js create mode 100644 node_modules/semver/functions/major.js create mode 100644 node_modules/semver/functions/minor.js create mode 100644 node_modules/semver/functions/neq.js create mode 100644 node_modules/semver/functions/parse.js create mode 100644 node_modules/semver/functions/patch.js create mode 100644 node_modules/semver/functions/prerelease.js create mode 100644 node_modules/semver/functions/rcompare.js create mode 100644 node_modules/semver/functions/rsort.js create mode 100644 node_modules/semver/functions/satisfies.js create mode 100644 node_modules/semver/functions/sort.js create mode 100644 node_modules/semver/functions/valid.js create mode 100644 node_modules/semver/index 2.js create mode 100644 node_modules/semver/index.js create mode 100644 node_modules/semver/internal/constants.js create mode 100644 node_modules/semver/internal/debug.js create mode 100644 node_modules/semver/internal/identifiers.js create mode 100644 node_modules/semver/internal/lrucache.js create mode 100644 node_modules/semver/internal/parse-options.js create mode 100644 node_modules/semver/internal/re.js create mode 100644 node_modules/semver/package 2.json create mode 100644 node_modules/semver/package.json create mode 100644 node_modules/semver/preload 2.js create mode 100644 node_modules/semver/preload.js create mode 100644 node_modules/semver/range 2.bnf create mode 100644 node_modules/semver/range.bnf create mode 100644 node_modules/semver/ranges/gtr.js create mode 100644 node_modules/semver/ranges/intersects.js create mode 100644 node_modules/semver/ranges/ltr.js create mode 100644 node_modules/semver/ranges/max-satisfying.js create mode 100644 node_modules/semver/ranges/min-satisfying.js create mode 100644 node_modules/semver/ranges/min-version.js create mode 100644 node_modules/semver/ranges/outside.js create mode 100644 node_modules/semver/ranges/simplify.js create mode 100644 node_modules/semver/ranges/subset.js create mode 100644 node_modules/semver/ranges/to-comparators.js create mode 100644 node_modules/semver/ranges/valid.js create mode 100644 node_modules/send/HISTORY.md create mode 100644 node_modules/send/LICENSE create mode 100644 node_modules/send/README.md create mode 100644 node_modules/send/index.js create mode 100644 node_modules/send/package.json create mode 100644 node_modules/setprototypeof/LICENSE create mode 100644 node_modules/setprototypeof/README.md create mode 100644 node_modules/setprototypeof/index.d.ts create mode 100644 node_modules/setprototypeof/index.js create mode 100644 node_modules/setprototypeof/package.json create mode 100644 node_modules/setprototypeof/test/index.js create mode 100644 node_modules/slash/index 2.js create mode 100644 node_modules/slash/index.d.ts create mode 100644 node_modules/slash/index.js create mode 100644 node_modules/slash/license create mode 100644 node_modules/slash/package 2.json create mode 100644 node_modules/slash/package.json create mode 100644 node_modules/slash/readme 2.md create mode 100644 node_modules/slash/readme.md create mode 100644 node_modules/slugify/CHANGELOG.md create mode 100644 node_modules/slugify/LICENSE create mode 100644 node_modules/slugify/README.md create mode 100644 node_modules/slugify/package.json create mode 100644 node_modules/slugify/slugify.d.ts create mode 100644 node_modules/slugify/slugify.js create mode 100644 node_modules/sprintf-js/.npmignore create mode 100644 node_modules/sprintf-js/LICENSE create mode 100644 node_modules/sprintf-js/README.md create mode 100644 node_modules/sprintf-js/bower.json create mode 100644 node_modules/sprintf-js/demo/angular.html create mode 100644 node_modules/sprintf-js/dist/angular-sprintf.min.js create mode 100644 node_modules/sprintf-js/dist/angular-sprintf.min.js.map create mode 100644 node_modules/sprintf-js/dist/angular-sprintf.min.map create mode 100644 node_modules/sprintf-js/dist/sprintf.min.js create mode 100644 node_modules/sprintf-js/dist/sprintf.min.js.map create mode 100644 node_modules/sprintf-js/dist/sprintf.min.map create mode 100644 node_modules/sprintf-js/gruntfile.js create mode 100644 node_modules/sprintf-js/package.json create mode 100644 node_modules/sprintf-js/src/angular-sprintf.js create mode 100644 node_modules/sprintf-js/src/sprintf.js create mode 100644 node_modules/sprintf-js/test/test.js create mode 100644 node_modules/ssri/LICENSE 2.md create mode 100644 node_modules/ssri/LICENSE.md create mode 100644 node_modules/ssri/README 2.md create mode 100644 node_modules/ssri/README.md create mode 100644 node_modules/ssri/lib/index.js create mode 100644 node_modules/ssri/package 2.json create mode 100644 node_modules/ssri/package.json create mode 100644 node_modules/statuses/HISTORY.md create mode 100644 node_modules/statuses/LICENSE create mode 100644 node_modules/statuses/README.md create mode 100644 node_modules/statuses/codes.json create mode 100644 node_modules/statuses/index.js create mode 100644 node_modules/statuses/package.json create mode 100644 node_modules/strip-bom-string/LICENSE create mode 100644 node_modules/strip-bom-string/README.md create mode 100644 node_modules/strip-bom-string/index.js create mode 100644 node_modules/strip-bom-string/package.json create mode 100644 node_modules/tinyglobby/LICENSE create mode 100644 node_modules/tinyglobby/README.md create mode 100644 node_modules/tinyglobby/dist/index.d.mts create mode 100644 node_modules/tinyglobby/dist/index.d.ts create mode 100644 node_modules/tinyglobby/dist/index.js create mode 100644 node_modules/tinyglobby/dist/index.mjs create mode 100644 node_modules/tinyglobby/node_modules/fdir/LICENSE create mode 100644 node_modules/tinyglobby/node_modules/fdir/README.md create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/async.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/async.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/counter.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/counter.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/get-array.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/get-array.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/group-files.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/group-files.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/invoke-callback.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/invoke-callback.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/join-path.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/join-path.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/push-directory.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/push-directory.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/push-file.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/push-file.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/resolve-symlink.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/resolve-symlink.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/walk-directory.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/functions/walk-directory.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/queue.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/queue.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/sync.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/sync.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/walker.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/api/walker.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/builder/api-builder.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/builder/api-builder.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/builder/index.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/builder/index.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/index.cjs create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/index.d.cts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/index.d.mts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/index.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/index.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/index.mjs create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/types.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/types.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/utils.d.ts create mode 100644 node_modules/tinyglobby/node_modules/fdir/dist/utils.js create mode 100644 node_modules/tinyglobby/node_modules/fdir/package.json create mode 100644 node_modules/tinyglobby/node_modules/picomatch/LICENSE create mode 100644 node_modules/tinyglobby/node_modules/picomatch/README.md create mode 100644 node_modules/tinyglobby/node_modules/picomatch/index.js create mode 100644 node_modules/tinyglobby/node_modules/picomatch/lib/constants.js create mode 100644 node_modules/tinyglobby/node_modules/picomatch/lib/parse.js create mode 100644 node_modules/tinyglobby/node_modules/picomatch/lib/picomatch.js create mode 100644 node_modules/tinyglobby/node_modules/picomatch/lib/scan.js create mode 100644 node_modules/tinyglobby/node_modules/picomatch/lib/utils.js create mode 100644 node_modules/tinyglobby/node_modules/picomatch/package.json create mode 100644 node_modules/tinyglobby/node_modules/picomatch/posix.js create mode 100644 node_modules/tinyglobby/package.json create mode 100644 node_modules/to-regex-range/LICENSE create mode 100644 node_modules/to-regex-range/README.md create mode 100644 node_modules/to-regex-range/index.js create mode 100644 node_modules/to-regex-range/package.json create mode 100644 node_modules/toidentifier/HISTORY.md create mode 100644 node_modules/toidentifier/LICENSE create mode 100644 node_modules/toidentifier/README.md create mode 100644 node_modules/toidentifier/index.js create mode 100644 node_modules/toidentifier/package.json create mode 100644 node_modules/uc.micro/LICENSE 2.txt create mode 100644 node_modules/uc.micro/LICENSE.txt create mode 100644 node_modules/uc.micro/README 2.md create mode 100644 node_modules/uc.micro/README.md create mode 100644 node_modules/uc.micro/build/index.cjs.js create mode 100644 node_modules/uc.micro/categories/Cc/regex.mjs create mode 100644 node_modules/uc.micro/categories/Cf/regex.mjs create mode 100644 node_modules/uc.micro/categories/P/regex.mjs create mode 100644 node_modules/uc.micro/categories/S/regex.mjs create mode 100644 node_modules/uc.micro/categories/Z/regex.mjs create mode 100644 node_modules/uc.micro/index.mjs create mode 100644 node_modules/uc.micro/package 2.json create mode 100644 node_modules/uc.micro/package.json create mode 100644 node_modules/uc.micro/properties/Any/regex.mjs create mode 100644 node_modules/unpipe/HISTORY.md create mode 100644 node_modules/unpipe/LICENSE create mode 100644 node_modules/unpipe/README.md create mode 100644 node_modules/unpipe/index.js create mode 100644 node_modules/unpipe/package.json create mode 100644 node_modules/urlpattern-polyfill/LICENSE create mode 100644 node_modules/urlpattern-polyfill/README.md create mode 100644 node_modules/urlpattern-polyfill/dist/index.d.ts create mode 100644 node_modules/urlpattern-polyfill/dist/types.d.ts create mode 100644 node_modules/urlpattern-polyfill/dist/urlpattern.cjs create mode 100644 node_modules/urlpattern-polyfill/dist/urlpattern.js create mode 100644 node_modules/urlpattern-polyfill/index.cjs create mode 100644 node_modules/urlpattern-polyfill/index.js create mode 100644 node_modules/urlpattern-polyfill/package.json create mode 100644 node_modules/ws/LICENSE create mode 100644 node_modules/ws/LICENSE 2 create mode 100644 node_modules/ws/README 2.md create mode 100644 node_modules/ws/README.md create mode 100644 node_modules/ws/browser 2.js create mode 100644 node_modules/ws/browser.js create mode 100644 node_modules/ws/index 2.js create mode 100644 node_modules/ws/index.js create mode 100644 node_modules/ws/lib/buffer-util.js create mode 100644 node_modules/ws/lib/constants.js create mode 100644 node_modules/ws/lib/event-target.js create mode 100644 node_modules/ws/lib/extension.js create mode 100644 node_modules/ws/lib/limiter.js create mode 100644 node_modules/ws/lib/permessage-deflate.js create mode 100644 node_modules/ws/lib/receiver.js create mode 100644 node_modules/ws/lib/sender.js create mode 100644 node_modules/ws/lib/stream.js create mode 100644 node_modules/ws/lib/subprotocol.js create mode 100644 node_modules/ws/lib/validation.js create mode 100644 node_modules/ws/lib/websocket-server.js create mode 100644 node_modules/ws/lib/websocket.js create mode 100644 node_modules/ws/package 2.json create mode 100644 node_modules/ws/package.json create mode 100644 node_modules/ws/wrapper 2.mjs create mode 100644 node_modules/ws/wrapper.mjs create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/_includes/base.njk create mode 100644 src/css/style.css create mode 100644 src/index.md delete mode 100644 static/fonts/b612-regular.ttf delete mode 100644 static/images/Twitter Banner.psd delete mode 100644 static/images/dns-witch-social-logo.png delete mode 100644 static/images/icon.svg delete mode 100644 static/images/twitter_banner.png delete mode 100644 static/images/undraw_link_shortener_mvf6.svg delete mode 100644 static/images/witch-svgrepo-com-svg-background.png delete mode 100644 static/images/witch-svgrepo-com-svg-background.svg delete mode 100644 static/images/witch-svgrepo-com.svg delete mode 100644 themes/juice/.gitignore delete mode 100644 themes/juice/README.md delete mode 100644 themes/juice/config.toml delete mode 100644 themes/juice/content/_index.md delete mode 100644 themes/juice/content/about.md delete mode 100644 themes/juice/content/changelog.md delete mode 100644 themes/juice/content/cpp-search-extension.png delete mode 100644 themes/juice/content/favicon.ico delete mode 100644 themes/juice/content/go-search-extension.png delete mode 100644 themes/juice/content/juice.svg delete mode 100644 themes/juice/content/rust-search-extension.png delete mode 100644 themes/juice/content/showcases.md delete mode 100644 themes/juice/sass/_markdown.scss delete mode 100644 themes/juice/sass/_text.scss delete mode 100644 themes/juice/sass/_ultility.scss delete mode 100644 themes/juice/sass/juice.scss delete mode 100644 themes/juice/screenshot.png delete mode 100644 themes/juice/static/fonts/b612-regular.ttf delete mode 100644 themes/juice/static/normalize.css delete mode 100644 themes/juice/templates/_macros.html delete mode 100644 themes/juice/templates/_variables.html delete mode 100644 themes/juice/templates/index.html delete mode 100644 themes/juice/templates/page.html delete mode 100644 themes/juice/templates/shortcodes/issue.html delete mode 100644 themes/juice/theme.toml delete mode 100644 themes/juice/vercel.json diff --git a/.eleventy.js b/.eleventy.js new file mode 100644 index 0000000..5d947b0 --- /dev/null +++ b/.eleventy.js @@ -0,0 +1,12 @@ +module.exports = function (eleventyConfig) { + eleventyConfig.addPassthroughCopy("./src/css"); + eleventyConfig.addWatchTarget("./src/css"); + eleventyConfig.addPassthroughCopy("./src/img"); + eleventyConfig.addWatchTarget("./src/img"); + return { + dir: { + input: "src", + output: "public", + }, + }; +}; \ No newline at end of file diff --git a/LICENSE b/LICENSE index 11ee9d9..531f5f2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,23 +1,36 @@ -Attribution Assurance License +* ACAB License -Copyright (c) 2002 by AUTHOR PROFESSIONAL IDENTIFICATION * URL "PROMOTIONAL SLOGAN FOR AUTHOR'S PROFESSIONAL PRACTICE" +© 2020 John Grey -All Rights Reserved +To the maximum extent applicable by law, and any licenses of components of this work: -ATTRIBUTION ASSURANCE LICENSE (adapted from the original BSD license) +** Permissions: + Except as prohibited below, any individual, group, organization, charity, business entity or university + may use, modify, and distribute source code and software utilising this work. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the conditions below are met. These conditions require a modest attribution to (the "Author"), who hopes that its promotional value may help justify the thousands of dollars in otherwise billable time invested in writing this and other freely available, open-source software. + Users may extend this license, so long as these initial conditions remain in force. -1. Redistributions of source code, in whole or part and with or without modification (the "Code"), must prominently display this GPG-signed text in verifiable form. +** Obligations: + Users of this work are obligated to freely provide public access to AI scripts written to be used by this work. -2. Redistributions of the Code in binary form must be accompanied by this GPG-signed text in any documentation and, each time the resulting executable program or a program dependent thereon is launched, a prominent display (e.g., splash screen or banner text) of the Author's attribution information, which includes: - (a) Name ("AUTHOR"), - (b) Professional identification ("PROFESSIONAL IDENTIFICATION"), and - (c) URL ("URL"). +** Prohibitions: + No Law Enforcement, Carceral Institutions, or Immigration enforcement entities may use the work or products of the work. + For any reason, be it for simulation, production of propaganda, or otherwise. -3. Neither the name nor any trademark of the Author may be used to endorse or promote products derived from this software without specific prior written permission. + No business entity where the ratio of pay (salaried, freelance, stocks, or other benefits) + between the highest and lowest individual in the entity is greater than 50 : 1 + may use the work for any reason. -4. Users are entirely responsible, to the exclusion of the Author and any other persons, for compliance with (1) regulations set by owners or administrators of employed equipment, (2) licensing terms of any other software, and (3) local regulations regarding use, including those regarding import, export, and use of encryption software. + Business entities with boards/management comprising less than 1/2 POC may not use the work for any reason. -THIS FREE SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR ANY CONTRIBUTOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, EFFECTS OF UNAUTHORIZED OR MALICIOUS NETWORK ACCESS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + No individual or entity may use this work for racist or bigoted purposes. + + Users must not remove this license from the work. + + +** Sanction + Users recognise breach of the above terms may be sanctioned to the maximum extent applicable by law. + +** Warranty + No warranty, liability, or fitness for purpose is implied. \ No newline at end of file diff --git a/README.md b/README.md index 2a3988d..430c7e1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ -# dns-witch.net.eu.org +# dns-witch.net -DNS Witch website. +DNS-Witch.net.eu.org website + +Made with 11ty \ No newline at end of file diff --git a/config.toml b/config.toml deleted file mode 100644 index f57b690..0000000 --- a/config.toml +++ /dev/null @@ -1,46 +0,0 @@ -# The URL the site will be built for -base_url = "https://dns-witch.net.eu.org" - -default_language = "en" - -# Whether to automatically compile all Sass files in the sass directory -compile_sass = true - -# Whether to build a search index to be used later on by a JavaScript library -build_search_index = true - -theme = "juice" - -[languages] - -[languages.en] -title = "DNS Witch" -description = "Free domain names for everyone" - -[languages.fr] -title = "DNS Witch" -description = "Noms de domaines gratuits et accessibles" - -[languages.en.translations] -hero_heading_text = "Summon your domain" -hero_title_text = "DNS Witch makes .eu.org domains accessible." -explore_more_text = "Explore More ⇩" -content_heading_text = "Overview" - -[languages.fr.translations] -hero_heading_text = "Invoquez votre domaine" -hero_title_text = "DNS Witch rend les domaines .eu.org accessibles." -explore_more_text = "En savoir plus ⇩" -content_heading_text = "Aperçu" - -[extra] -# Put all your custom variables here -juice_logo_name = "DNS Witch" -juice_logo_path = "/images/witch-svgrepo-com.svg" -juice_social_logo_path = "/images/dns-witch-social-logo.png" - -# Language choose -juice_extra_menu = [ - { title = "Francophone", link = "fr" }, - { title = "Anglophone", link = "/" } -] diff --git a/content/_index.fr.md b/content/_index.fr.md deleted file mode 100644 index e60563f..0000000 --- a/content/_index.fr.md +++ /dev/null @@ -1,39 +0,0 @@ -+++ -title = "DNS Witch" -sort_by = "weight" -+++ - -# DNS Witch - -## C’est quoi -DNS Witch est un service tenu bénévolement, qui propose de gérer pour vous la [zone DNS](https://yunohost.org/#/dns_config) de votre domaine .eu.org. - -# Pourquoi ? -[EU.org](https://nic.eu.org/fr/) propose des domaines gratuits en déléguant la gestion de ces derniers à l’utilisateur·utilisatrice. L’accessibilité d’un .eu.org est donc limitée à un petit groupe de personnes possédant les connaissances techniques nécessaires, ainsi que les ressources en matériel et en temps. - -Dans l’idée d’initiatives telles que [Yunohost](https://yunohost.org), la volonté derrière DNS Witch est d’agrandir l’accessibilité du service proposé par EU.org, en prenant en charge la partie la plus technique. - -# Pour qui ? -Tout le monde, de la personne lambda, à un·une technicien·technicienne qui souhaiterait avoir un nom de domaine sans y passer trop de temps. Les associations et autres structures non-lucratives sont également les bienvenues. - -# Comment ? -En mutualisant une zone faisant autorité, afin de gérer plusieurs noms de domaines aux propriétaires différents sur un seul serveur de noms. - -L’assistance technique est faite en s’appuyant sur de la documentation déjà existante, afin de gagner le maximum de temps et d’efficacité pour répondre au mieux à toutes les requêtes. - -# Inscription -Pour profiter des services de DNS Witch, envoyez un mail à l’adresse que vous trouverez en suivant [ce lien](https://mailhide.io/e/vW7r7zXS). Pour vous faciliter la rédaction du mail, nous vous invitons à suivre le format ci-dessous. Nous vous rappelons qu’en tant que propriétaire d’un domaine .eu.org, il est nécessaire que vous suiviez [la charte de EU.org](https://nic.eu.org/fr/policy.html). - -> ## Informations techniques -> - Domaine souhaité -> - Adresse IP vers laquelle le domaine doit pointer (si plusieurs adresses, les séparer par un /) -> - Uniquement pour les serveurs Yunohost, un copié-collé des lignes obtenues en suivant [cette documentation](https://yunohost.org/fr/dns_config#configuration-dns-recomma) -> ## Informations de contact -> - Prénom Nom* -> - Adresse postale* -> - Adresse email -> - Numéro de téléphone* - -\* informations facultatives - -Nous nous chargerons d’enregistrer au plus vite votre nom de domaine sur [EU.org](https://nic.eu.org/fr). Ce service étant bénévole, il est possible qu’un délai de quelques heures s’applique entre l’envoi de votre mail et le traitement de votre requête. diff --git a/content/_index.md b/content/_index.md deleted file mode 100644 index 3e5152a..0000000 --- a/content/_index.md +++ /dev/null @@ -1,39 +0,0 @@ -+++ -title = "DNS Witch" -sort_by = "weight" -+++ - -# DNS Witch - -## What's this -DNS Witch is a voluntary service that manages the [DNS zone](https://yunohost.org/#/dns_config) of your .eu.org domain for you. - -# Why ? -[EU.org](https://nic.eu.org/) offers free domains by delegating their management to the user. The accessibility of a .eu.org is therefore limited to a small group of people with the necessary technical knowledge, as well as the material and time resources. - -In the idea of ​​initiatives such as [Yunohost](https://yunohost.org), the will behind DNS Witch is to enlarge the accessibility of the service offered by EU.org, taking care of the most technical part. - -# For who ? -Everyone, from the average person, to a technician who would like to have a domain name without spending too much time on it. Associations and other non-profit structures are also welcome. - -# How? -By pooling an authoritative zone, in order to manage several domain names with different owners on a single name server. - -Technical assistance is provided based on existing documentation, in order to save as much time as possible and be more efficient in order to best respond to all requests. - -# Registration -To take advantage of DNS Witch's services, send an email to the address you will find by following [this link](https://mailhide.io/e/vW7r7zXS) . To make it easier for you to write the email, we invite you to follow the format below. We remind you that as the owner of a .eu.org domain, it is necessary that you follow [the EU.org policy](https://nic.eu.org/policy.html). - -> ## Technical informations -> - Desired domain -> - IP address to which the domain must point (if several addresses, separate them with a /) -> - Only for Yunohost servers, a copy-paste of the lines obtained by following [this documentation](https://yunohost.org/en/dns_config#recommended-dns-configura) -> ## Contact information -> - Firstname name* -> - Address* -> - E-mail address -> - Phone number* - -\* optional information - -We will take care of registering your domain name on [EU.org](https://nic.eu.org/) as soon as possible . This service being voluntary, it is possible that a delay of a few hours applies between the sending of your email and the processing of your request. diff --git a/node_modules/.bin/acorn b/node_modules/.bin/acorn new file mode 120000 index 0000000..cf76760 --- /dev/null +++ b/node_modules/.bin/acorn @@ -0,0 +1 @@ +../acorn/bin/acorn \ No newline at end of file diff --git a/node_modules/.bin/acorn 2 b/node_modules/.bin/acorn 2 new file mode 120000 index 0000000..cf76760 --- /dev/null +++ b/node_modules/.bin/acorn 2 @@ -0,0 +1 @@ +../acorn/bin/acorn \ No newline at end of file diff --git a/node_modules/.bin/eleventy b/node_modules/.bin/eleventy new file mode 120000 index 0000000..996774d --- /dev/null +++ b/node_modules/.bin/eleventy @@ -0,0 +1 @@ +../@11ty/eleventy/cmd.cjs \ No newline at end of file diff --git a/node_modules/.bin/eleventy 2 b/node_modules/.bin/eleventy 2 new file mode 120000 index 0000000..489851a --- /dev/null +++ b/node_modules/.bin/eleventy 2 @@ -0,0 +1 @@ +../@11ty/eleventy/cmd.js \ No newline at end of file diff --git a/node_modules/.bin/eleventy-dev-server b/node_modules/.bin/eleventy-dev-server new file mode 120000 index 0000000..31a8419 --- /dev/null +++ b/node_modules/.bin/eleventy-dev-server @@ -0,0 +1 @@ +../@11ty/eleventy-dev-server/cmd.js \ No newline at end of file diff --git a/node_modules/.bin/eleventy-dev-server 2 b/node_modules/.bin/eleventy-dev-server 2 new file mode 120000 index 0000000..31a8419 --- /dev/null +++ b/node_modules/.bin/eleventy-dev-server 2 @@ -0,0 +1 @@ +../@11ty/eleventy-dev-server/cmd.js \ No newline at end of file diff --git a/node_modules/.bin/errno b/node_modules/.bin/errno new file mode 120000 index 0000000..5a98e53 --- /dev/null +++ b/node_modules/.bin/errno @@ -0,0 +1 @@ +../errno/cli.js \ No newline at end of file diff --git a/node_modules/.bin/errno 2 b/node_modules/.bin/errno 2 new file mode 120000 index 0000000..5a98e53 --- /dev/null +++ b/node_modules/.bin/errno 2 @@ -0,0 +1 @@ +../errno/cli.js \ No newline at end of file diff --git a/node_modules/.bin/esparse b/node_modules/.bin/esparse new file mode 120000 index 0000000..7423b18 --- /dev/null +++ b/node_modules/.bin/esparse @@ -0,0 +1 @@ +../esprima/bin/esparse.js \ No newline at end of file diff --git a/node_modules/.bin/esvalidate b/node_modules/.bin/esvalidate new file mode 120000 index 0000000..16069ef --- /dev/null +++ b/node_modules/.bin/esvalidate @@ -0,0 +1 @@ +../esprima/bin/esvalidate.js \ No newline at end of file diff --git a/node_modules/.bin/js-yaml b/node_modules/.bin/js-yaml new file mode 120000 index 0000000..9dbd010 --- /dev/null +++ b/node_modules/.bin/js-yaml @@ -0,0 +1 @@ +../js-yaml/bin/js-yaml.js \ No newline at end of file diff --git a/node_modules/.bin/liquid b/node_modules/.bin/liquid new file mode 120000 index 0000000..b06ee5f --- /dev/null +++ b/node_modules/.bin/liquid @@ -0,0 +1 @@ +../liquidjs/bin/liquid.js \ No newline at end of file diff --git a/node_modules/.bin/liquid 2 b/node_modules/.bin/liquid 2 new file mode 120000 index 0000000..b06ee5f --- /dev/null +++ b/node_modules/.bin/liquid 2 @@ -0,0 +1 @@ +../liquidjs/bin/liquid.js \ No newline at end of file diff --git a/node_modules/.bin/liquidjs b/node_modules/.bin/liquidjs new file mode 120000 index 0000000..b06ee5f --- /dev/null +++ b/node_modules/.bin/liquidjs @@ -0,0 +1 @@ +../liquidjs/bin/liquid.js \ No newline at end of file diff --git a/node_modules/.bin/liquidjs 2 b/node_modules/.bin/liquidjs 2 new file mode 120000 index 0000000..b06ee5f --- /dev/null +++ b/node_modules/.bin/liquidjs 2 @@ -0,0 +1 @@ +../liquidjs/bin/liquid.js \ No newline at end of file diff --git a/node_modules/.bin/markdown-it b/node_modules/.bin/markdown-it new file mode 120000 index 0000000..8a64108 --- /dev/null +++ b/node_modules/.bin/markdown-it @@ -0,0 +1 @@ +../markdown-it/bin/markdown-it.mjs \ No newline at end of file diff --git a/node_modules/.bin/markdown-it 2 b/node_modules/.bin/markdown-it 2 new file mode 120000 index 0000000..894bcdb --- /dev/null +++ b/node_modules/.bin/markdown-it 2 @@ -0,0 +1 @@ +../markdown-it/bin/markdown-it.js \ No newline at end of file diff --git a/node_modules/.bin/mime b/node_modules/.bin/mime new file mode 120000 index 0000000..fbb7ee0 --- /dev/null +++ b/node_modules/.bin/mime @@ -0,0 +1 @@ +../mime/cli.js \ No newline at end of file diff --git a/node_modules/.bin/nunjucks-precompile b/node_modules/.bin/nunjucks-precompile new file mode 120000 index 0000000..3465a52 --- /dev/null +++ b/node_modules/.bin/nunjucks-precompile @@ -0,0 +1 @@ +../nunjucks/bin/precompile \ No newline at end of file diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver new file mode 120000 index 0000000..5aaadf4 --- /dev/null +++ b/node_modules/.bin/semver @@ -0,0 +1 @@ +../semver/bin/semver.js \ No newline at end of file diff --git a/node_modules/.bin/semver 2 b/node_modules/.bin/semver 2 new file mode 120000 index 0000000..5aaadf4 --- /dev/null +++ b/node_modules/.bin/semver 2 @@ -0,0 +1 @@ +../semver/bin/semver.js \ No newline at end of file diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 0000000..8d89027 --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,1560 @@ +{ + "name": "dns-witch.net", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/@11ty/dependency-tree": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-4.0.0.tgz", + "integrity": "sha512-PTOnwM8Xt+GdJmwRKg4pZ8EKAgGoK7pedZBfNSOChXu8MYk2FdEsxdJYecX4t62owpGw3xK60q9TQv/5JI59jw==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.1" + } + }, + "node_modules/@11ty/dependency-tree-esm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree-esm/-/dependency-tree-esm-2.0.0.tgz", + "integrity": "sha512-+4ySOON4aEAiyAGuH6XQJtxpGSpo6nibfG01krgix00sqjhman2+UaDUopq6Ksv8/jBB3hqkhsHe3fDE4z8rbA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.1", + "acorn": "^8.14.0", + "dependency-graph": "^1.0.0", + "normalize-path": "^3.0.0" + } + }, + "node_modules/@11ty/eleventy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-3.1.2.tgz", + "integrity": "sha512-IcsDlbXnBf8cHzbM1YBv3JcTyLB35EK88QexmVyFdVJVgUU6bh9g687rpxryJirHzo06PuwnYaEEdVZQfIgRGg==", + "license": "MIT", + "dependencies": { + "@11ty/dependency-tree": "^4.0.0", + "@11ty/dependency-tree-esm": "^2.0.0", + "@11ty/eleventy-dev-server": "^2.0.8", + "@11ty/eleventy-plugin-bundle": "^3.0.6", + "@11ty/eleventy-utils": "^2.0.7", + "@11ty/lodash-custom": "^4.17.21", + "@11ty/posthtml-urls": "^1.0.1", + "@11ty/recursive-copy": "^4.0.2", + "@sindresorhus/slugify": "^2.2.1", + "bcp-47-normalize": "^2.3.0", + "chokidar": "^3.6.0", + "debug": "^4.4.1", + "dependency-graph": "^1.0.0", + "entities": "^6.0.1", + "filesize": "^10.1.6", + "gray-matter": "^4.0.3", + "iso-639-1": "^3.1.5", + "js-yaml": "^4.1.0", + "kleur": "^4.1.5", + "liquidjs": "^10.21.1", + "luxon": "^3.6.1", + "markdown-it": "^14.1.0", + "minimist": "^1.2.8", + "moo": "^0.5.2", + "node-retrieve-globals": "^6.0.1", + "nunjucks": "^3.2.4", + "picomatch": "^4.0.2", + "please-upgrade-node": "^3.2.0", + "posthtml": "^0.16.6", + "posthtml-match-helper": "^2.0.3", + "semver": "^7.7.2", + "slugify": "^1.6.6", + "tinyglobby": "^0.2.14" + }, + "bin": { + "eleventy": "cmd.cjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-dev-server": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-dev-server/-/eleventy-dev-server-2.0.8.tgz", + "integrity": "sha512-15oC5M1DQlCaOMUq4limKRYmWiGecDaGwryr7fTE/oM9Ix8siqMvWi+I8VjsfrGr+iViDvWcH/TVI6D12d93mA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.1", + "chokidar": "^3.6.0", + "debug": "^4.4.0", + "finalhandler": "^1.3.1", + "mime": "^3.0.0", + "minimist": "^1.2.8", + "morphdom": "^2.7.4", + "please-upgrade-node": "^3.2.0", + "send": "^1.1.0", + "ssri": "^11.0.0", + "urlpattern-polyfill": "^10.0.0", + "ws": "^8.18.1" + }, + "bin": { + "eleventy-dev-server": "cmd.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-plugin-bundle": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-3.0.6.tgz", + "integrity": "sha512-wlEIMa1SEe6HE6ZyREEnPQiTw72337a2MPkyn0D1IzrqHrKU9euB17mv27LnnnyKvMJamCCqtU0985F5yyDL8g==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.2", + "debug": "^4.4.0", + "posthtml-match-helper": "^2.0.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-utils": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-2.0.7.tgz", + "integrity": "sha512-6QE+duqSQ0GY9rENXYb4iPR4AYGdrFpqnmi59tFp9VrleOl0QSh8VlBr2yd6dlhkdtj7904poZW5PvGr9cMiJQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/@11ty/eleventy/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@11ty/eleventy/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@11ty/eleventy/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@11ty/lodash-custom": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@11ty/lodash-custom/-/lodash-custom-4.17.21.tgz", + "integrity": "sha512-Mqt6im1xpb1Ykn3nbcCovWXK3ggywRJa+IXIdoz4wIIK+cvozADH63lexcuPpGS/gJ6/m2JxyyXDyupkMr5DHw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/posthtml-urls": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@11ty/posthtml-urls/-/posthtml-urls-1.0.1.tgz", + "integrity": "sha512-6EFN/yYSxC/OzYXpq4gXDyDMlX/W+2MgCvvoxf11X1z76bqkqFJ8eep5RiBWfGT5j0323a1pwpelcJJdR46MCw==", + "license": "MIT", + "dependencies": { + "evaluate-value": "^2.0.0", + "http-equiv-refresh": "^2.0.1", + "list-to-array": "^1.1.0", + "parse-srcset": "^1.0.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@11ty/recursive-copy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@11ty/recursive-copy/-/recursive-copy-4.0.2.tgz", + "integrity": "sha512-174nFXxL/6KcYbLYpra+q3nDbfKxLxRTNVY1atq2M1pYYiPfHse++3IFNl8mjPFsd7y2qQjxLORzIjHMjL3NDQ==", + "license": "ISC", + "dependencies": { + "errno": "^1.0.0", + "junk": "^3.1.0", + "maximatch": "^0.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sindresorhus/slugify": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", + "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/transliterate": "^1.0.0", + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/transliterate": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz", + "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-normalize": { + "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==", + "license": "MIT", + "dependencies": { + "bcp-47": "^2.0.0", + "bcp-47-match": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/errno/-/errno-1.0.0.tgz", + "integrity": "sha512-3zV5mFS1E8/1bPxt/B0xxzI1snsg3uSCIh6Zo1qKg6iMw93hzPANk9oBFzSFBFrwuVoQuE3rLoouAUfwOAj1wQ==", + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esm-import-transformer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/esm-import-transformer/-/esm-import-transformer-3.0.3.tgz", + "integrity": "sha512-Wj9kBIA9vKZRYAQzhe229M7wmWb2f3vTu86CkszZUy2/iiVCYljXm/EkwJtWKc0vup30WHhxbm3rpkysBKczxQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.2" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 10.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/http-equiv-refresh": { + "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==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "license": "ISC" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/iso-639-1": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-3.1.5.tgz", + "integrity": "sha512-gXkz5+KN7HrG0Q5UGqSMO2qB9AsbEeyLP54kF1YrMsIxmu+g4BdB7rflReZTSTZGpfj8wywu6pfPBCylPIzGQA==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/linkify-it": { + "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==", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/liquidjs": { + "version": "10.21.1", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.21.1.tgz", + "integrity": "sha512-NZXmCwv3RG5nire3fmIn9HsOyJX3vo+ptp0yaXUHAMzSNBhx74Hm+dAGJvscUA6lNqbLuYfXgNavRQ9UbUJhQQ==", + "license": "MIT", + "dependencies": { + "commander": "^10.0.0" + }, + "bin": { + "liquid": "bin/liquid.js", + "liquidjs": "bin/liquid.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/liquidjs" + } + }, + "node_modules/list-to-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/list-to-array/-/list-to-array-1.1.0.tgz", + "integrity": "sha512-+dAZZ2mM+/m+vY9ezfoueVvrgnHIGi5FvgSymbIgJOFwiznWyA59mav95L+Mc6xPtL3s9gm5eNTlNtxJLbNM1g==", + "license": "MIT" + }, + "node_modules/luxon": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", + "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "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.mjs" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/maximatch": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", + "integrity": "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==", + "license": "MIT", + "dependencies": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "license": "BSD-3-Clause" + }, + "node_modules/morphdom": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.5.tgz", + "integrity": "sha512-z6bfWFMra7kBqDjQGHud1LSXtq5JJC060viEkQFMBX6baIecpkNr2Ywrn2OQfWP3rXiNFQRPoFjD8/TvJcWcDg==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/node-retrieve-globals": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-6.0.1.tgz", + "integrity": "sha512-j0DeFuZ/Wg3VlklfbxUgZF/mdHMTEiEipBb3q0SpMMbHaV3AVfoUQF8UGxh1s/yjqO0TgRZd4Pi/x2yRqoQ4Eg==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.1", + "acorn-walk": "^8.3.4", + "esm-import-transformer": "^3.0.3" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "license": "MIT", + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/posthtml": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", + "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", + "license": "MIT", + "dependencies": { + "posthtml-parser": "^0.11.0", + "posthtml-render": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/posthtml-match-helper": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/posthtml-match-helper/-/posthtml-match-helper-2.0.3.tgz", + "integrity": "sha512-p9oJgTdMF2dyd7WE54QI1LvpBIkNkbSiiECKezNnDVYhGhD1AaOnAkw0Uh0y5TW+OHO8iBdSqnd8Wkpb6iUqmw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "posthtml": "^0.16.6" + } + }, + "node_modules/posthtml-parser": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", + "license": "MIT", + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml-render": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "license": "MIT", + "dependencies": { + "is-json": "^2.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT" + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-11.0.0.tgz", + "integrity": "sha512-aZpUoMN/Jj2MqA4vMCeiKGnc/8SuSyHbGSBdgFbZxP8OJGF/lFkIuElzPxsN0q8TQQ+prw3P4EDfB3TBHHgfXw==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "license": "MIT" + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/node_modules/@11ty/dependency-tree-esm/.github/workflows/ci.yml b/node_modules/@11ty/dependency-tree-esm/.github/workflows/ci.yml new file mode 100644 index 0000000..cccfbd7 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/.github/workflows/ci.yml @@ -0,0 +1,22 @@ +on: + push: + branches-ignore: + - "gh-pages" +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: ["ubuntu-latest", "macos-latest", "windows-latest"] + node: ["18", "20", "22"] + name: Node.js ${{ matrix.node }} on ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} + - run: npm install + - run: npm test +env: + YARN_GPG: no diff --git a/node_modules/@11ty/dependency-tree-esm/.github/workflows/release.yml b/node_modules/@11ty/dependency-tree-esm/.github/workflows/release.yml new file mode 100644 index 0000000..d527272 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/.github/workflows/release.yml @@ -0,0 +1,24 @@ +name: Publish Release to npm +on: + release: + types: [published] +permissions: read-all +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # 4.1.7 + - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # 4.0.3 + with: + node-version: "20" + registry-url: 'https://registry.npmjs.org' + - run: npm ci + - run: npm test + - if: ${{ github.event.release.tag_name != '' && env.NPM_PUBLISH_TAG != '' }} + run: npm publish --provenance --access=public --tag=${{ env.NPM_PUBLISH_TAG }} + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_PUBLISH_TAG: ${{ contains(github.event.release.tag_name, '-beta.') && 'beta' || 'latest' }} diff --git a/node_modules/@11ty/dependency-tree-esm/LICENSE b/node_modules/@11ty/dependency-tree-esm/LICENSE new file mode 100644 index 0000000..cb72e93 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Zach Leatherman + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@11ty/dependency-tree-esm/README.md b/node_modules/@11ty/dependency-tree-esm/README.md new file mode 100644 index 0000000..56b0f56 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/README.md @@ -0,0 +1,40 @@ +# `dependency-tree-esm` + +Returns an unordered array of local paths to dependencies of a Node ES module JavaScript file. + +* See also: [`dependency-tree`](https://github.com/11ty/eleventy-dependency-tree) for the CommonJS version. + +This is used by Eleventy to find dependencies of a JavaScript file to watch for changes to re-run Eleventy’s build. + +## Installation + +``` +npm install --save-dev @11ty/dependency-tree-esm +``` + +## Features + +* Ignores bare specifiers (e.g. `import "my-package"`) +* Ignores Node’s built-ins (e.g. `import "path"`) +* Handles circular dependencies +* Returns an empty set if the file does not exist. + +## Usage + +```js +// my-file.js + +// if my-local-dependency.js has dependencies, it will include those too +import "./my-local-dependency.js"; + + +// ignored, is a built-in +import path from "path"; +``` + +```js +const { find } = require("@11ty/dependency-tree-esm"); + +await find("./my-file.js"); +// returns ["./my-local-dependency.js"] +``` diff --git a/node_modules/@11ty/dependency-tree-esm/main.js b/node_modules/@11ty/dependency-tree-esm/main.js new file mode 100644 index 0000000..ad2e0d0 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/main.js @@ -0,0 +1,98 @@ +const path = require("path"); +const { existsSync } = require("fs"); +const { readFile } = require("fs/promises"); + +const acorn = require("acorn"); +const normalizePath = require("normalize-path"); +const { TemplatePath } = require("@11ty/eleventy-utils"); + +// Is *not* a bare specifier (e.g. 'some-package') +// https://nodejs.org/dist/latest-v18.x/docs/api/esm.html#terminology +function isNonBareSpecifier(importSource) { + // Change \\ to / on Windows + let normalized = normalizePath(importSource); + // Relative specifier (e.g. './startup.js') + if(normalized.startsWith("./") || normalized.startsWith("../")) { + return true; + } + // Absolute specifier (e.g. 'file:///opt/nodejs/config.js') + if(normalized.startsWith("file:")) { + return true; + } + + return false; +} + +function normalizeFilePath(filePath) { + return TemplatePath.standardizeFilePath(path.relative(".", filePath)); +} + +function normalizeImportSourceToFilePath(filePath, source) { + let { dir } = path.parse(filePath); + let normalized = path.join(dir, source); + return normalizeFilePath(normalized); +} + +function getImportAttributeType(attributes = []) { + for(let node of attributes) { + if(node.type === "ImportAttribute" && node.key.type === "Identifier" && node.key.name === "type") { + return node.value.value; + } + } +} + +async function findByContents(contents, filePath, alreadyParsedSet) { + // Should we use dependency-graph for these relationships? + let sources = new Set(); + let nestedSources = new Set(); + + let ast = acorn.parse(contents, {sourceType: "module", ecmaVersion: "latest"}); + + for(let node of ast.body) { + if(node.type === "ImportDeclaration" && isNonBareSpecifier(node.source.value)) { + let importAttributeType = getImportAttributeType(node?.attributes); + let normalized = normalizeImportSourceToFilePath(filePath, node.source.value); + if(normalized !== filePath) { + sources.add(normalized); + + // Right now only `css` and `json` are valid but others might come later + if(!importAttributeType) { + nestedSources.add(normalized); + } + } + } + } + + // Recurse for nested deps + for(let source of nestedSources) { + let s = await find(source, alreadyParsedSet); + for(let p of s) { + if(sources.has(p) || p === filePath) { + continue; + } + + sources.add(p); + } + } + + return Array.from(sources); +} + +async function find(filePath, alreadyParsedSet = new Set()) { + // TODO add a cache here + // Unfortunately we need to read the entire file, imports need to be at the top level but they can be anywhere 🫠 + let normalized = normalizeFilePath(filePath); + if(alreadyParsedSet.has(normalized) || !existsSync(filePath)) { + return []; + } + alreadyParsedSet.add(normalized); + + let contents = await readFile(normalized, { encoding: 'utf8' }); + let sources = await findByContents(contents, normalized, alreadyParsedSet); + + return sources; +} + +module.exports = { + find +}; \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree-esm/package.json b/node_modules/@11ty/dependency-tree-esm/package.json new file mode 100644 index 0000000..d49a094 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/package.json @@ -0,0 +1,38 @@ +{ + "name": "@11ty/dependency-tree-esm", + "version": "2.0.0", + "description": "Finds all JavaScript ES Module dependencies from a filename.", + "main": "main.js", + "scripts": { + "test": "npx ava" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/11ty/eleventy-dependency-tree-esm.git" + }, + "author": { + "name": "Zach Leatherman", + "email": "zach@zachleat.com", + "url": "https://zachleat.com/" + }, + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.1", + "acorn": "^8.14.0", + "dependency-graph": "^1.0.0", + "normalize-path": "^3.0.0" + }, + "devDependencies": { + "ava": "^6.2.0" + }, + "ava": { + "files": [ + "./test/*.js" + ], + "watchMode": { + "ignoreChanges": [ + "./test/stubs/**" + ] + } + } +} diff --git a/node_modules/@11ty/dependency-tree-esm/test/stubs/circular-child.js b/node_modules/@11ty/dependency-tree-esm/test/stubs/circular-child.js new file mode 100644 index 0000000..1b9ba5e --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/test/stubs/circular-child.js @@ -0,0 +1 @@ +import "./circular-parent.js"; \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree-esm/test/stubs/circular-parent.js b/node_modules/@11ty/dependency-tree-esm/test/stubs/circular-parent.js new file mode 100644 index 0000000..3153b84 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/test/stubs/circular-parent.js @@ -0,0 +1 @@ +import "./circular-child.js"; \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree-esm/test/stubs/circular-self.js b/node_modules/@11ty/dependency-tree-esm/test/stubs/circular-self.js new file mode 100644 index 0000000..267b293 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/test/stubs/circular-self.js @@ -0,0 +1,2 @@ +import "./circular-self.js"; +import "./empty.js"; \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree-esm/test/stubs/empty.js b/node_modules/@11ty/dependency-tree-esm/test/stubs/empty.js new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/@11ty/dependency-tree-esm/test/stubs/file.js b/node_modules/@11ty/dependency-tree-esm/test/stubs/file.js new file mode 100644 index 0000000..c97bcbb --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/test/stubs/file.js @@ -0,0 +1,2 @@ +import fs from "fs"; +import * as fdklsjf from "./imported-secondary.js"; \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree-esm/test/stubs/import-attributes.js b/node_modules/@11ty/dependency-tree-esm/test/stubs/import-attributes.js new file mode 100644 index 0000000..a4584e4 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/test/stubs/import-attributes.js @@ -0,0 +1,3 @@ +import eleventyPackage from "./imported.json" with { type: 'json' }; + +console.log( eleventyPackage ); \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree-esm/test/stubs/imported-secondary.js b/node_modules/@11ty/dependency-tree-esm/test/stubs/imported-secondary.js new file mode 100644 index 0000000..b70cefb --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/test/stubs/imported-secondary.js @@ -0,0 +1,3 @@ +import "fs"; + +export function hello() {} \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree-esm/test/stubs/imported.js b/node_modules/@11ty/dependency-tree-esm/test/stubs/imported.js new file mode 100644 index 0000000..479ee82 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/test/stubs/imported.js @@ -0,0 +1,3 @@ +import * as fdklsjf from "./imported-secondary.js"; + +export function hello() {} \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree-esm/test/stubs/imported.json b/node_modules/@11ty/dependency-tree-esm/test/stubs/imported.json new file mode 100644 index 0000000..f2aed13 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/test/stubs/imported.json @@ -0,0 +1,3 @@ +{ + "foo": "bar" +} \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree-esm/test/stubs/nested-grandchild.js b/node_modules/@11ty/dependency-tree-esm/test/stubs/nested-grandchild.js new file mode 100644 index 0000000..b533597 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/test/stubs/nested-grandchild.js @@ -0,0 +1 @@ +import * as fdklsjf from "./nested.js"; \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree-esm/test/stubs/nested.js b/node_modules/@11ty/dependency-tree-esm/test/stubs/nested.js new file mode 100644 index 0000000..26618f6 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/test/stubs/nested.js @@ -0,0 +1,2 @@ +import fs from "fs"; +import * as fdklsjf from "./imported.js"; \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree-esm/test/test.js b/node_modules/@11ty/dependency-tree-esm/test/test.js new file mode 100644 index 0000000..c777857 --- /dev/null +++ b/node_modules/@11ty/dependency-tree-esm/test/test.js @@ -0,0 +1,35 @@ +const test = require("ava"); +const { find } = require("../main.js"); + +test("Empty", async t => { + t.deepEqual(await find("./test/stubs/empty.js"), []); +}); + +test("Doesn’t exist", async t => { + t.deepEqual(await find("./test/stubs/THIS_FILE_DOES_NOT_EXIST.js"), []); +}); + +test("Simple", async t => { + t.deepEqual(await find("./test/stubs/file.js"), ["./test/stubs/imported-secondary.js"]); +}); + +test("Nested two deep", async t => { + t.deepEqual(await find("./test/stubs/nested.js"), ["./test/stubs/imported.js", "./test/stubs/imported-secondary.js"]); +}); + +test("Nested three deep", async t => { + t.deepEqual(await find("./test/stubs/nested-grandchild.js"), ["./test/stubs/nested.js", "./test/stubs/imported.js", "./test/stubs/imported-secondary.js"]); +}); + +test("Circular", async t => { + t.deepEqual(await find("./test/stubs/circular-parent.js"), ["./test/stubs/circular-child.js"]); +}); + +test("Circular Self Reference", async t => { + t.deepEqual(await find("./test/stubs/circular-self.js"), ["./test/stubs/empty.js"]); +}); + +// https://github.com/11ty/eleventy-dependency-tree-esm/issues/2 +test("Import Attributes, issue #2", async t => { + t.deepEqual(await find("./test/stubs/import-attributes.js"), ["./test/stubs/imported.json"]); +}); diff --git a/node_modules/@11ty/dependency-tree/LICENSE b/node_modules/@11ty/dependency-tree/LICENSE new file mode 100644 index 0000000..bad6417 --- /dev/null +++ b/node_modules/@11ty/dependency-tree/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Zach Leatherman + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@11ty/dependency-tree/LICENSE 2 b/node_modules/@11ty/dependency-tree/LICENSE 2 new file mode 100644 index 0000000..629c31b --- /dev/null +++ b/node_modules/@11ty/dependency-tree/LICENSE 2 @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Eleventy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@11ty/dependency-tree/README 2.md b/node_modules/@11ty/dependency-tree/README 2.md new file mode 100644 index 0000000..b7fa19c --- /dev/null +++ b/node_modules/@11ty/dependency-tree/README 2.md @@ -0,0 +1,92 @@ +# dependency-tree + +Returns an unordered array of local paths to dependencies of a node JavaScript file (everything it or any of its dependencies `require`s). + +Reduced feature (faster) alternative to the [`dependency-tree` package](https://www.npmjs.com/package/dependency-tree) that only works with stock node JS. This is used by Eleventy to find dependencies of a JavaScript file to watch for changes to re-run Eleventy’s build. + +## Big Huge Caveat + +⚠ A big caveat to this plugin is that it will require the file in order to build a dependency tree. So if your module has side effects and you don’t want it to execute—do not use this! + +## Installation + +``` +npm install --save-dev @11ty/dependency-tree +``` + +## Features + +* Ignores `node_modules` +* Or, use `nodeModuleNamesOnly` to return a list of node_modules packages (added in v2.0.0) +* Ignores Node’s built-ins (e.g. `path`) +* Handles circular dependencies (Node does this too) + +## Usage + +```js +// my-file.js + +// if my-local-dependency.js has dependencies, it will include those too +const test = require("./my-local-dependency.js"); + +// ignored, is a built-in +const path = require("path"); +``` + +```js +const DependencyTree = require("@11ty/dependency-tree"); + +DependencyTree("./my-file.js"); +// returns ["./my-local-dependency.js"] +``` + +### `allowNotFound` + +```js +const DependencyTree = require("@11ty/dependency-tree"); + +DependencyTree("./this-does-not-exist.js"); // throws an error + +DependencyTree("./this-does-not-exist.js", { allowNotFound: true }); +// returns [] +``` + +### `nodeModuleNames` + +(Added in v2.0.1) Controls whether or not node package names are included in the list of dependencies. + +* `nodeModuleNames: "include"`: included alongside the local JS files. +* `nodeModuleNames: "exclude"` (default): node module package names are excluded. +* `nodeModuleNames: "only"`: only node module package names are returned. + +```js +// my-file.js: + +require("./my-local-dependency.js"); +require("@11ty/eleventy"); +``` + +```js +const DependencyTree = require("@11ty/dependency-tree"); + +DependencyTree("./my-file.js"); +// returns ["./my-local-dependency.js"] + +DependencyTree("./my-file.js", { nodeModuleNames: "exclude" }); +// returns ["./my-local-dependency.js"] + +DependencyTree("./my-file.js", { nodeModuleNames: "include" }); +// returns ["./my-local-dependency.js", "@11ty/eleventy"] + +DependencyTree("./my-file.js", { nodeModuleNames: "only" }); +// returns ["@11ty/eleventy"] +``` + +#### (Deprecated) `nodeModuleNamesOnly` + +(Added in v2.0.0) Changed to use `nodeModuleNames` option instead. Backwards compatibility is maintained automatically. + +* `nodeModuleNamesOnly: false` is mapped to `nodeModuleNames: "exclude"` +* `nodeModuleNamesOnly: true` is mapped to `nodeModuleNames: "only"` + +If both `nodeModuleNamesOnly` and `nodeModuleNames` are included in options, `nodeModuleNames` takes precedence. \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree/README.md b/node_modules/@11ty/dependency-tree/README.md new file mode 100644 index 0000000..110ab3a --- /dev/null +++ b/node_modules/@11ty/dependency-tree/README.md @@ -0,0 +1,94 @@ +# `dependency-tree` + +Returns an unordered array of local paths to dependencies of a CommonJS node JavaScript file (everything it or any of its dependencies `require`s). + +* See also: [`dependency-tree-esm`](https://github.com/11ty/eleventy-dependency-tree-esm) for ES Modules. + +Reduced feature (faster) alternative to the [`dependency-tree` package](https://www.npmjs.com/package/dependency-tree). This is used by Eleventy to find dependencies of a JavaScript file to watch for changes to re-run Eleventy’s build. + +## Big Huge Caveat + +⚠ A big caveat to this plugin is that it will require the file in order to build a dependency tree. So if your module has side effects and you don’t want it to execute—do not use this! + +## Installation + +``` +npm install --save-dev @11ty/dependency-tree +``` + +## Features + +* Ignores `node_modules` +* Or, use `nodeModuleNames` to control whether or not `node_modules` package names are included (added in v2.0.1) +* Ignores Node’s built-ins (e.g. `path`) +* Handles circular dependencies (Node does this too) + +## Usage + +```js +// my-file.js + +// if my-local-dependency.js has dependencies, it will include those too +const test = require("./my-local-dependency.js"); + +// ignored, is a built-in +const path = require("path"); +``` + +```js +const DependencyTree = require("@11ty/dependency-tree"); + +DependencyTree("./my-file.js"); +// returns ["./my-local-dependency.js"] +``` + +### `allowNotFound` + +```js +const DependencyTree = require("@11ty/dependency-tree"); + +DependencyTree("./this-does-not-exist.js"); // throws an error + +DependencyTree("./this-does-not-exist.js", { allowNotFound: true }); +// returns [] +``` + +### `nodeModuleNames` + +(Added in v2.0.1) Controls whether or not node package names are included in the list of dependencies. + +* `nodeModuleNames: "include"`: included alongside the local JS files. +* `nodeModuleNames: "exclude"` (default): node module package names are excluded. +* `nodeModuleNames: "only"`: only node module package names are returned. + +```js +// my-file.js: + +require("./my-local-dependency.js"); +require("@11ty/eleventy"); +``` + +```js +const DependencyTree = require("@11ty/dependency-tree"); + +DependencyTree("./my-file.js"); +// returns ["./my-local-dependency.js"] + +DependencyTree("./my-file.js", { nodeModuleNames: "exclude" }); +// returns ["./my-local-dependency.js"] + +DependencyTree("./my-file.js", { nodeModuleNames: "include" }); +// returns ["./my-local-dependency.js", "@11ty/eleventy"] + +DependencyTree("./my-file.js", { nodeModuleNames: "only" }); +// returns ["@11ty/eleventy"] +``` + +#### (Deprecated) `nodeModuleNamesOnly` + +(Added in v2.0.0) Changed to use `nodeModuleNames` option instead. Backwards compatibility is maintained automatically. + +* `nodeModuleNamesOnly: false` is mapped to `nodeModuleNames: "exclude"` +* `nodeModuleNamesOnly: true` is mapped to `nodeModuleNames: "only"` + +If both `nodeModuleNamesOnly` and `nodeModuleNames` are included in options, `nodeModuleNames` takes precedence. diff --git a/node_modules/@11ty/dependency-tree/main 2.js b/node_modules/@11ty/dependency-tree/main 2.js new file mode 100644 index 0000000..8d0df87 --- /dev/null +++ b/node_modules/@11ty/dependency-tree/main 2.js @@ -0,0 +1,120 @@ +const path = require("path"); + +function getAbsolutePath(filename) { + let normalizedFilename = path.normalize(filename); // removes dot slash + let hasDotSlash = filename.startsWith("./"); + return hasDotSlash ? path.join(path.resolve("."), normalizedFilename) : normalizedFilename; +} + +function getRelativePath(filename) { + let normalizedFilename = path.normalize(filename); // removes dot slash + let workingDirectory = path.resolve("."); + let result = "./" + (normalizedFilename.startsWith(workingDirectory) ? normalizedFilename.substr(workingDirectory.length + 1) : normalizedFilename); + return result; +} + +function getNodeModuleName(filename) { + let foundNodeModules = false; + let moduleName = []; + + let s = filename.split(path.sep); + for(let entry of s) { + if(foundNodeModules) { + moduleName.push(entry); + if(!entry.startsWith("@")) { + return moduleName.join("/"); + } + } + + if(entry === "node_modules") { + foundNodeModules = true; + } + } + + return false; +} + +/* unordered */ +function getDependenciesFor(filename, avoidCircular, optionsArg = {}) { + // backwards compatibility with `nodeModuleNamesOnly` boolean option + // Using `nodeModuleNames` property moving forward + if(("nodeModuleNamesOnly" in optionsArg) && !("nodeModuleNames" in optionsArg)) { + if(optionsArg.nodeModuleNamesOnly === true) { + optionsArg.nodeModuleNames = "only"; + } + if(optionsArg.nodeModuleNamesOnly === false) { + optionsArg.nodeModuleNames = "exclude"; + } + } + + let options = Object.assign({ + allowNotFound: false, + nodeModuleNames: "exclude", // also "include" or "only" + }, optionsArg); + let absoluteFilename = getAbsolutePath(filename) + + try { + require(absoluteFilename); + } catch(e) { + if(e.code === "MODULE_NOT_FOUND" && options.allowNotFound) { + // do nothing + } else { + throw e; + } + } + + + let mod; + for(let entry in require.cache) { + if(entry === absoluteFilename) { + mod = require.cache[entry]; + break; + } + } + + let dependencies = new Set(); + + if(!mod) { + if(!options.allowNotFound) { + throw new Error(`Could not find ${filename} in @11ty/dependency-tree`); + } + } else { + let relativeFilename = getRelativePath(mod.filename); + if(!avoidCircular) { + avoidCircular = {}; + } else if(options.nodeModuleNames !== "only") { + dependencies.add(relativeFilename); + } + + avoidCircular[relativeFilename] = true; + + if(mod.children) { + for(let child of mod.children) { + let relativeChildFilename = getRelativePath(child.filename); + let nodeModuleName = getNodeModuleName(child.filename); + + if(options.nodeModuleNames !== "exclude" && nodeModuleName) { + dependencies.add(nodeModuleName); + } + // Add dependencies of this dependency (not top level node_modules) + if(nodeModuleName === false) { + if(!dependencies.has(relativeChildFilename) && // avoid infinite looping with circular deps + !avoidCircular[relativeChildFilename] ) { + for(let dependency of getDependenciesFor(relativeChildFilename, avoidCircular, options)) { + dependencies.add(dependency); + } + } + } + } + } + } + + return dependencies; +} + +function getCleanDependencyListFor(filename, options = {}) { + return Array.from( getDependenciesFor(filename, null, options) ); +} + +module.exports = getCleanDependencyListFor; +module.exports.getNodeModuleName = getNodeModuleName; \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree/main.js b/node_modules/@11ty/dependency-tree/main.js new file mode 100644 index 0000000..9edf2be --- /dev/null +++ b/node_modules/@11ty/dependency-tree/main.js @@ -0,0 +1,132 @@ +const path = require("path"); +const { TemplatePath } = require("@11ty/eleventy-utils"); + +function getAbsolutePath(filename) { + let normalizedFilename = path.normalize(filename); // removes dot slash + let hasDotSlash = filename.startsWith("./"); + return hasDotSlash ? path.join(path.resolve("."), normalizedFilename) : normalizedFilename; +} + +function getRelativePath(filename) { + let normalizedFilename = path.normalize(filename); // removes dot slash + let workingDirectory = path.resolve("."); + let result = "./" + (normalizedFilename.startsWith(workingDirectory) ? normalizedFilename.substr(workingDirectory.length + 1) : normalizedFilename); + return result; +} + +function getNodeModuleName(filename) { + let foundNodeModules = false; + let moduleName = []; + + let s = filename.split(path.sep); + for(let entry of s) { + if(entry === '.pnpm') { + foundNodeModules = false; + } + + if(foundNodeModules) { + moduleName.push(entry); + if(!entry.startsWith("@")) { + return moduleName.join("/"); + } + } + + if(entry === "node_modules") { + foundNodeModules = true; + } + } + + return false; +} + +/* unordered */ +function getDependenciesFor(filename, avoidCircular, optionsArg = {}) { + // backwards compatibility with `nodeModuleNamesOnly` boolean option + // Using `nodeModuleNames` property moving forward + if(("nodeModuleNamesOnly" in optionsArg) && !("nodeModuleNames" in optionsArg)) { + if(optionsArg.nodeModuleNamesOnly === true) { + optionsArg.nodeModuleNames = "only"; + } + if(optionsArg.nodeModuleNamesOnly === false) { + optionsArg.nodeModuleNames = "exclude"; + } + } + + let options = Object.assign({ + allowNotFound: false, + nodeModuleNames: "exclude", // also "include" or "only" + }, optionsArg); + let absoluteFilename = getAbsolutePath(filename) + + try { + require(absoluteFilename); + } catch(e) { + if(e.code === "MODULE_NOT_FOUND" && options.allowNotFound) { + // do nothing + } else { + throw e; + } + } + + + let mod; + for(let entry in require.cache) { + if(entry === absoluteFilename) { + mod = require.cache[entry]; + break; + } + } + + let dependencies = new Set(); + + if(!mod) { + if(!options.allowNotFound) { + throw new Error(`Could not find ${filename} in @11ty/dependency-tree`); + } + } else { + let relativeFilename = getRelativePath(mod.filename); + if(!avoidCircular) { + avoidCircular = {}; + } else if(options.nodeModuleNames !== "only") { + dependencies.add(relativeFilename); + } + + avoidCircular[relativeFilename] = true; + + if(mod.children) { + for(let child of mod.children) { + let relativeChildFilename = getRelativePath(child.filename); + let nodeModuleName = getNodeModuleName(child.filename); + + if(options.nodeModuleNames !== "exclude" && nodeModuleName) { + dependencies.add(nodeModuleName); + } + // Add dependencies of this dependency (not top level node_modules) + if(nodeModuleName === false) { + if(!dependencies.has(relativeChildFilename) && // avoid infinite looping with circular deps + !avoidCircular[relativeChildFilename] ) { + for(let dependency of getDependenciesFor(relativeChildFilename, avoidCircular, options)) { + dependencies.add(dependency); + } + } + } + } + } + } + + return dependencies; +} + +function getCleanDependencyListFor(filename, options = {}) { + let deps = Array.from( getDependenciesFor(filename, null, options) ); + + return deps.map(filePath => { + if(filePath.startsWith("./")) { + return TemplatePath.standardizeFilePath(filePath); + } + return filePath; // node_module name + }); +} + +module.exports = getCleanDependencyListFor; +module.exports.getNodeModuleName = getNodeModuleName; \ No newline at end of file diff --git a/node_modules/@11ty/dependency-tree/package 2.json b/node_modules/@11ty/dependency-tree/package 2.json new file mode 100644 index 0000000..b323bd6 --- /dev/null +++ b/node_modules/@11ty/dependency-tree/package 2.json @@ -0,0 +1,30 @@ +{ + "name": "@11ty/dependency-tree", + "version": "2.0.1", + "description": "Finds all JavaScript require dependencies from a filename.", + "main": "main.js", + "scripts": { + "test": "npx ava" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/11ty/eleventy-dependency-tree.git" + }, + "author": { + "name": "Zach Leatherman", + "email": "zach@zachleat.com", + "url": "https://zachleat.com/" + }, + "license": "MIT", + "devDependencies": { + "ava": "^3.15.0" + }, + "ava": { + "files": [ + "./test/*.js" + ], + "ignoredByWatcher": [ + "./test/stubs/**" + ] + } +} diff --git a/node_modules/@11ty/dependency-tree/package.json b/node_modules/@11ty/dependency-tree/package.json new file mode 100644 index 0000000..0c24b6c --- /dev/null +++ b/node_modules/@11ty/dependency-tree/package.json @@ -0,0 +1,41 @@ +{ + "name": "@11ty/dependency-tree", + "version": "4.0.0", + "description": "Finds all JavaScript CommmonJS require() dependencies from a filename.", + "main": "main.js", + "files": [ + "main.js", + "!test", + "!test/**" + ], + "scripts": { + "test": "npx ava" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/11ty/eleventy-dependency-tree.git" + }, + "author": { + "name": "Zach Leatherman", + "email": "zach@zachleat.com", + "url": "https://zachleat.com/" + }, + "license": "MIT", + "ava": { + "files": [ + "./test/*.js" + ], + "watchMode": { + "ignoreChanged": [ + "./test/stubs/**" + ] + } + }, + "devDependencies": { + "@sindresorhus/is": "^4.6.0", + "ava": "^6.2.0" + }, + "dependencies": { + "@11ty/eleventy-utils": "^2.0.1" + } +} diff --git a/node_modules/@11ty/eleventy-dev-server/README 2.md b/node_modules/@11ty/eleventy-dev-server/README 2.md new file mode 100644 index 0000000..fcdb54c --- /dev/null +++ b/node_modules/@11ty/eleventy-dev-server/README 2.md @@ -0,0 +1,56 @@ +

11ty Logo

+ +# eleventy-dev-server 🕚⚡️🎈🐀 + +A minimal, modern, generic, hot-reloading local web server to help web developers. + +## ➡ [Documentation](https://www.11ty.dev/docs/watch-serve/#eleventy-dev-server) + +- Please star [Eleventy on GitHub](https://github.com/11ty/eleventy/)! +- Follow us on Twitter [@eleven_ty](https://twitter.com/eleven_ty) +- Support [11ty on Open Collective](https://opencollective.com/11ty) +- [11ty on npm](https://www.npmjs.com/org/11ty) +- [11ty on GitHub](https://github.com/11ty) + +[![npm Version](https://img.shields.io/npm/v/@11ty/eleventy-dev-server.svg?style=for-the-badge)](https://www.npmjs.com/package/@11ty/eleventy-dev-server) + +## Installation + +This is bundled with `@11ty/eleventy` (and you do not need to install it separately) in Eleventy v2.0. + +## CLI + +Eleventy Dev Server now also includes a CLI. The CLI is for **standalone** (non-Eleventy) use only: separate installation is unnecessary if you’re using this server with `@11ty/eleventy`. + +```sh +npm install -g @11ty/eleventy-dev-server + +# Alternatively, install locally into your project +npm install @11ty/eleventy-dev-server +``` + +This package requires Node 14 or newer. + +### CLI Usage + +```sh +# Serve the current directory +npx @11ty/eleventy-dev-server + +# Serve a different subdirectory (also aliased as --input) +npx @11ty/eleventy-dev-server --dir=_site + +# Disable the `domdiff` feature +npx @11ty/eleventy-dev-server --domdiff=false + +# Full command list in the Help +npx @11ty/eleventy-dev-server --help +``` + +## Tests + +``` +npm run test +``` + +- We use the [ava JavaScript test runner](https://github.com/avajs/ava) ([Assertions documentation](https://github.com/avajs/ava/blob/master/docs/03-assertions.md)) diff --git a/node_modules/@11ty/eleventy-dev-server/README.md b/node_modules/@11ty/eleventy-dev-server/README.md new file mode 100644 index 0000000..2d74590 --- /dev/null +++ b/node_modules/@11ty/eleventy-dev-server/README.md @@ -0,0 +1,60 @@ +

11ty Logo

+ +# eleventy-dev-server 🕚⚡️🎈🐀 + +A minimal, modern, generic, hot-reloading local web server to help web developers. + +## ➡ [Documentation](https://www.11ty.dev/docs/watch-serve/#eleventy-dev-server) + +- Please star [Eleventy on GitHub](https://github.com/11ty/eleventy/)! +- Follow us on Twitter [@eleven_ty](https://twitter.com/eleven_ty) +- Support [11ty on Open Collective](https://opencollective.com/11ty) +- [11ty on npm](https://www.npmjs.com/org/11ty) +- [11ty on GitHub](https://github.com/11ty) + +[![npm Version](https://img.shields.io/npm/v/@11ty/eleventy-dev-server.svg?style=for-the-badge)](https://www.npmjs.com/package/@11ty/eleventy-dev-server) + +## Installation + +This is bundled with `@11ty/eleventy` (and you do not need to install it separately) in Eleventy v2.0. + +## CLI + +Eleventy Dev Server now also includes a CLI. The CLI is for **standalone** (non-Eleventy) use only: separate installation is unnecessary if you’re using this server with `@11ty/eleventy`. + +```sh +npm install -g @11ty/eleventy-dev-server + +# Alternatively, install locally into your project +npm install @11ty/eleventy-dev-server +``` + +This package requires Node 18 or newer. + +### CLI Usage + +```sh +# Serve the current directory +npx @11ty/eleventy-dev-server + +# Serve a different subdirectory (also aliased as --input) +npx @11ty/eleventy-dev-server --dir=_site + +# Disable the `domdiff` feature +npx @11ty/eleventy-dev-server --domdiff=false + +# Full command list in the Help +npx @11ty/eleventy-dev-server --help +``` + +## Tests + +``` +npm run test +``` + +- We use the [ava JavaScript test runner](https://github.com/avajs/ava) ([Assertions documentation](https://github.com/avajs/ava/blob/master/docs/03-assertions.md)) + +## Changelog + +* `v2.0.0` bumps Node.js minimum to 18. \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-dev-server/cli 2.js b/node_modules/@11ty/eleventy-dev-server/cli 2.js new file mode 100644 index 0000000..35621eb --- /dev/null +++ b/node_modules/@11ty/eleventy-dev-server/cli 2.js @@ -0,0 +1,92 @@ +const chokidar = require("chokidar"); +const fs = require("fs"); + +const pkg = require("./package.json"); +const EleventyDevServer = require("./server.js"); + +const Logger = { + info: function(...args) { + console.log( "[11ty/eleventy-dev-server]", ...args ); + }, + error: function(...args) { + console.error( "[11ty/eleventy-dev-server]", ...args ); + }, + fatal: function(...args) { + Logger.error(...args); + process.exitCode = 1; + } +}; + +Logger.log = Logger.info; + +class Cli { + static getVersion() { + return pkg.version; + } + + static getHelp() { + return `Usage: + + eleventy-dev-server + eleventy-dev-server --dir=_site + eleventy-dev-server --port=3000 + +Arguments: + + --version + + --dir=. + Directory to serve (default: \`.\`) + + --input (alias for --dir) + + --port=8080 + Run the web server on this port (default: \`8080\`) + Will autoincrement if already in use. + + --domdiff (enabled, default) + --domdiff=false (disabled) + Apply HTML changes without a full page reload. + + --help`; + } + + static getDefaultOptions() { + return { + port: "8080", + input: ".", + domDiff: true, + } + } + + async serve(options = {}) { + this.options = Object.assign(Cli.getDefaultOptions(), options); + + this.server = EleventyDevServer.getServer("eleventy-dev-server-cli", this.options.input, { + // TODO allow server configuration extensions + showVersion: true, + logger: Logger, + domDiff: this.options.domDiff, + + // CLI watches all files in the folder by default + // this is different from Eleventy usage! + watch: [ this.options.input ], + }); + + this.server.serve(this.options.port); + + // TODO? send any errors here to the server too + // with server.sendError({ error }); + } + + close() { + if(this.server) { + this.server.close(); + } + } +} + +module.exports = { + Logger, + Cli +} diff --git a/node_modules/@11ty/eleventy-dev-server/cli.js b/node_modules/@11ty/eleventy-dev-server/cli.js new file mode 100644 index 0000000..04be1ca --- /dev/null +++ b/node_modules/@11ty/eleventy-dev-server/cli.js @@ -0,0 +1,89 @@ +const pkg = require("./package.json"); +const EleventyDevServer = require("./server.js"); + +const Logger = { + info: function(...args) { + console.log( "[11ty/eleventy-dev-server]", ...args ); + }, + error: function(...args) { + console.error( "[11ty/eleventy-dev-server]", ...args ); + }, + fatal: function(...args) { + Logger.error(...args); + process.exitCode = 1; + } +}; + +Logger.log = Logger.info; + +class Cli { + static getVersion() { + return pkg.version; + } + + static getHelp() { + return `Usage: + + eleventy-dev-server + eleventy-dev-server --dir=_site + eleventy-dev-server --port=3000 + +Arguments: + + --version + + --dir=. + Directory to serve (default: \`.\`) + + --input (alias for --dir) + + --port=8080 + Run the web server on this port (default: \`8080\`) + Will autoincrement if already in use. + + --domdiff (enabled, default) + --domdiff=false (disabled) + Apply HTML changes without a full page reload. + + --help`; + } + + static getDefaultOptions() { + return { + port: "8080", + input: ".", + domDiff: true, + } + } + + async serve(options = {}) { + this.options = Object.assign(Cli.getDefaultOptions(), options); + + this.server = EleventyDevServer.getServer("eleventy-dev-server-cli", this.options.input, { + // TODO allow server configuration extensions + showVersion: true, + logger: Logger, + domDiff: this.options.domDiff, + + // CLI watches all files in the folder by default + // this is different from Eleventy usage! + watch: [ this.options.input ], + }); + + this.server.serve(this.options.port); + + // TODO? send any errors here to the server too + // with server.sendError({ error }); + } + + close() { + if(this.server) { + return this.server.close(); + } + } +} + +module.exports = { + Logger, + Cli +} diff --git a/node_modules/@11ty/eleventy-dev-server/client/reload-client.js b/node_modules/@11ty/eleventy-dev-server/client/reload-client.js new file mode 100644 index 0000000..fc0ddd1 --- /dev/null +++ b/node_modules/@11ty/eleventy-dev-server/client/reload-client.js @@ -0,0 +1,336 @@ +class Util { + static pad(num, digits = 2) { + let zeroes = new Array(digits + 1).join(0); + return `${zeroes}${num}`.slice(-1 * digits); + } + + static log(message) { + Util.output("log", message); + } + static error(message, error) { + Util.output("error", message, error); + } + static output(type, ...messages) { + let now = new Date(); + let date = `${Util.pad(now.getUTCHours())}:${Util.pad( + now.getUTCMinutes() + )}:${Util.pad(now.getUTCSeconds())}.${Util.pad( + now.getUTCMilliseconds(), + 3 + )}`; + console[type](`[11ty][${date} UTC]`, ...messages); + } + + static capitalize(word) { + return word.substr(0, 1).toUpperCase() + word.substr(1); + } + + static matchRootAttributes(htmlContent) { + // Workaround for morphdom bug with attributes on https://github.com/11ty/eleventy-dev-server/issues/6 + // Note also `childrenOnly: true` above + const parser = new DOMParser(); + let parsed = parser.parseFromString(htmlContent, "text/html"); + let parsedDoc = parsed.documentElement; + let newAttrs = parsedDoc.getAttributeNames(); + + let docEl = document.documentElement; + // Remove old + let removedAttrs = docEl.getAttributeNames().filter(name => !newAttrs.includes(name)); + for(let attr of removedAttrs) { + docEl.removeAttribute(attr); + } + + // Add new + for(let attr of newAttrs) { + docEl.setAttribute(attr, parsedDoc.getAttribute(attr)); + } + } + + static isEleventyLinkNodeMatch(from, to) { + // Issue #18 https://github.com/11ty/eleventy-dev-server/issues/18 + // Don’t update a if the _11ty searchParam is the only thing that’s different + if(from.tagName !== "LINK" || to.tagName !== "LINK") { + return false; + } + + let oldWithoutHref = from.cloneNode(); + let newWithoutHref = to.cloneNode(); + + oldWithoutHref.removeAttribute("href"); + newWithoutHref.removeAttribute("href"); + + // if all other attributes besides href match + if(!oldWithoutHref.isEqualNode(newWithoutHref)) { + return false; + } + + let oldUrl = new URL(from.href); + let newUrl = new URL(to.href); + + // morphdom wants to force href="style.css?_11ty" => href="style.css" + let paramName = EleventyReload.QUERY_PARAM; + let isErasing = oldUrl.searchParams.has(paramName) && !newUrl.searchParams.has(paramName); + if(!isErasing) { + // not a match if _11ty has a new value (not being erased) + return false; + } + + oldUrl.searchParams.set(paramName, ""); + newUrl.searchParams.set(paramName, ""); + + // is a match if erasing and the rest of the href matches too + return oldUrl.toString() === newUrl.toString(); + } + + // https://github.com/patrick-steele-idem/morphdom/issues/178#issuecomment-652562769 + static runScript(source, target) { + let script = document.createElement('script'); + + // copy over the attributes + for(let attr of [...source.attributes]) { + script.setAttribute(attr.nodeName ,attr.nodeValue); + } + + script.innerHTML = source.innerHTML; + (target || source).replaceWith(script); + } + + static fullPageReload() { + Util.log(`Page reload initiated.`); + window.location.reload(); + } +} + +class EleventyReload { + static QUERY_PARAM = "_11ty"; + + static reloadTypes = { + css: (files, build = {}) => { + // Initiate a full page refresh if a CSS change is made but does match any stylesheet url + // `build.stylesheets` available in Eleventy v3.0.1-alpha.5+ + if(Array.isArray(build.stylesheets)) { + let match = false; + for (let link of document.querySelectorAll(`link[rel="stylesheet"]`)) { + if (link.href) { + let url = new URL(link.href); + if(build.stylesheets.includes(url.pathname)) { + match = true; + } + } + } + + if(!match) { + Util.fullPageReload(); + return; + } + } + + for (let link of document.querySelectorAll(`link[rel="stylesheet"]`)) { + if (link.href) { + let url = new URL(link.href); + url.searchParams.set(this.QUERY_PARAM, Date.now()); + link.href = url.toString(); + } + } + + Util.log(`CSS updated without page reload.`); + }, + default: async (files, build = {}) => { + let morphed = false; + let domdiffTemplates = (build?.templates || []).filter(({url, inputPath}) => { + return url === document.location.pathname && (files || []).includes(inputPath); + }); + + if(domdiffTemplates.length === 0) { + Util.fullPageReload(); + return; + } + + try { + // Important: using `./` allows the `.11ty` folder name to be changed + const { default: morphdom } = await import(`./morphdom.js`); + + for (let {url, inputPath, content} of domdiffTemplates) { + // Notable limitation: this won’t re-run script elements or JavaScript page lifecycle events (load/DOMContentLoaded) + morphed = true; + + morphdom(document.documentElement, content, { + childrenOnly: true, + onBeforeElUpdated: function (fromEl, toEl) { + if (fromEl.nodeName === "SCRIPT" && toEl.nodeName === "SCRIPT") { + if(toEl.innerHTML !== fromEl.innerHTML) { + Util.log(`JavaScript modified, reload initiated.`); + window.location.reload(); + } + + return false; + } + + // Speed-up trick from morphdom docs + // https://dom.spec.whatwg.org/#concept-node-equals + if (fromEl.isEqualNode(toEl)) { + return false; + } + + if(Util.isEleventyLinkNodeMatch(fromEl, toEl)) { + return false; + } + + return true; + }, + addChild: function(parent, child) { + // Declarative Shadow DOM https://github.com/11ty/eleventy-dev-server/issues/90 + if(child.nodeName === "TEMPLATE" && child.hasAttribute("shadowrootmode")) { + let root = parent.shadowRoot; + if(root) { + // remove all shadow root children + while(root.firstChild) { + root.removeChild(root.firstChild); + } + } + for(let newChild of child.content.childNodes) { + root.appendChild(newChild); + } + } else { + parent.appendChild(child); + } + }, + onNodeAdded: function (node) { + if (node.nodeName === 'SCRIPT') { + Util.log(`JavaScript added, reload initiated.`); + window.location.reload(); + } + }, + onElUpdated: function(node) { + // Re-attach custom elements + if(customElements.get(node.tagName.toLowerCase())) { + let placeholder = document.createElement("div"); + node.replaceWith(placeholder); + requestAnimationFrame(() => { + placeholder.replaceWith(node); + placeholder = undefined; + }); + } + } + }); + + Util.matchRootAttributes(content); + Util.log(`HTML delta applied without page reload.`); + } + } catch(e) { + Util.error( "Morphdom error", e ); + } + + if (!morphed) { + Util.fullPageReload(); + } + } + } + + constructor() { + this.connectionMessageShown = false; + this.reconnectEventCallback = this.reconnect.bind(this); + } + + init(options = {}) { + if (!("WebSocket" in window)) { + return; + } + + let documentUrl = new URL(document.location.href); + + let reloadPort = new URL(import.meta.url).searchParams.get("reloadPort"); + if(reloadPort) { + documentUrl.port = reloadPort; + } + + let { protocol, host } = documentUrl; + + // works with http (ws) and https (wss) + let websocketProtocol = protocol.replace("http", "ws"); + + let socket = new WebSocket(`${websocketProtocol}//${host}`); + + socket.addEventListener("message", async (event) => { + try { + let data = JSON.parse(event.data); + // Util.log( JSON.stringify(data, null, 2) ); + + let { type } = data; + + if (type === "eleventy.reload") { + await this.onreload(data); + } else if (type === "eleventy.msg") { + Util.log(`${data.message}`); + } else if (type === "eleventy.error") { + // Log Eleventy build errors + // Extra parsing for Node Error objects + let e = JSON.parse(data.error); + Util.error(`Build error: ${e.message}`, e); + } else if (type === "eleventy.status") { + // Full page reload on initial reconnect + if (data.status === "connected" && options.mode === "reconnect") { + window.location.reload(); + } + + if(data.status === "connected") { + // With multiple windows, only show one connection message + if(!this.isConnected) { + Util.log(Util.capitalize(data.status)); + } + + this.connectionMessageShown = true; + } else { + if(data.status === "disconnected") { + this.addReconnectListeners(); + } + + Util.log(Util.capitalize(data.status)); + } + } else { + Util.log("Unknown event type", data); + } + } catch (e) { + Util.error(`Error parsing ${event.data}: ${e.message}`, e); + } + }); + + socket.addEventListener("open", () => { + // no reconnection when the connect is already open + this.removeReconnectListeners(); + }); + + socket.addEventListener("close", () => { + this.connectionMessageShown = false; + this.addReconnectListeners(); + }); + } + + reconnect() { + Util.log( "Reconnecting…" ); + this.init({ mode: "reconnect" }); + } + + async onreload({ subtype, files, build }) { + if(!EleventyReload.reloadTypes[subtype]) { + subtype = "default"; + } + + await EleventyReload.reloadTypes[subtype](files, build); + } + + addReconnectListeners() { + this.removeReconnectListeners(); + + window.addEventListener("focus", this.reconnectEventCallback); + window.addEventListener("visibilitychange", this.reconnectEventCallback); + } + + removeReconnectListeners() { + window.removeEventListener("focus", this.reconnectEventCallback); + window.removeEventListener("visibilitychange", this.reconnectEventCallback); + } +} + +let reloader = new EleventyReload(); +reloader.init(); \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-dev-server/cmd 2.js b/node_modules/@11ty/eleventy-dev-server/cmd 2.js new file mode 100755 index 0000000..0cde317 --- /dev/null +++ b/node_modules/@11ty/eleventy-dev-server/cmd 2.js @@ -0,0 +1,69 @@ +#!/usr/bin/env node + +const pkg = require("./package.json"); + +// Node check +require("please-upgrade-node")(pkg, { + message: function (requiredVersion) { + return ( + "eleventy-dev-server requires Node " + + requiredVersion + + ". You will need to upgrade Node!" + ); + }, +}); + +const { Logger, Cli } = require("./cli.js"); + +const debug = require("debug")("EleventyDevServer:cmd"); + +try { + const argv = require("minimist")(process.argv.slice(2), { + string: [ + "dir", + "input", // alias for dir + "port", + ], + boolean: [ + "version", + "help", + "domdiff", + ], + default: Cli.getDefaultOptions(), + unknown: function (unknownArgument) { + throw new Error( + `We don’t know what '${unknownArgument}' is. Use --help to see the list of supported commands.` + ); + }, + }); + + debug("command: eleventy-dev-server %o", argv); + + process.on("unhandledRejection", (error, promise) => { + Logger.fatal("Unhandled rejection in promise:", promise, error); + }); + process.on("uncaughtException", (error) => { + Logger.fatal("Uncaught exception:", error); + }); + + if (argv.version) { + console.log(Cli.getVersion()); + } else if (argv.help) { + console.log(Cli.getHelp()); + } else { + let cli = new Cli(); + + cli.serve({ + input: argv.dir || argv.input, + port: argv.port, + domDiff: argv.domdiff, + }); + + process.on("SIGINT", () => { + cli.close(); + process.exit(); + }); + } +} catch (e) { + Logger.fatal("Fatal Error:", e) +} diff --git a/node_modules/@11ty/eleventy-dev-server/cmd.js b/node_modules/@11ty/eleventy-dev-server/cmd.js new file mode 100755 index 0000000..695b845 --- /dev/null +++ b/node_modules/@11ty/eleventy-dev-server/cmd.js @@ -0,0 +1,77 @@ +#!/usr/bin/env node + +const pkg = require("./package.json"); + +// Node check +require("please-upgrade-node")(pkg, { + message: function (requiredVersion) { + return ( + "eleventy-dev-server requires Node " + + requiredVersion + + ". You will need to upgrade Node!" + ); + }, +}); + +const { Logger, Cli } = require("./cli.js"); + +const debug = require("debug")("Eleventy:DevServer"); + +try { + const defaults = Cli.getDefaultOptions(); + for(let key in defaults) { + if(key.toLowerCase() !== key) { + defaults[key.toLowerCase()] = defaults[key]; + delete defaults[key]; + } + } + + const argv = require("minimist")(process.argv.slice(2), { + string: [ + "dir", + "input", // alias for dir + "port", + ], + boolean: [ + "version", + "help", + "domdiff", + ], + default: defaults, + unknown: function (unknownArgument) { + throw new Error( + `We don’t know what '${unknownArgument}' is. Use --help to see the list of supported commands.` + ); + }, + }); + + debug("command: eleventy-dev-server %o", argv); + + process.on("unhandledRejection", (error, promise) => { + Logger.fatal("Unhandled rejection in promise:", promise, error); + }); + process.on("uncaughtException", (error) => { + Logger.fatal("Uncaught exception:", error); + }); + + if (argv.version) { + console.log(Cli.getVersion()); + } else if (argv.help) { + console.log(Cli.getHelp()); + } else { + let cli = new Cli(); + + cli.serve({ + input: argv.dir || argv.input, + port: argv.port, + domDiff: argv.domdiff, + }); + + process.on("SIGINT", async () => { + await cli.close(); + process.exitCode = 0; + }); + } +} catch (e) { + Logger.fatal("Fatal Error:", e) +} diff --git a/node_modules/@11ty/eleventy-dev-server/package 2.json b/node_modules/@11ty/eleventy-dev-server/package 2.json new file mode 100644 index 0000000..4606b77 --- /dev/null +++ b/node_modules/@11ty/eleventy-dev-server/package 2.json @@ -0,0 +1,56 @@ +{ + "name": "@11ty/eleventy-dev-server", + "version": "1.0.4", + "description": "A minimal, modern, generic, hot-reloading local web server to help web developers.", + "main": "server.js", + "scripts": { + "test": "npx ava --verbose", + "sample": "node cmd.js --input=test/stubs" + }, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + }, + "bin": { + "eleventy-dev-server": "./cmd.js" + }, + "keywords": [ + "eleventy", + "server", + "cli" + ], + "publishConfig": { + "access": "public" + }, + "author": { + "name": "Zach Leatherman", + "email": "zachleatherman@gmail.com", + "url": "https://zachleat.com/" + }, + "repository": { + "type": "git", + "url": "git://github.com/11ty/eleventy-dev-server.git" + }, + "bugs": "https://github.com/11ty/eleventy-dev-server/issues", + "homepage": "https://github.com/11ty/eleventy-dev-server/", + "dependencies": { + "@11ty/eleventy-utils": "^1.0.1", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "dev-ip": "^1.0.1", + "finalhandler": "^1.2.0", + "mime": "^3.0.0", + "minimist": "^1.2.8", + "morphdom": "^2.7.0", + "please-upgrade-node": "^3.2.0", + "ssri": "^8.0.1", + "ws": "^8.13.0" + }, + "devDependencies": { + "ava": "^5.2.0" + } +} diff --git a/node_modules/@11ty/eleventy-dev-server/package.json b/node_modules/@11ty/eleventy-dev-server/package.json new file mode 100644 index 0000000..e413c7c --- /dev/null +++ b/node_modules/@11ty/eleventy-dev-server/package.json @@ -0,0 +1,57 @@ +{ + "name": "@11ty/eleventy-dev-server", + "version": "2.0.8", + "description": "A minimal, modern, generic, hot-reloading local web server to help web developers.", + "main": "server.js", + "scripts": { + "test": "npx ava --verbose", + "sample": "node cmd.js --input=test/stubs" + }, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + }, + "bin": { + "eleventy-dev-server": "./cmd.js" + }, + "keywords": [ + "eleventy", + "server", + "cli" + ], + "publishConfig": { + "access": "public" + }, + "author": { + "name": "Zach Leatherman", + "email": "zachleatherman@gmail.com", + "url": "https://zachleat.com/" + }, + "repository": { + "type": "git", + "url": "git://github.com/11ty/eleventy-dev-server.git" + }, + "bugs": "https://github.com/11ty/eleventy-dev-server/issues", + "homepage": "https://github.com/11ty/eleventy-dev-server/", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.1", + "chokidar": "^3.6.0", + "debug": "^4.4.0", + "finalhandler": "^1.3.1", + "mime": "^3.0.0", + "minimist": "^1.2.8", + "morphdom": "^2.7.4", + "please-upgrade-node": "^3.2.0", + "send": "^1.1.0", + "ssri": "^11.0.0", + "urlpattern-polyfill": "^10.0.0", + "ws": "^8.18.1" + }, + "devDependencies": { + "ava": "^6.2.0" + } +} diff --git a/node_modules/@11ty/eleventy-dev-server/server 2.js b/node_modules/@11ty/eleventy-dev-server/server 2.js new file mode 100644 index 0000000..aad4c38 --- /dev/null +++ b/node_modules/@11ty/eleventy-dev-server/server 2.js @@ -0,0 +1,807 @@ +const pkg = require("./package.json"); +const path = require("path"); +const fs = require("fs"); +const finalhandler = require("finalhandler"); +const WebSocket = require("ws"); +const { WebSocketServer } = WebSocket; +const mime = require("mime"); +const ssri = require("ssri"); +const devip = require("dev-ip"); +const chokidar = require("chokidar"); +const { TemplatePath } = require("@11ty/eleventy-utils"); + +const debug = require("debug")("EleventyDevServer"); + +const wrapResponse = require("./server/wrapResponse.js"); + +const DEFAULT_OPTIONS = { + port: 8080, + liveReload: true, // Enable live reload at all + showAllHosts: false, // IP address based hosts (other than localhost) + injectedScriptsFolder: ".11ty", // Change the name of the special folder used for injected scripts + portReassignmentRetryCount: 10, // number of times to increment the port if in use + https: {}, // `key` and `cert`, required for http/2 and https + domDiff: true, // Use morphdom to apply DOM diffing delta updates to HTML + showVersion: false, // Whether or not to show the server version on the command line. + encoding: "utf-8", // Default file encoding + pathPrefix: "/", // May be overridden by Eleventy, adds a virtual base directory to your project + watch: [], // Globs to pass to separate dev server chokidar for watching + aliases: {}, // Aliasing feature + + // Logger (fancier one is injected by Eleventy) + logger: { + info: console.log, + log: console.log, + error: console.error, + } +} + +class EleventyDevServer { + static getServer(...args) { + return new EleventyDevServer(...args); + } + + constructor(name, dir, options = {}) { + debug("Creating new Dev Server instance.") + this.name = name; + this.normalizeOptions(options); + + this.fileCache = {}; + // Directory to serve + if(!dir) { + throw new Error("Missing `dir` to serve."); + } + this.dir = dir; + this.logger = this.options.logger; + + if(this.options.watch.length > 0) { + this.getWatcher(); + } + } + + normalizeOptions(options = {}) { + this.options = Object.assign({}, DEFAULT_OPTIONS, options); + + // better names for options https://github.com/11ty/eleventy-dev-server/issues/41 + if(options.folder !== undefined) { + this.options.injectedScriptsFolder = options.folder; + delete this.options.folder; + } + if(options.domdiff !== undefined) { + this.options.domDiff = options.domdiff; + delete this.options.domdiff; + } + if(options.enabled !== undefined) { + this.options.liveReload = options.enabled; + delete this.options.enabled; + } + + this.options.pathPrefix = this.cleanupPathPrefix(this.options.pathPrefix); + } + + get watcher() { + if(!this._watcher) { + debug("Watching %O", this.options.watch); + // TODO if using Eleventy and `watch` option includes output folder (_site) this will trigger two update events! + this._watcher = chokidar.watch(this.options.watch, { + // TODO allow chokidar configuration extensions (or re-use the ones in Eleventy) + + ignored: ["**/node_modules/**", ".git"], + ignoreInitial: true, + + // same values as Eleventy + awaitWriteFinish: { + stabilityThreshold: 150, + pollInterval: 25, + }, + }); + + this._watcher.on("change", (path) => { + this.logger.log( `File changed: ${path} (skips build)` ); + this.reloadFiles([path]); + }); + + this._watcher.on("add", (path) => { + this.logger.log( `File added: ${path} (skips build)` ); + this.reloadFiles([path]); + }); + } + + return this._watcher; + } + + getWatcher() { + return this.watcher; + } + + watchFiles(files) { + if(Array.isArray(files)) { + files = files.map(entry => TemplatePath.stripLeadingDotSlash(entry)); + + debug("Also watching %O", files); + this.watcher.add(files); + } + } + + cleanupPathPrefix(pathPrefix) { + if(!pathPrefix || pathPrefix === "/") { + return "/"; + } + if(!pathPrefix.startsWith("/")) { + pathPrefix = `/${pathPrefix}` + } + if(!pathPrefix.endsWith("/")) { + pathPrefix = `${pathPrefix}/`; + } + return pathPrefix; + } + + // Allowed list of files that can be served from outside `dir` + setAliases(aliases) { + if(aliases) { + this.passthroughAliases = aliases; + debug( "Setting aliases (emulated passthrough copy) %O", aliases ); + } + } + + matchPassthroughAlias(url) { + let aliases = Object.assign({}, this.options.aliases, this.passthroughAliases); + for(let targetUrl in aliases) { + if(!targetUrl) { + continue; + } + + let file = aliases[targetUrl]; + if(url.startsWith(targetUrl)) { + let inputDirectoryPath = file + url.slice(targetUrl.length); + + // e.g. addPassthroughCopy("img/") but + // generated by the image plugin (written to the output folder) + // If they do not exist in the input directory, this will fallback to the output directory. + if(fs.existsSync(inputDirectoryPath)) { + return inputDirectoryPath; + } + } + } + return false; + } + + isFileInDirectory(dir, file) { + let absoluteDir = TemplatePath.absolutePath(dir); + let absoluteFile = TemplatePath.absolutePath(file); + return absoluteFile.startsWith(absoluteDir); + } + + getOutputDirFilePath(filepath, filename = "") { + let computedPath; + if(filename === ".html") { + // avoid trailing slash for filepath/.html requests + let prefix = path.join(this.dir, filepath); + if(prefix.endsWith(path.sep)) { + prefix = prefix.substring(0, prefix.length - path.sep.length); + } + computedPath = prefix + filename; + } else { + computedPath = path.join(this.dir, filepath, filename); + } + + computedPath = decodeURIComponent(computedPath); + + if(!filename) { // is a direct URL request (not an implicit .html or index.html add) + let alias = this.matchPassthroughAlias(filepath); + + if(alias) { + if(!this.isFileInDirectory(path.resolve("."), alias)) { + throw new Error("Invalid path"); + } + + return alias; + } + } + + // Check that the file is in the output path (error if folks try use `..` in the filepath) + if(!this.isFileInDirectory(this.dir, computedPath)) { + throw new Error("Invalid path"); + } + + return computedPath; + } + + isOutputFilePathExists(rawPath) { + return fs.existsSync(rawPath) && !TemplatePath.isDirectorySync(rawPath); + } + + /* Use conventions documented here https://www.zachleat.com/web/trailing-slash/ + * resource.html exists: + * /resource matches + * /resource/ redirects to /resource + * resource/index.html exists: + * /resource redirects to /resource/ + * /resource/ matches + * both resource.html and resource/index.html exists: + * /resource matches /resource.html + * /resource/ matches /resource/index.html + */ + mapUrlToFilePath(url) { + // Note: `localhost` is not important here, any host would work + let u = new URL(url, "http://localhost/"); + url = u.pathname; + + // Remove PathPrefix from start of URL + if (this.options.pathPrefix !== "/") { + // Requests to root should redirect to new pathPrefix + if(url === "/") { + return { + statusCode: 302, + url: this.options.pathPrefix, + } + } + + // Requests to anything outside of root should fail with 404 + if (!url.startsWith(this.options.pathPrefix)) { + return { + statusCode: 404, + }; + } + + url = url.slice(this.options.pathPrefix.length - 1); + } + + let rawPath = this.getOutputDirFilePath(url); + if (this.isOutputFilePathExists(rawPath)) { + return { + statusCode: 200, + filepath: rawPath, + }; + } + + let indexHtmlPath = this.getOutputDirFilePath(url, "index.html"); + let indexHtmlExists = fs.existsSync(indexHtmlPath); + + let htmlPath = this.getOutputDirFilePath(url, ".html"); + let htmlExists = fs.existsSync(htmlPath); + + // /resource/ => /resource/index.html + if (indexHtmlExists && url.endsWith("/")) { + return { + statusCode: 200, + filepath: indexHtmlPath, + }; + } + // /resource => resource.html + if (htmlExists && !url.endsWith("/")) { + return { + statusCode: 200, + filepath: htmlPath, + }; + } + + // /resource => redirect to /resource/ + if (indexHtmlExists && !url.endsWith("/")) { + return { + statusCode: 301, + url: url + "/", + }; + } + + // /resource/ => redirect to /resource + if (htmlExists && url.endsWith("/")) { + return { + statusCode: 301, + url: url.substring(0, url.length - 1), + }; + } + + return { + statusCode: 404, + }; + } + + _getFileContents(localpath, rootDir, useCache = true) { + if(this.fileCache[localpath]) { + return this.fileCache[localpath]; + } + + let filepath; + let searchLocations = []; + + if(rootDir) { + searchLocations.push(TemplatePath.absolutePath(rootDir, localpath)); + } + // fallbacks for file:../ installations + searchLocations.push(TemplatePath.absolutePath(__dirname, localpath)); + searchLocations.push(TemplatePath.absolutePath(__dirname, "../../../", localpath)); + + for(let loc of searchLocations) { + if(fs.existsSync(loc)) { + filepath = loc; + break; + } + } + + let contents = fs.readFileSync(filepath, { + encoding: this.options.encoding, + }); + if(useCache) { + this.fileCache[localpath] = contents; + } + return contents; + } + + augmentContentWithNotifier(content, inlineContents = false, options = {}) { + let { integrityHash, scriptContents } = options; + if(!scriptContents) { + scriptContents = this._getFileContents("./client/reload-client.js"); + } + if(!integrityHash) { + integrityHash = ssri.fromData(scriptContents); + } + + // This isn’t super necessary because it’s a local file, but it’s included anyway + let script = ``; + + if (content.includes("")) { + return content.replace("", `${script}`); + } + + // If the HTML document contains an importmap, insert the module script after the importmap element + let importMapRegEx = /`; + + if (content.includes("")) { + return content.replace("", `${script}`); + } + + // If the HTML document contains an importmap, insert the module script after the importmap element + let importMapRegEx = / + +``` + +* Existing calls via WebC helpers `getCss` or `getJs` (e.g. ` +{% endcss %} +* a way to declare dependencies? or just defer to buckets here +* What if we want to add code duplicates? Adding `alert(1);` `alert(1);` to alert twice? +* sourcemaps (maybe via magic-string module or https://www.npmjs.com/package/concat-with-sourcemaps) +--> \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-plugin-bundle/eleventy.bundle.js b/node_modules/@11ty/eleventy-plugin-bundle/eleventy.bundle.js new file mode 100644 index 0000000..35f571c --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-bundle/eleventy.bundle.js @@ -0,0 +1,72 @@ +import bundleManagersPlugin from "./src/eleventy.bundleManagers.js"; +import pruneEmptyBundlesPlugin from "./src/eleventy.pruneEmptyBundles.js"; +import globalShortcodesAndTransforms from "./src/eleventy.shortcodes.js"; +import debugUtil from "debug"; + +const debug = debugUtil("Eleventy:Bundle"); + +function normalizeOptions(options = {}) { + options = Object.assign({ + // Plugin defaults + + // Extra bundles + // css, js, and html are guaranteed unless `bundles: false` + bundles: [], + toFileDirectory: "bundle", + // post-process + transforms: [], + hoistDuplicateBundlesFor: [], + bundleExportKey: "bundle", // use a `bundle` export in a 11ty.js template to populate bundles + + force: false, // force overwrite of existing getBundleManagers and addBundle configuration API methods + }, options); + + if(options.bundles !== false) { + options.bundles = Array.from(new Set(["css", "js", "html", ...(options.bundles || [])])); + } + + return options; +} + +function eleventyBundlePlugin(eleventyConfig, pluginOptions = {}) { + eleventyConfig.versionCheck(">=3.0.0"); + pluginOptions = normalizeOptions(pluginOptions); + + let alreadyAdded = "getBundleManagers" in eleventyConfig || "addBundle" in eleventyConfig; + if(!alreadyAdded || pluginOptions.force) { + if(alreadyAdded && pluginOptions.force) { + debug("Bundle plugin already added via `addPlugin`, add was forced via `force: true`"); + } + + bundleManagersPlugin(eleventyConfig, pluginOptions); + } + + // These can’t be unique (don’t skip re-add above), when the configuration file resets they need to be added again + pruneEmptyBundlesPlugin(eleventyConfig, pluginOptions); + globalShortcodesAndTransforms(eleventyConfig, pluginOptions); + + // Support subsequent calls like addPlugin(BundlePlugin, { bundles: [] }); + if(Array.isArray(pluginOptions.bundles)) { + debug("Adding bundles via `addPlugin`: %o", pluginOptions.bundles) + pluginOptions.bundles.forEach(name => { + let isHoisting = Array.isArray(pluginOptions.hoistDuplicateBundlesFor) && pluginOptions.hoistDuplicateBundlesFor.includes(name); + + eleventyConfig.addBundle(name, { + hoist: isHoisting, + outputFileExtension: name, // default as `name` + shortcodeName: name, // `false` will skip shortcode + transforms: pluginOptions.transforms, + toFileDirectory: pluginOptions.toFileDirectory, + bundleExportKey: pluginOptions.bundleExportKey, // `false` will skip bundle export + }); + }); + } +}; + +// This is used to find the package name for this plugin (used in eleventy-plugin-webc to prevent dupes) +Object.defineProperty(eleventyBundlePlugin, "eleventyPackage", { + value: "@11ty/eleventy-plugin-bundle" +}); + +export default eleventyBundlePlugin; +export { normalizeOptions }; diff --git a/node_modules/@11ty/eleventy-plugin-bundle/package.json b/node_modules/@11ty/eleventy-plugin-bundle/package.json new file mode 100644 index 0000000..82e6f86 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-bundle/package.json @@ -0,0 +1,62 @@ +{ + "name": "@11ty/eleventy-plugin-bundle", + "version": "3.0.6", + "description": "Little bundles of code, little bundles of joy.", + "main": "eleventy.bundle.js", + "type": "module", + "scripts": { + "sample": "DEBUG=Eleventy:Bundle npx @11ty/eleventy --config=sample/sample-config.js --input=sample --serve", + "test": "npx ava" + }, + "publishConfig": { + "access": "public" + }, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + }, + "keywords": [ + "eleventy", + "eleventy-plugin" + ], + "repository": { + "type": "git", + "url": "git://github.com/11ty/eleventy-plugin-bundle.git" + }, + "bugs": "https://github.com/11ty/eleventy-plugin-bundle/issues", + "homepage": "https://www.11ty.dev/", + "author": { + "name": "Zach Leatherman", + "email": "zachleatherman@gmail.com", + "url": "https://zachleat.com/" + }, + "ava": { + "failFast": true, + "files": [ + "test/*.js", + "test/*.mjs" + ], + "watchMode": { + "ignoreChanges": [ + "**/_site/**", + ".cache" + ] + } + }, + "devDependencies": { + "@11ty/eleventy": "^3.0.0", + "ava": "^6.2.0", + "postcss": "^8.5.3", + "postcss-nested": "^7.0.2", + "sass": "^1.86.3" + }, + "dependencies": { + "@11ty/eleventy-utils": "^2.0.2", + "debug": "^4.4.0", + "posthtml-match-helper": "^2.0.3" + } +} diff --git a/node_modules/@11ty/eleventy-plugin-bundle/src/BundleFileOutput.js b/node_modules/@11ty/eleventy-plugin-bundle/src/BundleFileOutput.js new file mode 100644 index 0000000..332c5b7 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-bundle/src/BundleFileOutput.js @@ -0,0 +1,75 @@ +import fs from "node:fs"; +import path from "node:path"; +import debugUtil from "debug"; + +import { createHash } from "@11ty/eleventy-utils"; + +const debug = debugUtil("Eleventy:Bundle"); + +const hashCache = {}; +const directoryExistsCache = {}; +const writingCache = new Set(); + +class BundleFileOutput { + constructor(outputDirectory, bundleDirectory) { + this.outputDirectory = outputDirectory; + this.bundleDirectory = bundleDirectory || ""; + this.hashLength = 10; + this.fileExtension = undefined; + } + + setFileExtension(ext) { + this.fileExtension = ext; + } + + async getFilenameHash(content) { + if(hashCache[content]) { + return hashCache[content]; + } + + let base64hash = await createHash(content); + let filenameHash = base64hash.substring(0, this.hashLength); + hashCache[content] = filenameHash; + return filenameHash; + } + + getFilename(filename, extension) { + return filename + (extension && !extension.startsWith(".") ? `.${extension}` : ""); + } + + modifyPathToUrl(dir, filename) { + return "/" + path.join(dir, filename).split(path.sep).join("/"); + } + + async writeBundle(content, type, writeToFileSystem) { + // do not write a bundle, do not return a file name is content is empty + if(!content) { + return; + } + + let dir = path.join(this.outputDirectory, this.bundleDirectory); + let filenameHash = await this.getFilenameHash(content); + let filename = this.getFilename(filenameHash, this.fileExtension || type); + + if(writeToFileSystem) { + let fullPath = path.join(dir, filename); + + // no duplicate writes, this may be improved with a fs exists check, but it would only save the first write + if(!writingCache.has(fullPath)) { + writingCache.add(fullPath); + + if(!directoryExistsCache[dir]) { + fs.mkdirSync(dir, { recursive: true }); + directoryExistsCache[dir] = true; + } + + debug("Writing bundle %o", fullPath); + fs.writeFileSync(fullPath, content); + } + } + + return this.modifyPathToUrl(this.bundleDirectory, filename); + } +} + +export { BundleFileOutput }; diff --git a/node_modules/@11ty/eleventy-plugin-bundle/src/CodeManager.js b/node_modules/@11ty/eleventy-plugin-bundle/src/CodeManager.js new file mode 100644 index 0000000..809c242 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-bundle/src/CodeManager.js @@ -0,0 +1,231 @@ +import { BundleFileOutput } from "./BundleFileOutput.js"; +import debugUtil from "debug"; + +const debug = debugUtil("Eleventy:Bundle"); +const DEBUG_LOG_TRUNCATION_SIZE = 200; + +class CodeManager { + // code is placed in this bucket by default + static DEFAULT_BUCKET_NAME = "default"; + + // code is hoisted to this bucket when necessary + static HOISTED_BUCKET_NAME = "default"; + + constructor(name) { + this.name = name; + this.trimOnAdd = true; + // TODO unindent on add + this.reset(); + this.transforms = []; + this.isHoisting = true; + this.fileExtension = undefined; + this.toFileDirectory = undefined; + this.bundleExportKey = "bundle"; + this.runsAfterHtmlTransformer = false; + this.pluckedSelector = undefined; + } + + setDelayed(isDelayed) { + this.runsAfterHtmlTransformer = Boolean(isDelayed); + } + + isDelayed() { + return this.runsAfterHtmlTransformer; + } + + // posthtml-match-selector friendly + setPluckedSelector(selector) { + this.pluckedSelector = selector; + } + + getPluckedSelector() { + return this.pluckedSelector; + } + + setFileExtension(ext) { + this.fileExtension = ext; + } + + setHoisting(enabled) { + this.isHoisting = !!enabled; + } + + setBundleDirectory(dir) { + this.toFileDirectory = dir; + } + + setBundleExportKey(key) { + this.bundleExportKey = key; + } + + getBundleExportKey() { + return this.bundleExportKey; + } + + reset() { + this.pages = {}; + } + + static normalizeBuckets(bucket) { + if(Array.isArray(bucket)) { + return bucket; + } else if(typeof bucket === "string") { + return bucket.split(","); + } + return [CodeManager.DEFAULT_BUCKET_NAME]; + } + + setTransforms(transforms) { + if(!Array.isArray(transforms)) { + throw new Error("Array expected to setTransforms"); + } + + this.transforms = transforms; + } + + _initBucket(pageUrl, bucket) { + if(!this.pages[pageUrl][bucket]) { + this.pages[pageUrl][bucket] = new Set(); + } + } + + addToPage(pageUrl, code = [], bucket) { + if(!Array.isArray(code) && code) { + code = [code]; + } + if(code.length === 0) { + return; + } + + if(!this.pages[pageUrl]) { + this.pages[pageUrl] = {}; + } + + let buckets = CodeManager.normalizeBuckets(bucket); + + let codeContent = code.map(entry => { + if(this.trimOnAdd) { + return entry.trim(); + } + return entry; + }); + + + for(let b of buckets) { + this._initBucket(pageUrl, b); + + for(let content of codeContent) { + if(content) { + if(!this.pages[pageUrl][b].has(content)) { + debug("Adding code to bundle %o for %o (bucket: %o, size: %o): %o", this.name, pageUrl, b, content.length, content.length > DEBUG_LOG_TRUNCATION_SIZE ? content.slice(0, DEBUG_LOG_TRUNCATION_SIZE) + "…" : content); + this.pages[pageUrl][b].add(content); + } + } + } + } + } + + async runTransforms(str, pageData, buckets) { + for (let callback of this.transforms) { + str = await callback.call( + { + page: pageData, + type: this.name, + buckets: buckets + }, + str + ); + } + + return str; + } + + getBucketsForPage(pageData) { + let pageUrl = pageData.url; + if(!this.pages[pageUrl]) { + return []; + } + return Object.keys(this.pages[pageUrl]); + } + + getRawForPage(pageData, buckets = undefined) { + let url = pageData.url; + if(!this.pages[url]) { + debug("No bundle code found for %o on %o, %O", this.name, url, this.pages); + return new Set(); + } + + buckets = CodeManager.normalizeBuckets(buckets); + + let set = new Set(); + let size = 0; + for(let b of buckets) { + if(!this.pages[url][b]) { + // Just continue, if you retrieve code from a bucket that doesn’t exist or has no code, it will return an empty set + continue; + } + + for(let entry of this.pages[url][b]) { + size += entry.length; + set.add(entry); + } + } + + debug("Retrieving %o for %o (buckets: %o, entries: %o, size: %o)", this.name, url, buckets, set.size, size); + return set; + } + + async getForPage(pageData, buckets = undefined) { + let set = this.getRawForPage(pageData, buckets); + let bundleContent = Array.from(set).join("\n"); + + // returns promise + return this.runTransforms(bundleContent, pageData, buckets); + } + + async writeBundle(pageData, buckets, options = {}) { + let url = pageData.url; + if(!this.pages[url]) { + debug("No bundle code found for %o on %o, %O", this.name, url, this.pages); + return ""; + } + + let { output, write } = options; + + buckets = CodeManager.normalizeBuckets(buckets); + + // TODO the bundle output URL might be useful in the transforms for sourcemaps + let content = await this.getForPage(pageData, buckets); + let writer = new BundleFileOutput(output, this.toFileDirectory); + writer.setFileExtension(this.fileExtension); + return writer.writeBundle(content, this.name, write); + } + + // Used when a bucket is output multiple times on a page and needs to be hoisted + hoistBucket(pageData, bucketName) { + let newTargetBucketName = CodeManager.HOISTED_BUCKET_NAME; + if(!this.isHoisting || bucketName === newTargetBucketName) { + return; + } + + let url = pageData.url; + if(!this.pages[url] || !this.pages[url][bucketName]) { + debug("No bundle code found for %o on %o, %O", this.name, url, this.pages); + return; + } + + debug("Code in bucket (%o) is being hoisted to a new bucket (%o)", bucketName, newTargetBucketName); + + this._initBucket(url, newTargetBucketName); + + for(let codeEntry of this.pages[url][bucketName]) { + this.pages[url][bucketName].delete(codeEntry); + this.pages[url][newTargetBucketName].add(codeEntry); + } + + // delete the bucket + delete this.pages[url][bucketName]; + } +} + +export { CodeManager }; diff --git a/node_modules/@11ty/eleventy-plugin-bundle/src/OutOfOrderRender.js b/node_modules/@11ty/eleventy-plugin-bundle/src/OutOfOrderRender.js new file mode 100644 index 0000000..6cafa49 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-bundle/src/OutOfOrderRender.js @@ -0,0 +1,158 @@ +import debugUtil from "debug"; + +const debug = debugUtil("Eleventy:Bundle"); + +/* This class defers any `bundleGet` calls to a post-build transform step, + * to allow `getBundle` to be called before all of the `css` additions have been processed + */ +class OutOfOrderRender { + static SPLIT_REGEX = /(\/\*__EleventyBundle:[^:]*:[^:]*:[^:]*:EleventyBundle__\*\/)/; + static SEPARATOR = ":"; + + constructor(content) { + this.content = content; + this.managers = {}; + } + + // type if `get` (return string) or `file` (bundle writes to file, returns file url) + static getAssetKey(type, name, bucket) { + if(Array.isArray(bucket)) { + bucket = bucket.join(","); + } else if(typeof bucket === "string") { + } else { + bucket = ""; + } + return `/*__EleventyBundle:${type}:${name}:${bucket || "default"}:EleventyBundle__*/` + } + + static parseAssetKey(str) { + if(str.startsWith("/*__EleventyBundle:")) { + let [prefix, type, name, bucket, suffix] = str.split(OutOfOrderRender.SEPARATOR); + return { type, name, bucket }; + } + return false; + } + + setAssetManager(name, assetManager) { + this.managers[name] = assetManager; + } + + setOutputDirectory(dir) { + this.outputDirectory = dir; + } + + normalizeMatch(match) { + let ret = OutOfOrderRender.parseAssetKey(match) + return ret || match; + } + + findAll() { + let matches = this.content.split(OutOfOrderRender.SPLIT_REGEX); + let ret = []; + for(let match of matches) { + ret.push(this.normalizeMatch(match)); + } + return ret; + } + + setWriteToFileSystem(isWrite) { + this.writeToFileSystem = isWrite; + } + + getAllBucketsForPage(pageData) { + let availableBucketsForPage = new Set(); + for(let name in this.managers) { + for(let bucket of this.managers[name].getBucketsForPage(pageData)) { + availableBucketsForPage.add(`${name}::${bucket}`); + } + } + return availableBucketsForPage; + } + + getManager(name) { + if(!this.managers[name]) { + throw new Error(`No asset manager found for ${name}. Known names: ${Object.keys(this.managers)}`); + } + return this.managers[name]; + } + + async replaceAll(pageData, stage = 0) { + let matches = this.findAll(); + let availableBucketsForPage = this.getAllBucketsForPage(pageData); + let usedBucketsOnPage = new Set(); + let bucketsOutputStringCount = {}; + let bucketsFileCount = {}; + + for(let match of matches) { + if(typeof match === "string") { + continue; + } + + // type is `file` or `get` + let {type, name, bucket} = match; + let key = `${name}::${bucket}`; + if(!usedBucketsOnPage.has(key)) { + usedBucketsOnPage.add(key); + } + + if(type === "get") { + if(!bucketsOutputStringCount[key]) { + bucketsOutputStringCount[key] = 0; + } + bucketsOutputStringCount[key]++; + } else if(type === "file") { + if(!bucketsFileCount[key]) { + bucketsFileCount[key] = 0; + } + bucketsFileCount[key]++; + } + } + + // Hoist code in non-default buckets that are output multiple times + // Only hoist if 2+ `get` OR 1+ `get` and 1+ `file` + for(let bucketInfo in bucketsOutputStringCount) { + let stringOutputCount = bucketsOutputStringCount[bucketInfo]; + if(stringOutputCount > 1 || stringOutputCount === 1 && bucketsFileCount[bucketInfo] > 0) { + let [name, bucketName] = bucketInfo.split("::"); + this.getManager(name).hoistBucket(pageData, bucketName); + } + } + + let content = await Promise.all(matches.map(match => { + if(typeof match === "string") { + return match; + } + + let {type, name, bucket} = match; + let manager = this.getManager(name); + + // Quit early if in stage 0, run delayed replacements if in stage 1+ + if(typeof manager.isDelayed === "function" && manager.isDelayed() && stage === 0) { + return OutOfOrderRender.getAssetKey(type, name, bucket); + } + + if(type === "get") { + // returns promise + return manager.getForPage(pageData, bucket); + } else if(type === "file") { + // returns promise + return manager.writeBundle(pageData, bucket, { + output: this.outputDirectory, + write: this.writeToFileSystem, + }); + } + return ""; + })); + + for(let bucketInfo of availableBucketsForPage) { + if(!usedBucketsOnPage.has(bucketInfo)) { + let [name, bucketName] = bucketInfo.split("::"); + debug(`WARNING! \`${pageData.inputPath}\` has unbundled \`${name}\` assets (in the '${bucketName}' bucket) that were not written to or used on the page. You might want to add a call to \`getBundle('${name}', '${bucketName}')\` to your content! Learn more: https://github.com/11ty/eleventy-plugin-bundle#asset-bucketing`); + } + } + + return content.join(""); + } +} + +export { OutOfOrderRender }; diff --git a/node_modules/@11ty/eleventy-plugin-bundle/src/bundlePlucker.js b/node_modules/@11ty/eleventy-plugin-bundle/src/bundlePlucker.js new file mode 100644 index 0000000..5dcad46 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-bundle/src/bundlePlucker.js @@ -0,0 +1,69 @@ +import debugUtil from "debug"; +import matchHelper from "posthtml-match-helper"; + +const debug = debugUtil("Eleventy:Bundle"); + +const ATTRS = { + ignore: "eleventy:ignore", + bucket: "eleventy:bucket", +}; + +const POSTHTML_PLUGIN_NAME = "11ty/eleventy/html-bundle-plucker"; + +function hasAttribute(node, name) { + return node?.attrs?.[name] !== undefined; +} + +function addHtmlPlucker(eleventyConfig, bundleManager) { + let matchSelector = bundleManager.getPluckedSelector(); + + if(!matchSelector) { + throw new Error("Internal error: missing plucked selector on bundle manager."); + } + + eleventyConfig.htmlTransformer.addPosthtmlPlugin( + "html", + function (context = {}) { + let pageUrl = context?.url; + if(!pageUrl) { + throw new Error("Internal error: missing `url` property from context."); + } + + return function (tree, ...args) { + tree.match(matchHelper(matchSelector), function (node) { + try { + // ignore + if(hasAttribute(node, ATTRS.ignore)) { + delete node.attrs[ATTRS.ignore]; + return node; + } + + if(Array.isArray(node?.content) && node.content.length > 0) { + // TODO make this better decoupled + if(node?.content.find(entry => entry.includes(`/*__EleventyBundle:`))) { + // preserve {% getBundle %} calls as-is + return node; + } + + let bucketName = node?.attrs?.[ATTRS.bucket]; + bundleManager.addToPage(pageUrl, [ ...node.content ], bucketName); + + return { attrs: [], content: [], tag: false }; + } + } catch(e) { + debug(`Bundle plucker: error adding content to bundle in HTML Assets: %o`, e); + return node; + } + + return node; + }); + }; + }, + { + // pluginOptions + name: POSTHTML_PLUGIN_NAME, + }, + ); +} + +export { addHtmlPlucker }; diff --git a/node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.bundleManagers.js b/node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.bundleManagers.js new file mode 100644 index 0000000..8510abc --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.bundleManagers.js @@ -0,0 +1,85 @@ +import debugUtil from "debug"; +import { CodeManager } from "./CodeManager.js"; +import { addHtmlPlucker } from "./bundlePlucker.js" + +const debug = debugUtil("Eleventy:Bundle"); + +function eleventyBundleManagers(eleventyConfig, pluginOptions = {}) { + if(pluginOptions.force) { + // no errors + } else if(("getBundleManagers" in eleventyConfig || "addBundle" in eleventyConfig)) { + throw new Error("Duplicate addPlugin calls for @11ty/eleventy-plugin-bundle"); + } + + let managers = {}; + + function addBundle(name, bundleOptions = {}) { + if(name in managers) { + // note: shortcode must still be added + debug("Bundle exists %o, skipping.", name); + } else { + debug("Creating new bundle %o", name); + managers[name] = new CodeManager(name); + + if(bundleOptions.delayed !== undefined) { + managers[name].setDelayed(bundleOptions.delayed); + } + + if(bundleOptions.hoist !== undefined) { + managers[name].setHoisting(bundleOptions.hoist); + } + + if(bundleOptions.bundleHtmlContentFromSelector !== undefined) { + managers[name].setPluckedSelector(bundleOptions.bundleHtmlContentFromSelector); + managers[name].setDelayed(true); // must override `delayed` above + + addHtmlPlucker(eleventyConfig, managers[name]); + } + + if(bundleOptions.bundleExportKey !== undefined) { + managers[name].setBundleExportKey(bundleOptions.bundleExportKey); + } + + if(bundleOptions.outputFileExtension) { + managers[name].setFileExtension(bundleOptions.outputFileExtension); + } + + if(bundleOptions.toFileDirectory) { + managers[name].setBundleDirectory(bundleOptions.toFileDirectory); + } + + if(bundleOptions.transforms) { + managers[name].setTransforms(bundleOptions.transforms); + } + } + + // if undefined, defaults to `name` + if(bundleOptions.shortcodeName !== false) { + let shortcodeName = bundleOptions.shortcodeName || name; + + // e.g. `css` shortcode to add code to page bundle + // These shortcode names are not configurable on purpose (for wider plugin compatibility) + eleventyConfig.addPairedShortcode(shortcodeName, function addContent(content, bucket, explicitUrl) { + let url = explicitUrl || this.page?.url; + if(url) { // don’t add if a file doesn’t have an output URL + managers[name].addToPage(url, content, bucket); + } + return ""; + }); + } + }; + + eleventyConfig.addBundle = addBundle; + + eleventyConfig.getBundleManagers = function() { + return managers; + }; + + eleventyConfig.on("eleventy.before", async () => { + for(let key in managers) { + managers[key].reset(); + } + }); +}; + +export default eleventyBundleManagers; diff --git a/node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.pruneEmptyBundles.js b/node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.pruneEmptyBundles.js new file mode 100644 index 0000000..3bcaa72 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.pruneEmptyBundles.js @@ -0,0 +1,105 @@ +import matchHelper from "posthtml-match-helper"; +import debugUtil from "debug"; + +const debug = debugUtil("Eleventy:Bundle"); + +const ATTRS = { + keep: "eleventy:keep" +}; + +const POSTHTML_PLUGIN_NAME = "11ty/eleventy-bundle/prune-empty"; + +function getTextNodeContent(node) { + if (!node.content) { + return ""; + } + + return node.content + .map((entry) => { + if (typeof entry === "string") { + return entry; + } + if (Array.isArray(entry.content)) { + return getTextNodeContent(entry); + } + return ""; + }) + .join(""); +} + +function eleventyPruneEmptyBundles(eleventyConfig, options = {}) { + // Right now script[src],link[rel="stylesheet"] nodes are removed if the final bundles are empty. + // `false` to disable + options.pruneEmptySelector = options.pruneEmptySelector ?? `style,script,link[rel="stylesheet"]`; + + // Subsequent call can remove a previously added `addPosthtmlPlugin` entry + // htmlTransformer.remove is v3.0.1-alpha.4+ + if(typeof eleventyConfig.htmlTransformer.remove === "function") { + eleventyConfig.htmlTransformer.remove("html", entry => { + if(entry.name === POSTHTML_PLUGIN_NAME) { + return true; + } + + // Temporary workaround for missing `name` property. + let fnStr = entry.fn.toString(); + return !entry.name && fnStr.startsWith("function (pluginOptions = {}) {") && fnStr.includes(`tree.match(matchHelper(options.pruneEmptySelector), function (node)`); + }); + } + + // `false` disables this plugin + if(options.pruneEmptySelector === false) { + return; + } + + if(!eleventyConfig.htmlTransformer || !eleventyConfig.htmlTransformer?.constructor?.SUPPORTS_PLUGINS_ENABLED_CALLBACK) { + debug("You will need to upgrade your version of Eleventy core to remove empty bundle tags automatically (v3 or newer)."); + return; + } + + eleventyConfig.htmlTransformer.addPosthtmlPlugin( + "html", + function bundlePruneEmptyPosthtmlPlugin(pluginOptions = {}) { + return function (tree) { + tree.match(matchHelper(options.pruneEmptySelector), function (node) { + if(node.attrs && node.attrs[ATTRS.keep] !== undefined) { + delete node.attrs[ATTRS.keep]; + return node; + } + + // + if(node.tag === "link") { + if(node.attrs?.rel === "stylesheet" && (node.attrs?.href || "").trim().length === 0) { + return false; + } + } else { + let content = getTextNodeContent(node); + + if(!content) { + // or + if(node.tag === "script" && (node.attrs?.src || "").trim().length === 0) { + return false; + } + + // + if(node.tag === "style") { + return false; + } + } + } + + + return node; + }); + }; + }, + { + name: POSTHTML_PLUGIN_NAME, + // the `enabled` callback for plugins is available on v3.0.0-alpha.20+ and v3.0.0-beta.2+ + enabled: () => { + return Object.keys(eleventyConfig.getBundleManagers()).length > 0; + } + } + ); +} + +export default eleventyPruneEmptyBundles; diff --git a/node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.shortcodes.js b/node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.shortcodes.js new file mode 100644 index 0000000..6bb8843 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.shortcodes.js @@ -0,0 +1,102 @@ +import { OutOfOrderRender } from "./OutOfOrderRender.js"; +import debugUtil from "debug"; + +const debug = debugUtil("Eleventy:Bundle"); + +function eleventyBundleShortcodes(eleventyConfig, pluginOptions = {}) { + let managers = eleventyConfig.getBundleManagers(); + let writeToFileSystem = true; + let pagesUsingBundles = {}; + + function bundleTransform(content, stage = 0) { + if(typeof content !== "string") { + return content; + } + + // Only run if managers are in play + // Only run on pages that have fetched bundles via `getBundle` or `getBundleFileUrl` + if(Object.keys(managers).length === 0 || this.page.url && !pagesUsingBundles[this.page.url]) { + return content; + } + + debug("Processing %o", this.page.url); + let render = new OutOfOrderRender(content); + for(let key in managers) { + render.setAssetManager(key, managers[key]); + } + + render.setOutputDirectory(eleventyConfig.directories.output); + render.setWriteToFileSystem(writeToFileSystem); + + return render.replaceAll(this.page, stage); + } + + eleventyConfig.on("eleventy.before", async ({ outputMode }) => { + if(Object.keys(managers).length === 0) { + return; + } + + pagesUsingBundles = {}; + + if(outputMode !== "fs") { + writeToFileSystem = false; + debug("Skipping writing to the file system due to output mode: %o", outputMode); + } + }); + + // e.g. `getBundle` shortcode to get code in current page bundle + // bucket can be an array + // This shortcode name is not configurable on purpose (for wider plugin compatibility) + eleventyConfig.addShortcode("getBundle", function getContent(type, bucket, explicitUrl) { + if(!type || !(type in managers) || Object.keys(managers).length === 0) { + throw new Error(`Invalid bundle type: ${type}. Available options: ${Object.keys(managers)}`); + } + + let url = explicitUrl || this.page?.url; + if(url) { + pagesUsingBundles[url] = true; + } + + return OutOfOrderRender.getAssetKey("get", type, bucket); + }); + + // write a bundle to the file system + // This shortcode name is not configurable on purpose (for wider plugin compatibility) + eleventyConfig.addShortcode("getBundleFileUrl", function(type, bucket, explicitUrl) { + if(!type || !(type in managers) || Object.keys(managers).length === 0) { + throw new Error(`Invalid bundle type: ${type}. Available options: ${Object.keys(managers)}`); + } + + let url = explicitUrl || this.page?.url; + if(url) { + pagesUsingBundles[url] = true; + } + + return OutOfOrderRender.getAssetKey("file", type, bucket); + }); + + eleventyConfig.addTransform("@11ty/eleventy-bundle", function (content) { + let hasNonDelayedManagers = Boolean(Object.values(eleventyConfig.getBundleManagers()).find(manager => { + return typeof manager.isDelayed !== "function" || !manager.isDelayed(); + })); + if(hasNonDelayedManagers) { + return bundleTransform.call(this, content, 0); + } + return content; + }); + + eleventyConfig.addPlugin((eleventyConfig) => { + // Delayed bundles *MUST* not alter URLs + eleventyConfig.addTransform("@11ty/eleventy-bundle/delayed", function (content) { + let hasDelayedManagers = Boolean(Object.values(eleventyConfig.getBundleManagers()).find(manager => { + return typeof manager.isDelayed === "function" && manager.isDelayed(); + })); + if(hasDelayedManagers) { + return bundleTransform.call(this, content, 1); + } + return content; + }); + }); +}; + +export default eleventyBundleShortcodes; diff --git a/node_modules/@11ty/eleventy-utils/LICENSE b/node_modules/@11ty/eleventy-utils/LICENSE new file mode 100644 index 0000000..d52e149 --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022–2024 Zach Leatherman @zachleat + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@11ty/eleventy-utils/LICENSE 2 b/node_modules/@11ty/eleventy-utils/LICENSE 2 new file mode 100644 index 0000000..2fde565 --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/LICENSE 2 @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Zach Leatherman @zachleat + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@11ty/eleventy-utils/README 2.md b/node_modules/@11ty/eleventy-utils/README 2.md new file mode 100644 index 0000000..0581359 --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/README 2.md @@ -0,0 +1,29 @@ +

eleventy Logo

+ +# eleventy-utils 🕚⚡️🎈🐀 + +Low level internal utilities to be shared amongst Eleventy projects. + +## ➡ [Documentation](https://www.11ty.dev/docs/) + +- Please star [Eleventy on GitHub](https://github.com/11ty/eleventy/)! +- Follow us on Twitter [@eleven_ty](https://twitter.com/eleven_ty) +- Support [11ty on Open Collective](https://opencollective.com/11ty) +- [11ty on npm](https://www.npmjs.com/org/11ty) +- [11ty on GitHub](https://github.com/11ty) + +[![npm Version](https://img.shields.io/npm/v/@11ty/eleventy-utils.svg?style=for-the-badge)](https://www.npmjs.com/package/@11ty/eleventy-utils) + +## Installation + +``` +npm install @11ty/eleventy-utils +``` + +## Tests + +``` +npm run test +``` + +- We use the [ava JavaScript test runner](https://github.com/avajs/ava) ([Assertions documentation](https://github.com/avajs/ava/blob/master/docs/03-assertions.md)) diff --git a/node_modules/@11ty/eleventy-utils/README.md b/node_modules/@11ty/eleventy-utils/README.md new file mode 100644 index 0000000..e7b2cc8 --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/README.md @@ -0,0 +1,27 @@ +

eleventy Logo

+ +# eleventy-utils 🕚⚡️🎈🐀 + +Low level internal utilities to be shared amongst Eleventy projects. + +## ➡ [Documentation](https://www.11ty.dev/docs/) + +- Please star [Eleventy on GitHub](https://github.com/11ty/eleventy/)! +- Follow us on Twitter [@eleven_ty](https://twitter.com/eleven_ty) +- Support [11ty on Open Collective](https://opencollective.com/11ty) +- [11ty on npm](https://www.npmjs.com/org/11ty) +- [11ty on GitHub](https://github.com/11ty) + +## Installation + +``` +npm install @11ty/eleventy-utils +``` + +## Tests + +``` +npm run test +``` + +- We use the native NodeJS [test runner](https://nodejs.org/api/test.html#test-runner) and ([assertions](https://nodejs.org/api/assert.html#assert)) diff --git a/node_modules/@11ty/eleventy-utils/index 2.js b/node_modules/@11ty/eleventy-utils/index 2.js new file mode 100644 index 0000000..1cfa0e2 --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/index 2.js @@ -0,0 +1,11 @@ +const TemplatePath = require("./src/TemplatePath.js"); +const isPlainObject = require("./src/IsPlainObject.js"); +const Merge = require("./src/Merge.js"); +const { DeepCopy } = Merge; + +module.exports = { + TemplatePath, + isPlainObject, + Merge, + DeepCopy, +}; \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-utils/index.js b/node_modules/@11ty/eleventy-utils/index.js new file mode 100644 index 0000000..b329082 --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/index.js @@ -0,0 +1,20 @@ +const TemplatePath = require("./src/TemplatePath.js"); +const isPlainObject = require("./src/IsPlainObject.js"); +const Merge = require("./src/Merge.js"); +const DateCompare = require("./src/DateCompare.js"); +const { DeepCopy } = Merge; +const { createHash, createHashHex, createHashSync, createHashHexSync } = require("./src/CreateHash.js"); +const Buffer = require("./src/Buffer.js"); + +module.exports = { + TemplatePath, + isPlainObject, + Merge, + DeepCopy, + DateCompare, + createHash, + createHashHex, + createHashSync, + createHashHexSync, + Buffer, +}; \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-utils/package 2.json b/node_modules/@11ty/eleventy-utils/package 2.json new file mode 100644 index 0000000..eca3bce --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/package 2.json @@ -0,0 +1,47 @@ +{ + "name": "@11ty/eleventy-utils", + "version": "1.0.3", + "description": "Low level internal utilities to be shared amongst Eleventy projects", + "main": "index.js", + "files": [ + "src", + "src/**", + "index.js", + "!test", + "!test/**" + ], + "scripts": { + "test": "npx ava --verbose" + }, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + }, + "keywords": [ + "eleventy" + ], + "publishConfig": { + "access": "public" + }, + "author": { + "name": "Zach Leatherman", + "email": "zachleatherman@gmail.com", + "url": "https://zachleat.com/" + }, + "repository": { + "type": "git", + "url": "git://github.com/11ty/eleventy-utils.git" + }, + "bugs": "https://github.com/11ty/eleventy-utils/issues", + "homepage": "https://github.com/11ty/eleventy-utils/", + "dependencies": { + "normalize-path": "^3.0.0" + }, + "devDependencies": { + "ava": "^6.1.3" + } +} diff --git a/node_modules/@11ty/eleventy-utils/package.json b/node_modules/@11ty/eleventy-utils/package.json new file mode 100644 index 0000000..8892430 --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/package.json @@ -0,0 +1,42 @@ +{ + "name": "@11ty/eleventy-utils", + "version": "2.0.7", + "description": "Low level internal utilities to be shared amongst Eleventy projects", + "main": "index.js", + "files": [ + "src", + "src/**", + "index.js", + "!test", + "!test/**" + ], + "scripts": { + "test": "node --test", + "watch": "node --test --watch" + }, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + }, + "keywords": [ + "eleventy" + ], + "publishConfig": { + "access": "public" + }, + "author": { + "name": "Zach Leatherman", + "email": "zachleatherman@gmail.com", + "url": "https://zachleat.com/" + }, + "repository": { + "type": "git", + "url": "git://github.com/11ty/eleventy-utils.git" + }, + "bugs": "https://github.com/11ty/eleventy-utils/issues", + "homepage": "https://github.com/11ty/eleventy-utils/" +} diff --git a/node_modules/@11ty/eleventy-utils/src/Buffer.js b/node_modules/@11ty/eleventy-utils/src/Buffer.js new file mode 100644 index 0000000..8fb0cd4 --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/src/Buffer.js @@ -0,0 +1,10 @@ +function isBuffer(inst) { + if(typeof Buffer !== "undefined") { + return Buffer.isBuffer(inst); + } + return inst instanceof Uint8Array; +} + +module.exports = { + isBuffer +} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-utils/src/CreateHash.js b/node_modules/@11ty/eleventy-utils/src/CreateHash.js new file mode 100644 index 0000000..92adb0c --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/src/CreateHash.js @@ -0,0 +1,27 @@ + +const { Hash } = require("./HashTypes.js"); + +// same output as node:crypto above (though now async). +async function createHash(...content) { + return Hash.create().toBase64Url(...content); +} + +async function createHashHex(...content) { + return Hash.create().toHex(...content); +} + +// Slower, but this feature does not require WebCrypto +function createHashSync(...content) { + return Hash.createSync().toBase64Url(...content); +} + +function createHashHexSync(...content) { + return Hash.createSync().toHex(...content); +} + +module.exports = { + createHash, + createHashSync, + createHashHex, + createHashHexSync, +}; \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-utils/src/DateCompare.js b/node_modules/@11ty/eleventy-utils/src/DateCompare.js new file mode 100644 index 0000000..a160ace --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/src/DateCompare.js @@ -0,0 +1,41 @@ +class DateCompare { + static isTimestampWithinDuration(timestamp, duration, compareDate = Date.now()) { + // the default duration is Infinity (also "*") + if (!duration || duration === "*" || duration === Infinity) { + return true; + } + + let expiration = timestamp + this.getDurationMs(duration); + + // still valid + if (expiration > compareDate) { + return true; + } + + // expired + return false; + } + + static getDurationMs(duration = "0s") { + let durationUnits = duration.slice(-1); + let durationMultiplier; + if (durationUnits === "s") { + durationMultiplier = 1; + } else if (durationUnits === "m") { + durationMultiplier = 60; + } else if (durationUnits === "h") { + durationMultiplier = 60 * 60; + } else if (durationUnits === "d") { + durationMultiplier = 60 * 60 * 24; + } else if (durationUnits === "w") { + durationMultiplier = 60 * 60 * 24 * 7; + } else if (durationUnits === "y") { + durationMultiplier = 60 * 60 * 24 * 365; + } + + let durationValue = parseInt(duration.slice(0, duration.length - 1), 10); + return durationValue * durationMultiplier * 1000; + } +} + +module.exports = DateCompare; \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-utils/src/HashTypes.js b/node_modules/@11ty/eleventy-utils/src/HashTypes.js new file mode 100644 index 0000000..4f7454c --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/src/HashTypes.js @@ -0,0 +1,158 @@ +const { base64UrlSafe } = require("./Url.js"); +const { isBuffer } = require("./Buffer.js"); +const sha256 = require("./lib-sha256.js"); + +function hasNodeCryptoModule() { + try { + require("node:crypto"); + return true; + } catch(e) { + return false; + } +} + +const HAS_NODE_CRYPTO = hasNodeCryptoModule(); + +class Hash { + static create() { + if(typeof globalThis.crypto === "undefined") { + // Backwards compat with Node Crypto, since WebCrypto (crypto global) is Node 20+ + if(HAS_NODE_CRYPTO) { + return NodeCryptoHash; + } + return ScriptHash; + } + return WebCryptoHash; + } + + // Does not use WebCrypto (as WebCrypto is async-only) + static createSync() { + if(HAS_NODE_CRYPTO) { + return NodeCryptoHash; + } + return ScriptHash; + } + + static toBase64(bytes) { + let str = Array.from(bytes, (b) => String.fromCodePoint(b)).join(""); + + // `btoa` Node 16+ + return btoa(str); + } + + // Thanks https://evanhahn.com/the-best-way-to-concatenate-uint8arrays/ (Public domain) + static mergeUint8Array(...arrays) { + let totalLength = arrays.reduce( + (total, uint8array) => total + uint8array.byteLength, + 0 + ); + + let result = new Uint8Array(totalLength); + let offset = 0; + arrays.forEach((uint8array) => { + result.set(uint8array, offset); + offset += uint8array.byteLength; + }); + + return result; + } + + static bufferToBase64Url(hashBuffer) { + return base64UrlSafe(this.toBase64(new Uint8Array(hashBuffer))); + } + + static bufferToHex(hashBuffer) { + return Array.from(new Uint8Array(hashBuffer)) + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); + } +} + +class WebCryptoHash extends Hash { + static async toHash(...content) { + let encoder = new TextEncoder(); + let input = this.mergeUint8Array(...content.map(c => { + if(isBuffer(c)) { + return c; + } + return encoder.encode(c); + })); + + // `crypto` is Node 20+ + return crypto.subtle.digest("SHA-256", input); + } + + static async toBase64Url(...content) { + return this.toHash(...content).then(hashBuffer => { + return this.bufferToBase64Url(hashBuffer); + }); + } + + static async toHex(...content) { + return this.toHash(...content).then(hashBuffer => { + return this.bufferToHex(hashBuffer); + }); + } + + static toBase64UrlSync() { + throw new Error("Synchronous methods are not available in the Web Crypto API."); + } + + static toHexSync() { + throw new Error("Synchronous methods are not available in the Web Crypto API."); + } +} + +class NodeCryptoHash extends Hash { + static toHash(...content) { + // This *needs* to be a dynamic require for proper bundling. + const { createHash } = require("node:crypto"); + let hash = createHash("sha256"); + + for(let c of content) { + hash.update(c); + } + + return hash; + } + + static toBase64Url(...content) { + // Note that Node does include a `digest("base64url")` that is supposedly Node 14+ but curiously failed on Stackblitz’s Node 16. + let base64 = this.toHash(...content).digest("base64"); + return base64UrlSafe(base64); + } + + static toHex(...content) { + return this.toHash(...content).digest("hex"); + } + + // aliases + static toBase64UrlSync = this.toBase64Url; + static toHexSync = this.toHex; +} + +class ScriptHash extends Hash { + static toHash(...content) { + let hash = sha256(); + for(let c of content) { + hash.add(c); + } + return hash.digest(); + } + + static toBase64Url(...content) { + let hashBuffer = this.toHash(...content); + return this.bufferToBase64Url(hashBuffer); + } + + static toHex(...content) { + let hashBuffer = this.toHash(...content); + return this.bufferToHex(hashBuffer); + } + + // aliases + static toBase64UrlSync = this.toBase64Url; + static toHexSync = this.toHex; +} + +module.exports = { Hash, NodeCryptoHash, ScriptHash, WebCryptoHash } \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-utils/src/IsPlainObject.js b/node_modules/@11ty/eleventy-utils/src/IsPlainObject.js new file mode 100644 index 0000000..1d4c752 --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/src/IsPlainObject.js @@ -0,0 +1,24 @@ +/* Prior art: this utility was created for https://github.com/11ty/eleventy/issues/2214 + + * Inspired by implementations from `is-what`, `typechecker`, `jQuery`, and `lodash` + + * `is-what` + * More reading at https://www.npmjs.com/package/is-what#user-content-isplainobject-vs-isanyobject + * if (Object.prototype.toString.call(value).slice(8, -1) !== 'Object') return false; + * return value.constructor === Object && Object.getPrototypeOf(value) === Object.prototype; + + * `typechecker` + * return value !== null && typeof value === 'object' && value.__proto__ === Object.prototype; + + * Notably jQuery and lodash have very similar implementations. + + * For later, remember the `value === Object(value)` trick + */ + +module.exports = function (value) { + if (value === null || typeof value !== "object") { + return false; + } + let proto = Object.getPrototypeOf(value); + return !proto || proto === Object.prototype; +}; diff --git a/node_modules/@11ty/eleventy-utils/src/Merge.js b/node_modules/@11ty/eleventy-utils/src/Merge.js new file mode 100644 index 0000000..c3cfbaf --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/src/Merge.js @@ -0,0 +1,84 @@ +"use strict"; +// above is required for Object.freeze to fail correctly. + +const isPlainObject = require("./IsPlainObject.js"); + +const OVERRIDE_PREFIX = "override:"; + +function cleanKey(key, prefix) { + if (prefix && key.startsWith(prefix)) { + return key.slice(prefix.length); + } + return key; +} + +function getMergedItem(target, source, prefixes = {}) { + let { override } = prefixes; + + // Shortcut for frozen source (if target does not exist) + if (!target && isPlainObject(source) && Object.isFrozen(source)) { + return source; + } + + let sourcePlainObjectShortcut; + if (!target && isPlainObject(source)) { + // deep copy objects to avoid sharing and to effect key renaming + target = {}; + sourcePlainObjectShortcut = true; + } + + if (Array.isArray(target) && Array.isArray(source)) { + return target.concat(source); + } else if (isPlainObject(target)) { + if (sourcePlainObjectShortcut || isPlainObject(source)) { + for (let key in source) { + let overrideKey = cleanKey(key, override); + + // An error happens here if the target is frozen + target[overrideKey] = getMergedItem(target[key], source[key], prefixes); + } + } + return target; + } + // number, string, class instance, etc + return source; +} + +// The same as Merge but without override prefixes +function DeepCopy(targetObject, ...sources) { + for (let source of sources) { + if (!source) { + continue; + } + + targetObject = getMergedItem(targetObject, source); + } + return targetObject; +} + +function Merge(target, ...sources) { + // Remove override prefixes from root target. + if (isPlainObject(target)) { + for (let key in target) { + if (key.indexOf(OVERRIDE_PREFIX) === 0) { + target[key.slice(OVERRIDE_PREFIX.length)] = target[key]; + delete target[key]; + } + } + } + + for (let source of sources) { + if (!source) { + continue; + } + + target = getMergedItem(target, source, { + override: OVERRIDE_PREFIX, + }); + } + + return target; +} + +module.exports = Merge; +module.exports.DeepCopy = DeepCopy; diff --git a/node_modules/@11ty/eleventy-utils/src/TemplatePath.js b/node_modules/@11ty/eleventy-utils/src/TemplatePath.js new file mode 100644 index 0000000..807af54 --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/src/TemplatePath.js @@ -0,0 +1,373 @@ +const path = require("path"); +const fs = require("fs"); + +function TemplatePath() {} + +/** + * @returns {String} the absolute path to Eleventy’s project directory. + */ +TemplatePath.getWorkingDir = function () { + return TemplatePath.normalize(path.resolve(".")); +}; + +/** + * Returns the directory portion of a path. + * Works for directory and file paths and paths ending in a glob pattern. + * + * @param {String} path - A path + * @returns {String} the directory portion of a path. + */ +TemplatePath.getDir = function (path) { + if (TemplatePath.isDirectorySync(path)) { + return path; + } + + return TemplatePath.getDirFromFilePath(path); +}; + +/** + * Returns the directory portion of a path that either points to a file + * or ends in a glob pattern. If `path` points to a directory, + * the returned value will have its last path segment stripped + * due to how [`path.parse`][1] works. + * + * [1]: https://nodejs.org/api/path.html#path_path_parse_path + * + * @returns {String} the directory portion of a path. + * @param {String} filePath - A path + */ +TemplatePath.getDirFromFilePath = function (filePath) { + return path.parse(filePath).dir || "."; +}; + +/** + * Returns the last path segment in a path (no leading/trailing slashes). + * + * Assumes [`path.parse`][1] was called on `path` before. + * + * [1]: https://nodejs.org/api/path.html#path_path_parse_path + * + * @param {String} path - A path + * @returns {String} the last path segment in a path + */ +TemplatePath.getLastPathSegment = function (path) { + if (!path.includes("/")) { + return path; + } + + // Trim a trailing slash if there is one + path = path.replace(/\/$/, ""); + + return path.slice(path.lastIndexOf("/") + 1); +}; + +/** + * @param {String} path - A path + * @returns {String[]} an array of paths pointing to each path segment of the + * provided `path`. + */ +TemplatePath.getAllDirs = function (path) { + // Trim a trailing slash if there is one + path = path.replace(/\/$/, ""); + + if (!path.includes("/")) { + return [path]; + } + + return path + .split("/") + .map((segment, index, array) => array.slice(0, index + 1).join("/")) + .filter((path) => path !== ".") + .reverse(); +}; + +/** + * Normalizes a path, resolving single-dot and double-dot segments. + * + * Node.js’ [`path.normalize`][1] is called to strip a possible leading `"./"` segment. + * + * [1]: https://nodejs.org/api/path.html#path_path_normalize_path + * + * @param {String} thePath - The path that should be normalized. + * @returns {String} the normalized path. + */ +TemplatePath.normalize = function (thePath) { + let filePath = path.normalize(thePath).split(path.sep).join("/"); + if(filePath !== "/" && filePath.endsWith("/")) { + return filePath.slice(0, -1); + } + return filePath; +}; + +/** + * Joins all given path segments together. + * + * It uses Node.js’ [`path.join`][1] method. + * + * [1]: https://nodejs.org/api/path.html#path_path_join_paths + * + * @param {...String} paths - An arbitrary amount of path segments. + * @returns {String} the normalized and joined path. + */ +TemplatePath.join = function (...paths) { + return TemplatePath.normalize(path.join(...paths)); +}; + +/** + * Joins the given URL path segments and normalizes the resulting path. + * Maintains a single trailing slash if the last URL path argument + * had at least one. + * + * @param {...String} urlPaths + * @returns {String} a normalized URL path described by the given URL path segments. + */ +TemplatePath.normalizeUrlPath = function (...urlPaths) { + const urlPath = path.posix.join(...urlPaths); + return urlPath.replace(/\/+$/, "/"); +}; + +/** + * Joins the given path segments. Since the first path is absolute, + * the resulting path will be absolute as well. + * + * @param {...String} paths + * @returns {String} the absolute path described by the given path segments. + */ +TemplatePath.absolutePath = function (...paths) { + let i = 0; + // check all the paths before we short circuit from the first index + for (let p of paths) { + if (path.isAbsolute(p) && i > 0) { + throw new Error( + `Only the first parameter to Template.absolutePath can be an absolute path. Received: ${p} from ${paths}` + ); + } + i++; + } + + let j = 0; + for (let p of paths) { + if (j === 0 && path.isAbsolute(p)) { + return TemplatePath.join(...paths); + } + j++; + } + + return TemplatePath.join(TemplatePath.getWorkingDir(), ...paths); +}; + +/** + * Turns an absolute path into a path relative to the project directory. + * + * @param {String} absolutePath + * @returns {String} the relative path. + */ +TemplatePath.relativePath = function (absolutePath) { + return TemplatePath.stripLeadingSubPath( + absolutePath, + TemplatePath.getWorkingDir() + ); +}; + +/** + * Adds a leading dot-slash segment to each path in the `paths` array. + * + * @param {String[]} paths + * @returns {String[]} + */ +TemplatePath.addLeadingDotSlashArray = function (paths) { + return paths.map((path) => TemplatePath.addLeadingDotSlash(path)); +}; + +/** + * Adds a leading dot-slash segment to `path`. + * + * @param {String} pathArg + * @returns {String} + */ +TemplatePath.addLeadingDotSlash = function (pathArg) { + if (pathArg === "." || pathArg === "..") { + return pathArg + "/"; + } + + if ( + path.isAbsolute(pathArg) || + pathArg.startsWith("./") || + pathArg.startsWith("../") + ) { + return pathArg; + } + + return "./" + pathArg; +}; + +/** + * Removes a leading dot-slash segment. + * + * @param {String} path + * @returns {String} the `path` without a leading dot-slash segment. + */ +TemplatePath.stripLeadingDotSlash = function (path) { + return typeof path === "string" ? path.replace(/^\.\//, "") : path; +}; + +/** + * Determines whether a path starts with a given sub path. + * + * @param {String} path - A path + * @param {String} subPath - A path + * @returns {Boolean} whether `path` starts with `subPath`. + */ +TemplatePath.startsWithSubPath = function (path, subPath) { + path = TemplatePath.normalize(path); + subPath = TemplatePath.normalize(subPath); + + return path.startsWith(subPath); +}; + +/** + * Removes the `subPath` at the start of `path` if present + * and returns the remainding path. + * + * @param {String} path - A path + * @param {String} subPath - A path + * @returns {String} the `path` without `subPath` at the start of it. + */ +TemplatePath.stripLeadingSubPath = function (path, subPath) { + path = TemplatePath.normalize(path); + subPath = TemplatePath.normalize(subPath); + + if (subPath !== "." && path.startsWith(subPath)) { + return path.slice(subPath.length + 1); + } + + return path; +}; + +/** + * @param {String} path - A path + * @returns {Boolean} whether `path` points to an existing directory. + */ +TemplatePath.isDirectorySync = function (path) { + return fs.existsSync(path) && fs.statSync(path).isDirectory(); +}; + +/** + * @param {String} path - A path + * @returns {Boolean} whether `path` points to an existing directory. + */ +TemplatePath.isDirectory = async function (path) { + return new Promise((resolve) => { + fs.stat(path, (err, stats) => { + if (stats) { + resolve(stats.isDirectory()); + } + resolve(false); + }); + }); +}; + +/** + * Appends a recursive wildcard glob pattern to `path` + * unless `path` is not a directory; then, `path` is assumed to be a file path + * and is left unchaged. + * + * @param {String} path + * @returns {String} + */ +TemplatePath.convertToRecursiveGlobSync = function (path) { + if (path === "") { + return "./**"; + } + + path = TemplatePath.addLeadingDotSlash(path); + + if (TemplatePath.isDirectorySync(path)) { + return path + (!path.endsWith("/") ? "/" : "") + "**"; + } + + return path; +}; + +/** + * Appends a recursive wildcard glob pattern to `path` + * unless `path` is not a directory; then, `path` is assumed to be a file path + * and is left unchaged. + * + * @param {String} path + * @returns {String} + */ +TemplatePath.convertToRecursiveGlob = async function (path) { + if (path === "") { + return "./**"; + } + + path = TemplatePath.addLeadingDotSlash(path); + + if (await TemplatePath.isDirectory(path)) { + return path + (!path.endsWith("/") ? "/" : "") + "**"; + } + + return path; +}; + +/** + * Returns the extension of the path without the leading dot. + * If the path has no extensions, the empty string is returned. + * + * @param {String} thePath + * @returns {String} the path’s extension if it exists; + * otherwise, the empty string. + */ +TemplatePath.getExtension = function (thePath) { + return path.extname(thePath).replace(/^\./, ""); +}; + +/** + * Removes the extension from a path. + * + * @param {String} path + * @param {String} [extension] + * @returns {String} + */ +TemplatePath.removeExtension = function (path, extension = undefined) { + if (extension === undefined) { + return path; + } + + const pathExtension = TemplatePath.getExtension(path); + if (pathExtension !== "" && extension.endsWith(pathExtension)) { + return path.substring(0, path.lastIndexOf(pathExtension) - 1); + } + + return path; +}; + +/** + * Accepts a relative file path that is using a standard directory separator and + * normalizes it using the local operating system separator. + * e.g. `./my/dir/` stays `./my/dir/` on *nix and becomes `.\\my\\dir\\` on Windows + * + * @param {String} filePath + * @param {String} [sep="/"] + * @returns {String} a file path with the correct local directory separator. + */ +TemplatePath.normalizeOperatingSystemFilePath = function (filePath, sep = "/") { + return filePath.split(sep).join(path.sep); +}; + +/** + * Accepts a relative file path with the local operating system directory separator and + * normalizes it using a forward slash directory separator. (Leaves trailing slash as-is) + * e.g. `./my/dir/` stays `./my/dir/` on *nix + * e.g. `.\\my\\dir\\` becomes `./my/dir/` on *nix and Windows + * + * @param {String} filePath + * @param {String} [sep="/"] + * @returns {String} a file path with the correct local directory separator. + */ +TemplatePath.standardizeFilePath = function (filePath, sep = "/") { + return TemplatePath.addLeadingDotSlash(filePath.split(path.sep).join(sep)); +}; + +module.exports = TemplatePath; diff --git a/node_modules/@11ty/eleventy-utils/src/Url.js b/node_modules/@11ty/eleventy-utils/src/Url.js new file mode 100644 index 0000000..7f314ef --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/src/Url.js @@ -0,0 +1,13 @@ +function base64UrlSafe(hashString = "") { + return hashString.replace(/[=\+\/]/g, function(match) { + if(match === "=") { + return ""; + } + if(match === "+") { + return "-"; + } + return "_"; + }); +} + +module.exports = { base64UrlSafe }; \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-utils/src/lib-sha256.js b/node_modules/@11ty/eleventy-utils/src/lib-sha256.js new file mode 100644 index 0000000..7ebd37e --- /dev/null +++ b/node_modules/@11ty/eleventy-utils/src/lib-sha256.js @@ -0,0 +1,113 @@ +// https://github.com/6502/sha256 + +/* +Copyright 2022 Andrea Griffini + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +// sha256(data) returns the digest +// sha256() returns an object you can call .add(data) zero or more time and .digest() at the end +// digest is a 32-byte Uint8Array instance with an added .hex() function. +// Input should be either a string (that will be encoded as UTF-8) or an array-like object with values 0..255. +module.exports = function sha256(data) { + let h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a, + h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19, + tsz = 0, bp = 0; + const k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2], + rrot = (x, n) => (x >>> n) | (x << (32-n)), + w = new Uint32Array(64), + buf = new Uint8Array(64), + process = () => { + for (let j=0,r=0; j<16; j++,r+=4) { + w[j] = (buf[r]<<24) | (buf[r+1]<<16) | (buf[r+2]<<8) | buf[r+3]; + } + for (let j=16; j<64; j++) { + let s0 = rrot(w[j-15], 7) ^ rrot(w[j-15], 18) ^ (w[j-15] >>> 3); + let s1 = rrot(w[j-2], 17) ^ rrot(w[j-2], 19) ^ (w[j-2] >>> 10); + w[j] = (w[j-16] + s0 + w[j-7] + s1) | 0; + } + let a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7; + for (let j=0; j<64; j++) { + let S1 = rrot(e, 6) ^ rrot(e, 11) ^ rrot(e, 25), + ch = (e & f) ^ ((~e) & g), + t1 = (h + S1 + ch + k[j] + w[j]) | 0, + S0 = rrot(a, 2) ^ rrot(a, 13) ^ rrot(a, 22), + maj = (a & b) ^ (a & c) ^ (b & c), + t2 = (S0 + maj) | 0; + h = g; g = f; f = e; e = (d + t1)|0; d = c; c = b; b = a; a = (t1 + t2)|0; + } + h0 = (h0 + a)|0; h1 = (h1 + b)|0; h2 = (h2 + c)|0; h3 = (h3 + d)|0; + h4 = (h4 + e)|0; h5 = (h5 + f)|0; h6 = (h6 + g)|0; h7 = (h7 + h)|0; + bp = 0; + }, + add = data => { + if (typeof data === "string") { + data = typeof TextEncoder === "undefined" ? Buffer.from(data) : (new TextEncoder).encode(data); + } + for (let i=0; i { + buf[bp++] = 0x80; if (bp == 64) process(); + if (bp + 8 > 64) { + while (bp < 64) buf[bp++] = 0x00; + process(); + } + while (bp < 58) buf[bp++] = 0x00; + // Max number of bytes is 35,184,372,088,831 + let L = tsz * 8; + buf[bp++] = (L / 1099511627776.) & 255; + buf[bp++] = (L / 4294967296.) & 255; + buf[bp++] = L >>> 24; + buf[bp++] = (L >>> 16) & 255; + buf[bp++] = (L >>> 8) & 255; + buf[bp++] = L & 255; + process(); + let reply = new Uint8Array(32); + reply[ 0] = h0 >>> 24; reply[ 1] = (h0 >>> 16) & 255; reply[ 2] = (h0 >>> 8) & 255; reply[ 3] = h0 & 255; + reply[ 4] = h1 >>> 24; reply[ 5] = (h1 >>> 16) & 255; reply[ 6] = (h1 >>> 8) & 255; reply[ 7] = h1 & 255; + reply[ 8] = h2 >>> 24; reply[ 9] = (h2 >>> 16) & 255; reply[10] = (h2 >>> 8) & 255; reply[11] = h2 & 255; + reply[12] = h3 >>> 24; reply[13] = (h3 >>> 16) & 255; reply[14] = (h3 >>> 8) & 255; reply[15] = h3 & 255; + reply[16] = h4 >>> 24; reply[17] = (h4 >>> 16) & 255; reply[18] = (h4 >>> 8) & 255; reply[19] = h4 & 255; + reply[20] = h5 >>> 24; reply[21] = (h5 >>> 16) & 255; reply[22] = (h5 >>> 8) & 255; reply[23] = h5 & 255; + reply[24] = h6 >>> 24; reply[25] = (h6 >>> 16) & 255; reply[26] = (h6 >>> 8) & 255; reply[27] = h6 & 255; + reply[28] = h7 >>> 24; reply[29] = (h7 >>> 16) & 255; reply[30] = (h7 >>> 8) & 255; reply[31] = h7 & 255; + reply.hex = () => { + let res = ""; + reply.forEach(x => res += ("0" + x.toString(16)).slice(-2)); + return res; + }; + return reply; + }; + if (data === undefined) return {add, digest}; + add(data); + return digest(); +} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/CODE_OF_CONDUCT 2.md b/node_modules/@11ty/eleventy/CODE_OF_CONDUCT 2.md new file mode 100644 index 0000000..318db57 --- /dev/null +++ b/node_modules/@11ty/eleventy/CODE_OF_CONDUCT 2.md @@ -0,0 +1,48 @@ +# Eleventy Community Code of Conduct + +View the [Code of Conduct](https://www.11ty.dev/docs/code-of-conduct/) on 11ty.dev + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, chat messages, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at eleventy@zachleat.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/node_modules/@11ty/eleventy/CODE_OF_CONDUCT.md b/node_modules/@11ty/eleventy/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..318db57 --- /dev/null +++ b/node_modules/@11ty/eleventy/CODE_OF_CONDUCT.md @@ -0,0 +1,48 @@ +# Eleventy Community Code of Conduct + +View the [Code of Conduct](https://www.11ty.dev/docs/code-of-conduct/) on 11ty.dev + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, chat messages, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at eleventy@zachleat.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/node_modules/@11ty/eleventy/LICENSE b/node_modules/@11ty/eleventy/LICENSE new file mode 100644 index 0000000..5027c0d --- /dev/null +++ b/node_modules/@11ty/eleventy/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017–2024 Zach Leatherman @zachleat + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@11ty/eleventy/LICENSE 2 b/node_modules/@11ty/eleventy/LICENSE 2 new file mode 100644 index 0000000..c97fe3d --- /dev/null +++ b/node_modules/@11ty/eleventy/LICENSE 2 @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017–2023 Zach Leatherman @zachleat + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@11ty/eleventy/README 2.md b/node_modules/@11ty/eleventy/README 2.md new file mode 100644 index 0000000..e6508df --- /dev/null +++ b/node_modules/@11ty/eleventy/README 2.md @@ -0,0 +1,49 @@ +

eleventy Logo

+ +# eleventy 🕚⚡️🎈🐀 + +A simpler static site generator. An alternative to Jekyll. Written in JavaScript. Transforms a directory of templates (of varying types) into HTML. + +Works with HTML, Markdown, JavaScript, Liquid, Nunjucks, Handlebars, Mustache, EJS, Haml, and Pug. + +## ➡ [Documentation](https://www.11ty.dev/docs/) + +- Please star [this repo on GitHub](https://github.com/11ty/eleventy/)! +- Follow us on Twitter [@eleven_ty](https://twitter.com/eleven_ty) +- Support [11ty on Open Collective](https://opencollective.com/11ty) +- [11ty on npm](https://www.npmjs.com/org/11ty) +- [11ty on GitHub](https://github.com/11ty) +- Continuous Integration: + - [GitHub Actions](https://github.com/11ty/eleventy/actions?query=workflow%3A.github%2Fworkflows%2Fci.yml) + +[![npm Version](https://img.shields.io/npm/v/@11ty/eleventy.svg?style=for-the-badge)](https://www.npmjs.com/package/@11ty/eleventy) [![GitHub issues](https://img.shields.io/github/issues/11ty/eleventy.svg?style=for-the-badge)](https://github.com/11ty/eleventy/issues) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=for-the-badge)](https://github.com/prettier/prettier) [![npm Downloads](https://img.shields.io/npm/dt/@11ty/eleventy.svg?style=for-the-badge)](https://www.npmjs.com/package/@11ty/eleventy) + +## Installation + +``` +npm install @11ty/eleventy --save-dev +``` + +Read our [Getting Started guide](https://www.11ty.dev/docs/getting-started/). + +## Tests + +``` +npm run test +``` + +- We use the [ava JavaScript test runner](https://github.com/avajs/ava) ([Assertions documentation](https://github.com/avajs/ava/blob/master/docs/03-assertions.md)) +- ℹ️ To keep tests fast, thou shalt try to avoid writing files in tests. +- [Code Coverage Statistics](https://github.com/11ty/eleventy/blob/master/docs/coverage.md) +- [Benchmark for Performance Regressions](https://github.com/11ty/eleventy-benchmark) + +## Community Roadmap + +- [Top Feature Requests](https://github.com/11ty/eleventy/issues?q=label%3Aneeds-votes+sort%3Areactions-%2B1-desc+label%3Aenhancement) (Add your own votes using the 👍 reaction) +- [Documentation Requests](https://github.com/11ty/eleventy/issues?q=is%3Aissue+label%3Adocumentation+label%3Aneeds-votes+sort%3Areactions-%2B1-desc) (Add your own votes using the 👍 reaction) +- [Top Bugs 😱](https://github.com/11ty/eleventy/issues?q=is%3Aissue+is%3Aopen+label%3Abug+sort%3Areactions-%2B1-desc) (Add your own votes using the 👍 reaction) +- [Newest Bugs 🙀](https://github.com/11ty/eleventy/issues?q=is%3Aopen+is%3Aissue+label%3Abug) + +## Plugins + +See the [official docs on plugins](https://www.11ty.dev/docs/plugins/). diff --git a/node_modules/@11ty/eleventy/README.md b/node_modules/@11ty/eleventy/README.md new file mode 100644 index 0000000..4b464b8 --- /dev/null +++ b/node_modules/@11ty/eleventy/README.md @@ -0,0 +1,47 @@ +

eleventy Logo

+ +# eleventy 🕚⚡️🎈🐀 + +A simpler static site generator. An alternative to Jekyll. Written in JavaScript. Transforms a directory of templates (of varying types) into HTML. + +Works with HTML, Markdown, JavaScript, Liquid, Nunjucks, with addons for WebC, Sass, Vue, Svelte, TypeScript, JSX, and many others! + +## ➡ [Documentation](https://www.11ty.dev/docs/) + +- Please star [this repo on GitHub](https://github.com/11ty/eleventy/)! +- Follow us on Mastodon [@eleventy@fosstodon.org](https://fosstodon.org/@eleventy) or Twitter [@eleven_ty](https://twitter.com/eleven_ty) +- Join us on [Discord](https://www.11ty.dev/blog/discord/) +- Support [11ty on Open Collective](https://opencollective.com/11ty) +- [11ty on npm](https://www.npmjs.com/org/11ty) +- [11ty on GitHub](https://github.com/11ty) + +[![npm Version](https://img.shields.io/npm/v/@11ty/eleventy.svg?style=for-the-badge)](https://www.npmjs.com/package/@11ty/eleventy) [![GitHub issues](https://img.shields.io/github/issues/11ty/eleventy.svg?style=for-the-badge)](https://github.com/11ty/eleventy/issues) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=for-the-badge)](https://github.com/prettier/prettier) [![npm Downloads](https://img.shields.io/npm/dt/@11ty/eleventy.svg?style=for-the-badge)](https://www.npmjs.com/package/@11ty/eleventy) + +## Installation + +``` +npm install @11ty/eleventy --save-dev +``` + +Read our [Getting Started guide](https://www.11ty.dev/docs/getting-started/). + +## Tests + +``` +npm run test +``` + +- We use the [ava JavaScript test runner](https://github.com/avajs/ava) ([Assertions documentation](https://github.com/avajs/ava/blob/master/docs/03-assertions.md)) +- ℹ️ To keep tests fast, thou shalt try to avoid writing files in tests. +- [Continuous Integration on GitHub Actions](https://github.com/11ty/eleventy/actions/workflows/ci.yml) +- [Code Coverage Statistics](https://github.com/11ty/eleventy/blob/master/docs/coverage.md) +- [Benchmark for Performance Regressions](https://github.com/11ty/eleventy-benchmark) + +## Community Roadmap + +- [Top Feature Requests](https://github.com/11ty/eleventy/issues?q=label%3Aneeds-votes+sort%3Areactions-%2B1-desc+label%3Aenhancement) (Add your own votes using the 👍 reaction) +- [Top Bugs 😱](https://github.com/11ty/eleventy/issues?q=is%3Aissue+is%3Aopen+label%3Abug+sort%3Areactions) (Add your own votes using the 👍 reaction) + +## Plugins + +See the [official docs on plugins](https://www.11ty.dev/docs/plugins/). diff --git a/node_modules/@11ty/eleventy/SECURITY 2.md b/node_modules/@11ty/eleventy/SECURITY 2.md new file mode 100644 index 0000000..defd666 --- /dev/null +++ b/node_modules/@11ty/eleventy/SECURITY 2.md @@ -0,0 +1,5 @@ +# Security Policy + +## Reporting a Vulnerability + +Please report security issues to `zach@zachleat.com` diff --git a/node_modules/@11ty/eleventy/SECURITY.md b/node_modules/@11ty/eleventy/SECURITY.md new file mode 100644 index 0000000..0947081 --- /dev/null +++ b/node_modules/@11ty/eleventy/SECURITY.md @@ -0,0 +1,9 @@ +# Security Policy + +## Reporting a Vulnerability + +Privately report a security issue by navigating to https://github.com/11ty/eleventy/security and using the “Report a vulnerability” button. + +Read more at: https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability + +Alternatively, you may report security issues via an email to `security@11ty.dev`. diff --git a/node_modules/@11ty/eleventy/cmd.cjs b/node_modules/@11ty/eleventy/cmd.cjs new file mode 100755 index 0000000..c4a4d5f --- /dev/null +++ b/node_modules/@11ty/eleventy/cmd.cjs @@ -0,0 +1,155 @@ +#!/usr/bin/env node + +// This file intentionally uses older code conventions to be as friendly +// as possible with error messaging to folks on older runtimes. + +const pkg = require("./package.json"); +require("please-upgrade-node")(pkg, { + message: function (requiredVersion) { + return ( + "Eleventy " + + pkg.version + + " requires Node " + + requiredVersion + + ". You will need to upgrade Node to use Eleventy!" + ); + }, +}); + +const minimist = require("minimist"); +const debug = require("debug")("Eleventy:cmd"); + +class SimpleError extends Error { + constructor(...args) { + super(...args); + this.skipOriginalStack = true; + } +} + +async function exec() { + // Notes about friendly error messaging with outdated Node versions: https://github.com/11ty/eleventy/issues/3761 + const { EleventyErrorHandler } = await import("./src/Errors/EleventyErrorHandler.js"); + + try { + const argv = minimist(process.argv.slice(2), { + string: ["input", "output", "formats", "config", "pathprefix", "port", "to", "incremental", "loader"], + boolean: [ + "quiet", + "version", + "watch", + "dryrun", + "help", + "serve", + "ignore-initial", + ], + default: { + quiet: null, + "ignore-initial": false, + "to": "fs", + }, + unknown: function (unknownArgument) { + throw new Error( + `We don’t know what '${unknownArgument}' is. Use --help to see the list of supported commands.`, + ); + }, + }); + + debug("command: eleventy %o", argv); + const { Eleventy } = await import("./src/Eleventy.js"); + + let ErrorHandler = new EleventyErrorHandler(); + + process.on("unhandledRejection", (error, promise) => { + ErrorHandler.fatal(error, "Unhandled rejection in promise"); + }); + process.on("uncaughtException", (error) => { + ErrorHandler.fatal(error, "Uncaught exception"); + }); + process.on("rejectionHandled", (promise) => { + ErrorHandler.warn(promise, "A promise rejection was handled asynchronously"); + }); + + if (argv.version) { + console.log(Eleventy.getVersion()); + return; + } else if (argv.help) { + console.log(Eleventy.getHelp()); + return; + } + + let elev = new Eleventy(argv.input, argv.output, { + source: "cli", + // --quiet and --quiet=true both resolve to true + quietMode: argv.quiet, + configPath: argv.config, + pathPrefix: argv.pathprefix, + runMode: argv.serve ? "serve" : argv.watch ? "watch" : "build", + dryRun: argv.dryrun, + loader: argv.loader, + }); + + // reuse ErrorHandler instance in Eleventy + ErrorHandler = elev.errorHandler; + + // Before init + elev.setFormats(argv.formats); + + await elev.init(); + + if (argv.to === "json" || argv.to === "ndjson") { + // override logging output + elev.setIsVerbose(false); + } + + // Only relevant for watch/serve + elev.setIgnoreInitial(argv["ignore-initial"]); + + if(argv.incremental) { + elev.setIncrementalFile(argv.incremental); + } else if(argv.incremental !== undefined) { + elev.setIncrementalBuild(argv.incremental === "" || argv.incremental); + } + + if (argv.serve || argv.watch) { + if(argv.to === "json" || argv.to === "ndjson") { + throw new SimpleError("--to=json and --to=ndjson are not compatible with --serve or --watch."); + } + + await elev.watch(); + + if (argv.serve) { + // TODO await here? + elev.serve(argv.port); + } + + process.on("SIGINT", async () => { + await elev.stopWatch(); + process.exitCode = 0; + }); + } else { + if (!argv.to || argv.to === "fs") { + await elev.write(); + } else if (argv.to === "json") { + let result = await elev.toJSON() + console.log(JSON.stringify(result, null, 2)); + } else if (argv.to === "ndjson") { + let stream = await elev.toNDJSON(); + stream.pipe(process.stdout); + } else { + throw new SimpleError( + `Invalid --to value: ${argv.to}. Supported values: \`fs\` (default), \`json\`, and \`ndjson\`.`, + ); + } + } + } catch (error) { + if(typeof EleventyErrorHandler !== "undefined") { + let ErrorHandler = new EleventyErrorHandler(); + ErrorHandler.fatal(error, "Eleventy Fatal Error (CLI)"); + } else { + console.error(error); + process.exitCode = 1; + } + } +} + +exec(); diff --git a/node_modules/@11ty/eleventy/node_modules/.bin/js-yaml b/node_modules/@11ty/eleventy/node_modules/.bin/js-yaml new file mode 120000 index 0000000..9dbd010 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/.bin/js-yaml @@ -0,0 +1 @@ +../js-yaml/bin/js-yaml.js \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/argparse/CHANGELOG.md b/node_modules/@11ty/eleventy/node_modules/argparse/CHANGELOG.md new file mode 100644 index 0000000..dc39ed6 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/argparse/CHANGELOG.md @@ -0,0 +1,216 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + +## [2.0.1] - 2020-08-29 +### Fixed +- Fix issue with `process.argv` when used with interpreters (`coffee`, `ts-node`, etc.), #150. + + +## [2.0.0] - 2020-08-14 +### Changed +- Full rewrite. Now port from python 3.9.0 & more precise following. + See [doc](./doc) for difference and migration info. +- node.js 10+ required +- Removed most of local docs in favour of original ones. + + +## [1.0.10] - 2018-02-15 +### Fixed +- Use .concat instead of + for arrays, #122. + + +## [1.0.9] - 2016-09-29 +### Changed +- Rerelease after 1.0.8 - deps cleanup. + + +## [1.0.8] - 2016-09-29 +### Changed +- Maintenance (deps bump, fix node 6.5+ tests, coverage report). + + +## [1.0.7] - 2016-03-17 +### Changed +- Teach `addArgument` to accept string arg names. #97, @tomxtobin. + + +## [1.0.6] - 2016-02-06 +### Changed +- Maintenance: moved to eslint & updated CS. + + +## [1.0.5] - 2016-02-05 +### Changed +- Removed lodash dependency to significantly reduce install size. + Thanks to @mourner. + + +## [1.0.4] - 2016-01-17 +### Changed +- Maintenance: lodash update to 4.0.0. + + +## [1.0.3] - 2015-10-27 +### Fixed +- Fix parse `=` in args: `--examplepath="C:\myfolder\env=x64"`. #84, @CatWithApple. + + +## [1.0.2] - 2015-03-22 +### Changed +- Relaxed lodash version dependency. + + +## [1.0.1] - 2015-02-20 +### Changed +- Changed dependencies to be compatible with ancient nodejs. + + +## [1.0.0] - 2015-02-19 +### Changed +- Maintenance release. +- Replaced `underscore` with `lodash`. +- Bumped version to 1.0.0 to better reflect semver meaning. +- HISTORY.md -> CHANGELOG.md + + +## [0.1.16] - 2013-12-01 +### Changed +- Maintenance release. Updated dependencies and docs. + + +## [0.1.15] - 2013-05-13 +### Fixed +- Fixed #55, @trebor89 + + +## [0.1.14] - 2013-05-12 +### Fixed +- Fixed #62, @maxtaco + + +## [0.1.13] - 2013-04-08 +### Changed +- Added `.npmignore` to reduce package size + + +## [0.1.12] - 2013-02-10 +### Fixed +- Fixed conflictHandler (#46), @hpaulj + + +## [0.1.11] - 2013-02-07 +### Added +- Added 70+ tests (ported from python), @hpaulj +- Added conflictHandler, @applepicke +- Added fromfilePrefixChar, @hpaulj + +### Fixed +- Multiple bugfixes, @hpaulj + + +## [0.1.10] - 2012-12-30 +### Added +- Added [mutual exclusion](http://docs.python.org/dev/library/argparse.html#mutual-exclusion) + support, thanks to @hpaulj + +### Fixed +- Fixed options check for `storeConst` & `appendConst` actions, thanks to @hpaulj + + +## [0.1.9] - 2012-12-27 +### Fixed +- Fixed option dest interferens with other options (issue #23), thanks to @hpaulj +- Fixed default value behavior with `*` positionals, thanks to @hpaulj +- Improve `getDefault()` behavior, thanks to @hpaulj +- Improve negative argument parsing, thanks to @hpaulj + + +## [0.1.8] - 2012-12-01 +### Fixed +- Fixed parser parents (issue #19), thanks to @hpaulj +- Fixed negative argument parse (issue #20), thanks to @hpaulj + + +## [0.1.7] - 2012-10-14 +### Fixed +- Fixed 'choices' argument parse (issue #16) +- Fixed stderr output (issue #15) + + +## [0.1.6] - 2012-09-09 +### Fixed +- Fixed check for conflict of options (thanks to @tomxtobin) + + +## [0.1.5] - 2012-09-03 +### Fixed +- Fix parser #setDefaults method (thanks to @tomxtobin) + + +## [0.1.4] - 2012-07-30 +### Fixed +- Fixed pseudo-argument support (thanks to @CGamesPlay) +- Fixed addHelp default (should be true), if not set (thanks to @benblank) + + +## [0.1.3] - 2012-06-27 +### Fixed +- Fixed formatter api name: Formatter -> HelpFormatter + + +## [0.1.2] - 2012-05-29 +### Fixed +- Removed excess whitespace in help +- Fixed error reporting, when parcer with subcommands + called with empty arguments + +### Added +- Added basic tests + + +## [0.1.1] - 2012-05-23 +### Fixed +- Fixed line wrapping in help formatter +- Added better error reporting on invalid arguments + + +## [0.1.0] - 2012-05-16 +### Added +- First release. + + +[2.0.1]: https://github.com/nodeca/argparse/compare/2.0.0...2.0.1 +[2.0.0]: https://github.com/nodeca/argparse/compare/1.0.10...2.0.0 +[1.0.10]: https://github.com/nodeca/argparse/compare/1.0.9...1.0.10 +[1.0.9]: https://github.com/nodeca/argparse/compare/1.0.8...1.0.9 +[1.0.8]: https://github.com/nodeca/argparse/compare/1.0.7...1.0.8 +[1.0.7]: https://github.com/nodeca/argparse/compare/1.0.6...1.0.7 +[1.0.6]: https://github.com/nodeca/argparse/compare/1.0.5...1.0.6 +[1.0.5]: https://github.com/nodeca/argparse/compare/1.0.4...1.0.5 +[1.0.4]: https://github.com/nodeca/argparse/compare/1.0.3...1.0.4 +[1.0.3]: https://github.com/nodeca/argparse/compare/1.0.2...1.0.3 +[1.0.2]: https://github.com/nodeca/argparse/compare/1.0.1...1.0.2 +[1.0.1]: https://github.com/nodeca/argparse/compare/1.0.0...1.0.1 +[1.0.0]: https://github.com/nodeca/argparse/compare/0.1.16...1.0.0 +[0.1.16]: https://github.com/nodeca/argparse/compare/0.1.15...0.1.16 +[0.1.15]: https://github.com/nodeca/argparse/compare/0.1.14...0.1.15 +[0.1.14]: https://github.com/nodeca/argparse/compare/0.1.13...0.1.14 +[0.1.13]: https://github.com/nodeca/argparse/compare/0.1.12...0.1.13 +[0.1.12]: https://github.com/nodeca/argparse/compare/0.1.11...0.1.12 +[0.1.11]: https://github.com/nodeca/argparse/compare/0.1.10...0.1.11 +[0.1.10]: https://github.com/nodeca/argparse/compare/0.1.9...0.1.10 +[0.1.9]: https://github.com/nodeca/argparse/compare/0.1.8...0.1.9 +[0.1.8]: https://github.com/nodeca/argparse/compare/0.1.7...0.1.8 +[0.1.7]: https://github.com/nodeca/argparse/compare/0.1.6...0.1.7 +[0.1.6]: https://github.com/nodeca/argparse/compare/0.1.5...0.1.6 +[0.1.5]: https://github.com/nodeca/argparse/compare/0.1.4...0.1.5 +[0.1.4]: https://github.com/nodeca/argparse/compare/0.1.3...0.1.4 +[0.1.3]: https://github.com/nodeca/argparse/compare/0.1.2...0.1.3 +[0.1.2]: https://github.com/nodeca/argparse/compare/0.1.1...0.1.2 +[0.1.1]: https://github.com/nodeca/argparse/compare/0.1.0...0.1.1 +[0.1.0]: https://github.com/nodeca/argparse/releases/tag/0.1.0 diff --git a/node_modules/@11ty/eleventy/node_modules/argparse/LICENSE b/node_modules/@11ty/eleventy/node_modules/argparse/LICENSE new file mode 100644 index 0000000..66a3ac8 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/argparse/LICENSE @@ -0,0 +1,254 @@ +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see http://www.opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the Internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the Internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/@11ty/eleventy/node_modules/argparse/README.md b/node_modules/@11ty/eleventy/node_modules/argparse/README.md new file mode 100644 index 0000000..550b5c9 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/argparse/README.md @@ -0,0 +1,84 @@ +argparse +======== + +[![Build Status](https://secure.travis-ci.org/nodeca/argparse.svg?branch=master)](http://travis-ci.org/nodeca/argparse) +[![NPM version](https://img.shields.io/npm/v/argparse.svg)](https://www.npmjs.org/package/argparse) + +CLI arguments parser for node.js, with [sub-commands](https://docs.python.org/3.9/library/argparse.html#sub-commands) support. Port of python's [argparse](http://docs.python.org/dev/library/argparse.html) (version [3.9.0](https://github.com/python/cpython/blob/v3.9.0rc1/Lib/argparse.py)). + +**Difference with original.** + +- JS has no keyword arguments support. + - Pass options instead: `new ArgumentParser({ description: 'example', add_help: true })`. +- JS has no python's types `int`, `float`, ... + - Use string-typed names: `.add_argument('-b', { type: 'int', help: 'help' })`. +- `%r` format specifier uses `require('util').inspect()`. + +More details in [doc](./doc). + + +Example +------- + +`test.js` file: + +```javascript +#!/usr/bin/env node +'use strict'; + +const { ArgumentParser } = require('argparse'); +const { version } = require('./package.json'); + +const parser = new ArgumentParser({ + description: 'Argparse example' +}); + +parser.add_argument('-v', '--version', { action: 'version', version }); +parser.add_argument('-f', '--foo', { help: 'foo bar' }); +parser.add_argument('-b', '--bar', { help: 'bar foo' }); +parser.add_argument('--baz', { help: 'baz bar' }); + +console.dir(parser.parse_args()); +``` + +Display help: + +``` +$ ./test.js -h +usage: test.js [-h] [-v] [-f FOO] [-b BAR] [--baz BAZ] + +Argparse example + +optional arguments: + -h, --help show this help message and exit + -v, --version show program's version number and exit + -f FOO, --foo FOO foo bar + -b BAR, --bar BAR bar foo + --baz BAZ baz bar +``` + +Parse arguments: + +``` +$ ./test.js -f=3 --bar=4 --baz 5 +{ foo: '3', bar: '4', baz: '5' } +``` + + +API docs +-------- + +Since this is a port with minimal divergence, there's no separate documentation. +Use original one instead, with notes about difference. + +1. [Original doc](https://docs.python.org/3.9/library/argparse.html). +2. [Original tutorial](https://docs.python.org/3.9/howto/argparse.html). +3. [Difference with python](./doc). + + +argparse for enterprise +----------------------- + +Available as part of the Tidelift Subscription + +The maintainers of argparse and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-argparse?utm_source=npm-argparse&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/node_modules/@11ty/eleventy/node_modules/argparse/argparse.js b/node_modules/@11ty/eleventy/node_modules/argparse/argparse.js new file mode 100644 index 0000000..2b8c8c6 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/argparse/argparse.js @@ -0,0 +1,3707 @@ +// Port of python's argparse module, version 3.9.0: +// https://github.com/python/cpython/blob/v3.9.0rc1/Lib/argparse.py + +'use strict' + +// Copyright (C) 2010-2020 Python Software Foundation. +// Copyright (C) 2020 argparse.js authors + +/* + * Command-line parsing library + * + * This module is an optparse-inspired command-line parsing library that: + * + * - handles both optional and positional arguments + * - produces highly informative usage messages + * - supports parsers that dispatch to sub-parsers + * + * The following is a simple usage example that sums integers from the + * command-line and writes the result to a file:: + * + * parser = argparse.ArgumentParser( + * description='sum the integers at the command line') + * parser.add_argument( + * 'integers', metavar='int', nargs='+', type=int, + * help='an integer to be summed') + * parser.add_argument( + * '--log', default=sys.stdout, type=argparse.FileType('w'), + * help='the file where the sum should be written') + * args = parser.parse_args() + * args.log.write('%s' % sum(args.integers)) + * args.log.close() + * + * The module contains the following public classes: + * + * - ArgumentParser -- The main entry point for command-line parsing. As the + * example above shows, the add_argument() method is used to populate + * the parser with actions for optional and positional arguments. Then + * the parse_args() method is invoked to convert the args at the + * command-line into an object with attributes. + * + * - ArgumentError -- The exception raised by ArgumentParser objects when + * there are errors with the parser's actions. Errors raised while + * parsing the command-line are caught by ArgumentParser and emitted + * as command-line messages. + * + * - FileType -- A factory for defining types of files to be created. As the + * example above shows, instances of FileType are typically passed as + * the type= argument of add_argument() calls. + * + * - Action -- The base class for parser actions. Typically actions are + * selected by passing strings like 'store_true' or 'append_const' to + * the action= argument of add_argument(). However, for greater + * customization of ArgumentParser actions, subclasses of Action may + * be defined and passed as the action= argument. + * + * - HelpFormatter, RawDescriptionHelpFormatter, RawTextHelpFormatter, + * ArgumentDefaultsHelpFormatter -- Formatter classes which + * may be passed as the formatter_class= argument to the + * ArgumentParser constructor. HelpFormatter is the default, + * RawDescriptionHelpFormatter and RawTextHelpFormatter tell the parser + * not to change the formatting for help text, and + * ArgumentDefaultsHelpFormatter adds information about argument defaults + * to the help. + * + * All other classes in this module are considered implementation details. + * (Also note that HelpFormatter and RawDescriptionHelpFormatter are only + * considered public as object names -- the API of the formatter objects is + * still considered an implementation detail.) + */ + +const SUPPRESS = '==SUPPRESS==' + +const OPTIONAL = '?' +const ZERO_OR_MORE = '*' +const ONE_OR_MORE = '+' +const PARSER = 'A...' +const REMAINDER = '...' +const _UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args' + + +// ================================== +// Utility functions used for porting +// ================================== +const assert = require('assert') +const util = require('util') +const fs = require('fs') +const sub = require('./lib/sub') +const path = require('path') +const repr = util.inspect + +function get_argv() { + // omit first argument (which is assumed to be interpreter - `node`, `coffee`, `ts-node`, etc.) + return process.argv.slice(1) +} + +function get_terminal_size() { + return { + columns: +process.env.COLUMNS || process.stdout.columns || 80 + } +} + +function hasattr(object, name) { + return Object.prototype.hasOwnProperty.call(object, name) +} + +function getattr(object, name, value) { + return hasattr(object, name) ? object[name] : value +} + +function setattr(object, name, value) { + object[name] = value +} + +function setdefault(object, name, value) { + if (!hasattr(object, name)) object[name] = value + return object[name] +} + +function delattr(object, name) { + delete object[name] +} + +function range(from, to, step=1) { + // range(10) is equivalent to range(0, 10) + if (arguments.length === 1) [ to, from ] = [ from, 0 ] + if (typeof from !== 'number' || typeof to !== 'number' || typeof step !== 'number') { + throw new TypeError('argument cannot be interpreted as an integer') + } + if (step === 0) throw new TypeError('range() arg 3 must not be zero') + + let result = [] + if (step > 0) { + for (let i = from; i < to; i += step) result.push(i) + } else { + for (let i = from; i > to; i += step) result.push(i) + } + return result +} + +function splitlines(str, keepends = false) { + let result + if (!keepends) { + result = str.split(/\r\n|[\n\r\v\f\x1c\x1d\x1e\x85\u2028\u2029]/) + } else { + result = [] + let parts = str.split(/(\r\n|[\n\r\v\f\x1c\x1d\x1e\x85\u2028\u2029])/) + for (let i = 0; i < parts.length; i += 2) { + result.push(parts[i] + (i + 1 < parts.length ? parts[i + 1] : '')) + } + } + if (!result[result.length - 1]) result.pop() + return result +} + +function _string_lstrip(string, prefix_chars) { + let idx = 0 + while (idx < string.length && prefix_chars.includes(string[idx])) idx++ + return idx ? string.slice(idx) : string +} + +function _string_split(string, sep, maxsplit) { + let result = string.split(sep) + if (result.length > maxsplit) { + result = result.slice(0, maxsplit).concat([ result.slice(maxsplit).join(sep) ]) + } + return result +} + +function _array_equal(array1, array2) { + if (array1.length !== array2.length) return false + for (let i = 0; i < array1.length; i++) { + if (array1[i] !== array2[i]) return false + } + return true +} + +function _array_remove(array, item) { + let idx = array.indexOf(item) + if (idx === -1) throw new TypeError(sub('%r not in list', item)) + array.splice(idx, 1) +} + +// normalize choices to array; +// this isn't required in python because `in` and `map` operators work with anything, +// but in js dealing with multiple types here is too clunky +function _choices_to_array(choices) { + if (choices === undefined) { + return [] + } else if (Array.isArray(choices)) { + return choices + } else if (choices !== null && typeof choices[Symbol.iterator] === 'function') { + return Array.from(choices) + } else if (typeof choices === 'object' && choices !== null) { + return Object.keys(choices) + } else { + throw new Error(sub('invalid choices value: %r', choices)) + } +} + +// decorator that allows a class to be called without new +function _callable(cls) { + let result = { // object is needed for inferred class name + [cls.name]: function (...args) { + let this_class = new.target === result || !new.target + return Reflect.construct(cls, args, this_class ? cls : new.target) + } + } + result[cls.name].prototype = cls.prototype + // fix default tag for toString, e.g. [object Action] instead of [object Object] + cls.prototype[Symbol.toStringTag] = cls.name + return result[cls.name] +} + +function _alias(object, from, to) { + try { + let name = object.constructor.name + Object.defineProperty(object, from, { + value: util.deprecate(object[to], sub('%s.%s() is renamed to %s.%s()', + name, from, name, to)), + enumerable: false + }) + } catch {} +} + +// decorator that allows snake_case class methods to be called with camelCase and vice versa +function _camelcase_alias(_class) { + for (let name of Object.getOwnPropertyNames(_class.prototype)) { + let camelcase = name.replace(/\w_[a-z]/g, s => s[0] + s[2].toUpperCase()) + if (camelcase !== name) _alias(_class.prototype, camelcase, name) + } + return _class +} + +function _to_legacy_name(key) { + key = key.replace(/\w_[a-z]/g, s => s[0] + s[2].toUpperCase()) + if (key === 'default') key = 'defaultValue' + if (key === 'const') key = 'constant' + return key +} + +function _to_new_name(key) { + if (key === 'defaultValue') key = 'default' + if (key === 'constant') key = 'const' + key = key.replace(/[A-Z]/g, c => '_' + c.toLowerCase()) + return key +} + +// parse options +let no_default = Symbol('no_default_value') +function _parse_opts(args, descriptor) { + function get_name() { + let stack = new Error().stack.split('\n') + .map(x => x.match(/^ at (.*) \(.*\)$/)) + .filter(Boolean) + .map(m => m[1]) + .map(fn => fn.match(/[^ .]*$/)[0]) + + if (stack.length && stack[0] === get_name.name) stack.shift() + if (stack.length && stack[0] === _parse_opts.name) stack.shift() + return stack.length ? stack[0] : '' + } + + args = Array.from(args) + let kwargs = {} + let result = [] + let last_opt = args.length && args[args.length - 1] + + if (typeof last_opt === 'object' && last_opt !== null && !Array.isArray(last_opt) && + (!last_opt.constructor || last_opt.constructor.name === 'Object')) { + kwargs = Object.assign({}, args.pop()) + } + + // LEGACY (v1 compatibility): camelcase + let renames = [] + for (let key of Object.keys(descriptor)) { + let old_name = _to_legacy_name(key) + if (old_name !== key && (old_name in kwargs)) { + if (key in kwargs) { + // default and defaultValue specified at the same time, happens often in old tests + //throw new TypeError(sub('%s() got multiple values for argument %r', get_name(), key)) + } else { + kwargs[key] = kwargs[old_name] + } + renames.push([ old_name, key ]) + delete kwargs[old_name] + } + } + if (renames.length) { + let name = get_name() + deprecate('camelcase_' + name, sub('%s(): following options are renamed: %s', + name, renames.map(([ a, b ]) => sub('%r -> %r', a, b)))) + } + // end + + let missing_positionals = [] + let positional_count = args.length + + for (let [ key, def ] of Object.entries(descriptor)) { + if (key[0] === '*') { + if (key.length > 0 && key[1] === '*') { + // LEGACY (v1 compatibility): camelcase + let renames = [] + for (let key of Object.keys(kwargs)) { + let new_name = _to_new_name(key) + if (new_name !== key && (key in kwargs)) { + if (new_name in kwargs) { + // default and defaultValue specified at the same time, happens often in old tests + //throw new TypeError(sub('%s() got multiple values for argument %r', get_name(), new_name)) + } else { + kwargs[new_name] = kwargs[key] + } + renames.push([ key, new_name ]) + delete kwargs[key] + } + } + if (renames.length) { + let name = get_name() + deprecate('camelcase_' + name, sub('%s(): following options are renamed: %s', + name, renames.map(([ a, b ]) => sub('%r -> %r', a, b)))) + } + // end + result.push(kwargs) + kwargs = {} + } else { + result.push(args) + args = [] + } + } else if (key in kwargs && args.length > 0) { + throw new TypeError(sub('%s() got multiple values for argument %r', get_name(), key)) + } else if (key in kwargs) { + result.push(kwargs[key]) + delete kwargs[key] + } else if (args.length > 0) { + result.push(args.shift()) + } else if (def !== no_default) { + result.push(def) + } else { + missing_positionals.push(key) + } + } + + if (Object.keys(kwargs).length) { + throw new TypeError(sub('%s() got an unexpected keyword argument %r', + get_name(), Object.keys(kwargs)[0])) + } + + if (args.length) { + let from = Object.entries(descriptor).filter(([ k, v ]) => k[0] !== '*' && v !== no_default).length + let to = Object.entries(descriptor).filter(([ k ]) => k[0] !== '*').length + throw new TypeError(sub('%s() takes %s positional argument%s but %s %s given', + get_name(), + from === to ? sub('from %s to %s', from, to) : to, + from === to && to === 1 ? '' : 's', + positional_count, + positional_count === 1 ? 'was' : 'were')) + } + + if (missing_positionals.length) { + let strs = missing_positionals.map(repr) + if (strs.length > 1) strs[strs.length - 1] = 'and ' + strs[strs.length - 1] + let str_joined = strs.join(strs.length === 2 ? '' : ', ') + throw new TypeError(sub('%s() missing %i required positional argument%s: %s', + get_name(), strs.length, strs.length === 1 ? '' : 's', str_joined)) + } + + return result +} + +let _deprecations = {} +function deprecate(id, string) { + _deprecations[id] = _deprecations[id] || util.deprecate(() => {}, string) + _deprecations[id]() +} + + +// ============================= +// Utility functions and classes +// ============================= +function _AttributeHolder(cls = Object) { + /* + * Abstract base class that provides __repr__. + * + * The __repr__ method returns a string in the format:: + * ClassName(attr=name, attr=name, ...) + * The attributes are determined either by a class-level attribute, + * '_kwarg_names', or by inspecting the instance __dict__. + */ + + return class _AttributeHolder extends cls { + [util.inspect.custom]() { + let type_name = this.constructor.name + let arg_strings = [] + let star_args = {} + for (let arg of this._get_args()) { + arg_strings.push(repr(arg)) + } + for (let [ name, value ] of this._get_kwargs()) { + if (/^[a-z_][a-z0-9_$]*$/i.test(name)) { + arg_strings.push(sub('%s=%r', name, value)) + } else { + star_args[name] = value + } + } + if (Object.keys(star_args).length) { + arg_strings.push(sub('**%s', repr(star_args))) + } + return sub('%s(%s)', type_name, arg_strings.join(', ')) + } + + toString() { + return this[util.inspect.custom]() + } + + _get_kwargs() { + return Object.entries(this) + } + + _get_args() { + return [] + } + } +} + + +function _copy_items(items) { + if (items === undefined) { + return [] + } + return items.slice(0) +} + + +// =============== +// Formatting Help +// =============== +const HelpFormatter = _camelcase_alias(_callable(class HelpFormatter { + /* + * Formatter for generating usage messages and argument help strings. + * + * Only the name of this class is considered a public API. All the methods + * provided by the class are considered an implementation detail. + */ + + constructor() { + let [ + prog, + indent_increment, + max_help_position, + width + ] = _parse_opts(arguments, { + prog: no_default, + indent_increment: 2, + max_help_position: 24, + width: undefined + }) + + // default setting for width + if (width === undefined) { + width = get_terminal_size().columns + width -= 2 + } + + this._prog = prog + this._indent_increment = indent_increment + this._max_help_position = Math.min(max_help_position, + Math.max(width - 20, indent_increment * 2)) + this._width = width + + this._current_indent = 0 + this._level = 0 + this._action_max_length = 0 + + this._root_section = this._Section(this, undefined) + this._current_section = this._root_section + + this._whitespace_matcher = /[ \t\n\r\f\v]+/g // equivalent to python /\s+/ with ASCII flag + this._long_break_matcher = /\n\n\n+/g + } + + // =============================== + // Section and indentation methods + // =============================== + _indent() { + this._current_indent += this._indent_increment + this._level += 1 + } + + _dedent() { + this._current_indent -= this._indent_increment + assert(this._current_indent >= 0, 'Indent decreased below 0.') + this._level -= 1 + } + + _add_item(func, args) { + this._current_section.items.push([ func, args ]) + } + + // ======================== + // Message building methods + // ======================== + start_section(heading) { + this._indent() + let section = this._Section(this, this._current_section, heading) + this._add_item(section.format_help.bind(section), []) + this._current_section = section + } + + end_section() { + this._current_section = this._current_section.parent + this._dedent() + } + + add_text(text) { + if (text !== SUPPRESS && text !== undefined) { + this._add_item(this._format_text.bind(this), [text]) + } + } + + add_usage(usage, actions, groups, prefix = undefined) { + if (usage !== SUPPRESS) { + let args = [ usage, actions, groups, prefix ] + this._add_item(this._format_usage.bind(this), args) + } + } + + add_argument(action) { + if (action.help !== SUPPRESS) { + + // find all invocations + let invocations = [this._format_action_invocation(action)] + for (let subaction of this._iter_indented_subactions(action)) { + invocations.push(this._format_action_invocation(subaction)) + } + + // update the maximum item length + let invocation_length = Math.max(...invocations.map(invocation => invocation.length)) + let action_length = invocation_length + this._current_indent + this._action_max_length = Math.max(this._action_max_length, + action_length) + + // add the item to the list + this._add_item(this._format_action.bind(this), [action]) + } + } + + add_arguments(actions) { + for (let action of actions) { + this.add_argument(action) + } + } + + // ======================= + // Help-formatting methods + // ======================= + format_help() { + let help = this._root_section.format_help() + if (help) { + help = help.replace(this._long_break_matcher, '\n\n') + help = help.replace(/^\n+|\n+$/g, '') + '\n' + } + return help + } + + _join_parts(part_strings) { + return part_strings.filter(part => part && part !== SUPPRESS).join('') + } + + _format_usage(usage, actions, groups, prefix) { + if (prefix === undefined) { + prefix = 'usage: ' + } + + // if usage is specified, use that + if (usage !== undefined) { + usage = sub(usage, { prog: this._prog }) + + // if no optionals or positionals are available, usage is just prog + } else if (usage === undefined && !actions.length) { + usage = sub('%(prog)s', { prog: this._prog }) + + // if optionals and positionals are available, calculate usage + } else if (usage === undefined) { + let prog = sub('%(prog)s', { prog: this._prog }) + + // split optionals from positionals + let optionals = [] + let positionals = [] + for (let action of actions) { + if (action.option_strings.length) { + optionals.push(action) + } else { + positionals.push(action) + } + } + + // build full usage string + let action_usage = this._format_actions_usage([].concat(optionals).concat(positionals), groups) + usage = [ prog, action_usage ].map(String).join(' ') + + // wrap the usage parts if it's too long + let text_width = this._width - this._current_indent + if (prefix.length + usage.length > text_width) { + + // break usage into wrappable parts + let part_regexp = /\(.*?\)+(?=\s|$)|\[.*?\]+(?=\s|$)|\S+/g + let opt_usage = this._format_actions_usage(optionals, groups) + let pos_usage = this._format_actions_usage(positionals, groups) + let opt_parts = opt_usage.match(part_regexp) || [] + let pos_parts = pos_usage.match(part_regexp) || [] + assert(opt_parts.join(' ') === opt_usage) + assert(pos_parts.join(' ') === pos_usage) + + // helper for wrapping lines + let get_lines = (parts, indent, prefix = undefined) => { + let lines = [] + let line = [] + let line_len + if (prefix !== undefined) { + line_len = prefix.length - 1 + } else { + line_len = indent.length - 1 + } + for (let part of parts) { + if (line_len + 1 + part.length > text_width && line) { + lines.push(indent + line.join(' ')) + line = [] + line_len = indent.length - 1 + } + line.push(part) + line_len += part.length + 1 + } + if (line.length) { + lines.push(indent + line.join(' ')) + } + if (prefix !== undefined) { + lines[0] = lines[0].slice(indent.length) + } + return lines + } + + let lines + + // if prog is short, follow it with optionals or positionals + if (prefix.length + prog.length <= 0.75 * text_width) { + let indent = ' '.repeat(prefix.length + prog.length + 1) + if (opt_parts.length) { + lines = get_lines([prog].concat(opt_parts), indent, prefix) + lines = lines.concat(get_lines(pos_parts, indent)) + } else if (pos_parts.length) { + lines = get_lines([prog].concat(pos_parts), indent, prefix) + } else { + lines = [prog] + } + + // if prog is long, put it on its own line + } else { + let indent = ' '.repeat(prefix.length) + let parts = [].concat(opt_parts).concat(pos_parts) + lines = get_lines(parts, indent) + if (lines.length > 1) { + lines = [] + lines = lines.concat(get_lines(opt_parts, indent)) + lines = lines.concat(get_lines(pos_parts, indent)) + } + lines = [prog].concat(lines) + } + + // join lines into usage + usage = lines.join('\n') + } + } + + // prefix with 'usage:' + return sub('%s%s\n\n', prefix, usage) + } + + _format_actions_usage(actions, groups) { + // find group indices and identify actions in groups + let group_actions = new Set() + let inserts = {} + for (let group of groups) { + let start = actions.indexOf(group._group_actions[0]) + if (start === -1) { + continue + } else { + let end = start + group._group_actions.length + if (_array_equal(actions.slice(start, end), group._group_actions)) { + for (let action of group._group_actions) { + group_actions.add(action) + } + if (!group.required) { + if (start in inserts) { + inserts[start] += ' [' + } else { + inserts[start] = '[' + } + if (end in inserts) { + inserts[end] += ']' + } else { + inserts[end] = ']' + } + } else { + if (start in inserts) { + inserts[start] += ' (' + } else { + inserts[start] = '(' + } + if (end in inserts) { + inserts[end] += ')' + } else { + inserts[end] = ')' + } + } + for (let i of range(start + 1, end)) { + inserts[i] = '|' + } + } + } + } + + // collect all actions format strings + let parts = [] + for (let [ i, action ] of Object.entries(actions)) { + + // suppressed arguments are marked with None + // remove | separators for suppressed arguments + if (action.help === SUPPRESS) { + parts.push(undefined) + if (inserts[+i] === '|') { + delete inserts[+i] + } else if (inserts[+i + 1] === '|') { + delete inserts[+i + 1] + } + + // produce all arg strings + } else if (!action.option_strings.length) { + let default_value = this._get_default_metavar_for_positional(action) + let part = this._format_args(action, default_value) + + // if it's in a group, strip the outer [] + if (group_actions.has(action)) { + if (part[0] === '[' && part[part.length - 1] === ']') { + part = part.slice(1, -1) + } + } + + // add the action string to the list + parts.push(part) + + // produce the first way to invoke the option in brackets + } else { + let option_string = action.option_strings[0] + let part + + // if the Optional doesn't take a value, format is: + // -s or --long + if (action.nargs === 0) { + part = action.format_usage() + + // if the Optional takes a value, format is: + // -s ARGS or --long ARGS + } else { + let default_value = this._get_default_metavar_for_optional(action) + let args_string = this._format_args(action, default_value) + part = sub('%s %s', option_string, args_string) + } + + // make it look optional if it's not required or in a group + if (!action.required && !group_actions.has(action)) { + part = sub('[%s]', part) + } + + // add the action string to the list + parts.push(part) + } + } + + // insert things at the necessary indices + for (let i of Object.keys(inserts).map(Number).sort((a, b) => b - a)) { + parts.splice(+i, 0, inserts[+i]) + } + + // join all the action items with spaces + let text = parts.filter(Boolean).join(' ') + + // clean up separators for mutually exclusive groups + text = text.replace(/([\[(]) /g, '$1') + text = text.replace(/ ([\])])/g, '$1') + text = text.replace(/[\[(] *[\])]/g, '') + text = text.replace(/\(([^|]*)\)/g, '$1', text) + text = text.trim() + + // return the text + return text + } + + _format_text(text) { + if (text.includes('%(prog)')) { + text = sub(text, { prog: this._prog }) + } + let text_width = Math.max(this._width - this._current_indent, 11) + let indent = ' '.repeat(this._current_indent) + return this._fill_text(text, text_width, indent) + '\n\n' + } + + _format_action(action) { + // determine the required width and the entry label + let help_position = Math.min(this._action_max_length + 2, + this._max_help_position) + let help_width = Math.max(this._width - help_position, 11) + let action_width = help_position - this._current_indent - 2 + let action_header = this._format_action_invocation(action) + let indent_first + + // no help; start on same line and add a final newline + if (!action.help) { + let tup = [ this._current_indent, '', action_header ] + action_header = sub('%*s%s\n', ...tup) + + // short action name; start on the same line and pad two spaces + } else if (action_header.length <= action_width) { + let tup = [ this._current_indent, '', action_width, action_header ] + action_header = sub('%*s%-*s ', ...tup) + indent_first = 0 + + // long action name; start on the next line + } else { + let tup = [ this._current_indent, '', action_header ] + action_header = sub('%*s%s\n', ...tup) + indent_first = help_position + } + + // collect the pieces of the action help + let parts = [action_header] + + // if there was help for the action, add lines of help text + if (action.help) { + let help_text = this._expand_help(action) + let help_lines = this._split_lines(help_text, help_width) + parts.push(sub('%*s%s\n', indent_first, '', help_lines[0])) + for (let line of help_lines.slice(1)) { + parts.push(sub('%*s%s\n', help_position, '', line)) + } + + // or add a newline if the description doesn't end with one + } else if (!action_header.endsWith('\n')) { + parts.push('\n') + } + + // if there are any sub-actions, add their help as well + for (let subaction of this._iter_indented_subactions(action)) { + parts.push(this._format_action(subaction)) + } + + // return a single string + return this._join_parts(parts) + } + + _format_action_invocation(action) { + if (!action.option_strings.length) { + let default_value = this._get_default_metavar_for_positional(action) + let metavar = this._metavar_formatter(action, default_value)(1)[0] + return metavar + + } else { + let parts = [] + + // if the Optional doesn't take a value, format is: + // -s, --long + if (action.nargs === 0) { + parts = parts.concat(action.option_strings) + + // if the Optional takes a value, format is: + // -s ARGS, --long ARGS + } else { + let default_value = this._get_default_metavar_for_optional(action) + let args_string = this._format_args(action, default_value) + for (let option_string of action.option_strings) { + parts.push(sub('%s %s', option_string, args_string)) + } + } + + return parts.join(', ') + } + } + + _metavar_formatter(action, default_metavar) { + let result + if (action.metavar !== undefined) { + result = action.metavar + } else if (action.choices !== undefined) { + let choice_strs = _choices_to_array(action.choices).map(String) + result = sub('{%s}', choice_strs.join(',')) + } else { + result = default_metavar + } + + function format(tuple_size) { + if (Array.isArray(result)) { + return result + } else { + return Array(tuple_size).fill(result) + } + } + return format + } + + _format_args(action, default_metavar) { + let get_metavar = this._metavar_formatter(action, default_metavar) + let result + if (action.nargs === undefined) { + result = sub('%s', ...get_metavar(1)) + } else if (action.nargs === OPTIONAL) { + result = sub('[%s]', ...get_metavar(1)) + } else if (action.nargs === ZERO_OR_MORE) { + let metavar = get_metavar(1) + if (metavar.length === 2) { + result = sub('[%s [%s ...]]', ...metavar) + } else { + result = sub('[%s ...]', ...metavar) + } + } else if (action.nargs === ONE_OR_MORE) { + result = sub('%s [%s ...]', ...get_metavar(2)) + } else if (action.nargs === REMAINDER) { + result = '...' + } else if (action.nargs === PARSER) { + result = sub('%s ...', ...get_metavar(1)) + } else if (action.nargs === SUPPRESS) { + result = '' + } else { + let formats + try { + formats = range(action.nargs).map(() => '%s') + } catch (err) { + throw new TypeError('invalid nargs value') + } + result = sub(formats.join(' '), ...get_metavar(action.nargs)) + } + return result + } + + _expand_help(action) { + let params = Object.assign({ prog: this._prog }, action) + for (let name of Object.keys(params)) { + if (params[name] === SUPPRESS) { + delete params[name] + } + } + for (let name of Object.keys(params)) { + if (params[name] && params[name].name) { + params[name] = params[name].name + } + } + if (params.choices !== undefined) { + let choices_str = _choices_to_array(params.choices).map(String).join(', ') + params.choices = choices_str + } + // LEGACY (v1 compatibility): camelcase + for (let key of Object.keys(params)) { + let old_name = _to_legacy_name(key) + if (old_name !== key) { + params[old_name] = params[key] + } + } + // end + return sub(this._get_help_string(action), params) + } + + * _iter_indented_subactions(action) { + if (typeof action._get_subactions === 'function') { + this._indent() + yield* action._get_subactions() + this._dedent() + } + } + + _split_lines(text, width) { + text = text.replace(this._whitespace_matcher, ' ').trim() + // The textwrap module is used only for formatting help. + // Delay its import for speeding up the common usage of argparse. + let textwrap = require('./lib/textwrap') + return textwrap.wrap(text, { width }) + } + + _fill_text(text, width, indent) { + text = text.replace(this._whitespace_matcher, ' ').trim() + let textwrap = require('./lib/textwrap') + return textwrap.fill(text, { width, + initial_indent: indent, + subsequent_indent: indent }) + } + + _get_help_string(action) { + return action.help + } + + _get_default_metavar_for_optional(action) { + return action.dest.toUpperCase() + } + + _get_default_metavar_for_positional(action) { + return action.dest + } +})) + +HelpFormatter.prototype._Section = _callable(class _Section { + + constructor(formatter, parent, heading = undefined) { + this.formatter = formatter + this.parent = parent + this.heading = heading + this.items = [] + } + + format_help() { + // format the indented section + if (this.parent !== undefined) { + this.formatter._indent() + } + let item_help = this.formatter._join_parts(this.items.map(([ func, args ]) => func.apply(null, args))) + if (this.parent !== undefined) { + this.formatter._dedent() + } + + // return nothing if the section was empty + if (!item_help) { + return '' + } + + // add the heading if the section was non-empty + let heading + if (this.heading !== SUPPRESS && this.heading !== undefined) { + let current_indent = this.formatter._current_indent + heading = sub('%*s%s:\n', current_indent, '', this.heading) + } else { + heading = '' + } + + // join the section-initial newline, the heading and the help + return this.formatter._join_parts(['\n', heading, item_help, '\n']) + } +}) + + +const RawDescriptionHelpFormatter = _camelcase_alias(_callable(class RawDescriptionHelpFormatter extends HelpFormatter { + /* + * Help message formatter which retains any formatting in descriptions. + * + * Only the name of this class is considered a public API. All the methods + * provided by the class are considered an implementation detail. + */ + + _fill_text(text, width, indent) { + return splitlines(text, true).map(line => indent + line).join('') + } +})) + + +const RawTextHelpFormatter = _camelcase_alias(_callable(class RawTextHelpFormatter extends RawDescriptionHelpFormatter { + /* + * Help message formatter which retains formatting of all help text. + * + * Only the name of this class is considered a public API. All the methods + * provided by the class are considered an implementation detail. + */ + + _split_lines(text/*, width*/) { + return splitlines(text) + } +})) + + +const ArgumentDefaultsHelpFormatter = _camelcase_alias(_callable(class ArgumentDefaultsHelpFormatter extends HelpFormatter { + /* + * Help message formatter which adds default values to argument help. + * + * Only the name of this class is considered a public API. All the methods + * provided by the class are considered an implementation detail. + */ + + _get_help_string(action) { + let help = action.help + // LEGACY (v1 compatibility): additional check for defaultValue needed + if (!action.help.includes('%(default)') && !action.help.includes('%(defaultValue)')) { + if (action.default !== SUPPRESS) { + let defaulting_nargs = [OPTIONAL, ZERO_OR_MORE] + if (action.option_strings.length || defaulting_nargs.includes(action.nargs)) { + help += ' (default: %(default)s)' + } + } + } + return help + } +})) + + +const MetavarTypeHelpFormatter = _camelcase_alias(_callable(class MetavarTypeHelpFormatter extends HelpFormatter { + /* + * Help message formatter which uses the argument 'type' as the default + * metavar value (instead of the argument 'dest') + * + * Only the name of this class is considered a public API. All the methods + * provided by the class are considered an implementation detail. + */ + + _get_default_metavar_for_optional(action) { + return typeof action.type === 'function' ? action.type.name : action.type + } + + _get_default_metavar_for_positional(action) { + return typeof action.type === 'function' ? action.type.name : action.type + } +})) + + +// ===================== +// Options and Arguments +// ===================== +function _get_action_name(argument) { + if (argument === undefined) { + return undefined + } else if (argument.option_strings.length) { + return argument.option_strings.join('/') + } else if (![ undefined, SUPPRESS ].includes(argument.metavar)) { + return argument.metavar + } else if (![ undefined, SUPPRESS ].includes(argument.dest)) { + return argument.dest + } else { + return undefined + } +} + + +const ArgumentError = _callable(class ArgumentError extends Error { + /* + * An error from creating or using an argument (optional or positional). + * + * The string value of this exception is the message, augmented with + * information about the argument that caused it. + */ + + constructor(argument, message) { + super() + this.name = 'ArgumentError' + this._argument_name = _get_action_name(argument) + this._message = message + this.message = this.str() + } + + str() { + let format + if (this._argument_name === undefined) { + format = '%(message)s' + } else { + format = 'argument %(argument_name)s: %(message)s' + } + return sub(format, { message: this._message, + argument_name: this._argument_name }) + } +}) + + +const ArgumentTypeError = _callable(class ArgumentTypeError extends Error { + /* + * An error from trying to convert a command line string to a type. + */ + + constructor(message) { + super(message) + this.name = 'ArgumentTypeError' + } +}) + + +// ============== +// Action classes +// ============== +const Action = _camelcase_alias(_callable(class Action extends _AttributeHolder(Function) { + /* + * Information about how to convert command line strings to Python objects. + * + * Action objects are used by an ArgumentParser to represent the information + * needed to parse a single argument from one or more strings from the + * command line. The keyword arguments to the Action constructor are also + * all attributes of Action instances. + * + * Keyword Arguments: + * + * - option_strings -- A list of command-line option strings which + * should be associated with this action. + * + * - dest -- The name of the attribute to hold the created object(s) + * + * - nargs -- The number of command-line arguments that should be + * consumed. By default, one argument will be consumed and a single + * value will be produced. Other values include: + * - N (an integer) consumes N arguments (and produces a list) + * - '?' consumes zero or one arguments + * - '*' consumes zero or more arguments (and produces a list) + * - '+' consumes one or more arguments (and produces a list) + * Note that the difference between the default and nargs=1 is that + * with the default, a single value will be produced, while with + * nargs=1, a list containing a single value will be produced. + * + * - const -- The value to be produced if the option is specified and the + * option uses an action that takes no values. + * + * - default -- The value to be produced if the option is not specified. + * + * - type -- A callable that accepts a single string argument, and + * returns the converted value. The standard Python types str, int, + * float, and complex are useful examples of such callables. If None, + * str is used. + * + * - choices -- A container of values that should be allowed. If not None, + * after a command-line argument has been converted to the appropriate + * type, an exception will be raised if it is not a member of this + * collection. + * + * - required -- True if the action must always be specified at the + * command line. This is only meaningful for optional command-line + * arguments. + * + * - help -- The help string describing the argument. + * + * - metavar -- The name to be used for the option's argument with the + * help string. If None, the 'dest' value will be used as the name. + */ + + constructor() { + let [ + option_strings, + dest, + nargs, + const_value, + default_value, + type, + choices, + required, + help, + metavar + ] = _parse_opts(arguments, { + option_strings: no_default, + dest: no_default, + nargs: undefined, + const: undefined, + default: undefined, + type: undefined, + choices: undefined, + required: false, + help: undefined, + metavar: undefined + }) + + // when this class is called as a function, redirect it to .call() method of itself + super('return arguments.callee.call.apply(arguments.callee, arguments)') + + this.option_strings = option_strings + this.dest = dest + this.nargs = nargs + this.const = const_value + this.default = default_value + this.type = type + this.choices = choices + this.required = required + this.help = help + this.metavar = metavar + } + + _get_kwargs() { + let names = [ + 'option_strings', + 'dest', + 'nargs', + 'const', + 'default', + 'type', + 'choices', + 'help', + 'metavar' + ] + return names.map(name => [ name, getattr(this, name) ]) + } + + format_usage() { + return this.option_strings[0] + } + + call(/*parser, namespace, values, option_string = undefined*/) { + throw new Error('.call() not defined') + } +})) + + +const BooleanOptionalAction = _camelcase_alias(_callable(class BooleanOptionalAction extends Action { + + constructor() { + let [ + option_strings, + dest, + default_value, + type, + choices, + required, + help, + metavar + ] = _parse_opts(arguments, { + option_strings: no_default, + dest: no_default, + default: undefined, + type: undefined, + choices: undefined, + required: false, + help: undefined, + metavar: undefined + }) + + let _option_strings = [] + for (let option_string of option_strings) { + _option_strings.push(option_string) + + if (option_string.startsWith('--')) { + option_string = '--no-' + option_string.slice(2) + _option_strings.push(option_string) + } + } + + if (help !== undefined && default_value !== undefined) { + help += ` (default: ${default_value})` + } + + super({ + option_strings: _option_strings, + dest, + nargs: 0, + default: default_value, + type, + choices, + required, + help, + metavar + }) + } + + call(parser, namespace, values, option_string = undefined) { + if (this.option_strings.includes(option_string)) { + setattr(namespace, this.dest, !option_string.startsWith('--no-')) + } + } + + format_usage() { + return this.option_strings.join(' | ') + } +})) + + +const _StoreAction = _callable(class _StoreAction extends Action { + + constructor() { + let [ + option_strings, + dest, + nargs, + const_value, + default_value, + type, + choices, + required, + help, + metavar + ] = _parse_opts(arguments, { + option_strings: no_default, + dest: no_default, + nargs: undefined, + const: undefined, + default: undefined, + type: undefined, + choices: undefined, + required: false, + help: undefined, + metavar: undefined + }) + + if (nargs === 0) { + throw new TypeError('nargs for store actions must be != 0; if you ' + + 'have nothing to store, actions such as store ' + + 'true or store const may be more appropriate') + } + if (const_value !== undefined && nargs !== OPTIONAL) { + throw new TypeError(sub('nargs must be %r to supply const', OPTIONAL)) + } + super({ + option_strings, + dest, + nargs, + const: const_value, + default: default_value, + type, + choices, + required, + help, + metavar + }) + } + + call(parser, namespace, values/*, option_string = undefined*/) { + setattr(namespace, this.dest, values) + } +}) + + +const _StoreConstAction = _callable(class _StoreConstAction extends Action { + + constructor() { + let [ + option_strings, + dest, + const_value, + default_value, + required, + help + //, metavar + ] = _parse_opts(arguments, { + option_strings: no_default, + dest: no_default, + const: no_default, + default: undefined, + required: false, + help: undefined, + metavar: undefined + }) + + super({ + option_strings, + dest, + nargs: 0, + const: const_value, + default: default_value, + required, + help + }) + } + + call(parser, namespace/*, values, option_string = undefined*/) { + setattr(namespace, this.dest, this.const) + } +}) + + +const _StoreTrueAction = _callable(class _StoreTrueAction extends _StoreConstAction { + + constructor() { + let [ + option_strings, + dest, + default_value, + required, + help + ] = _parse_opts(arguments, { + option_strings: no_default, + dest: no_default, + default: false, + required: false, + help: undefined + }) + + super({ + option_strings, + dest, + const: true, + default: default_value, + required, + help + }) + } +}) + + +const _StoreFalseAction = _callable(class _StoreFalseAction extends _StoreConstAction { + + constructor() { + let [ + option_strings, + dest, + default_value, + required, + help + ] = _parse_opts(arguments, { + option_strings: no_default, + dest: no_default, + default: true, + required: false, + help: undefined + }) + + super({ + option_strings, + dest, + const: false, + default: default_value, + required, + help + }) + } +}) + + +const _AppendAction = _callable(class _AppendAction extends Action { + + constructor() { + let [ + option_strings, + dest, + nargs, + const_value, + default_value, + type, + choices, + required, + help, + metavar + ] = _parse_opts(arguments, { + option_strings: no_default, + dest: no_default, + nargs: undefined, + const: undefined, + default: undefined, + type: undefined, + choices: undefined, + required: false, + help: undefined, + metavar: undefined + }) + + if (nargs === 0) { + throw new TypeError('nargs for append actions must be != 0; if arg ' + + 'strings are not supplying the value to append, ' + + 'the append const action may be more appropriate') + } + if (const_value !== undefined && nargs !== OPTIONAL) { + throw new TypeError(sub('nargs must be %r to supply const', OPTIONAL)) + } + super({ + option_strings, + dest, + nargs, + const: const_value, + default: default_value, + type, + choices, + required, + help, + metavar + }) + } + + call(parser, namespace, values/*, option_string = undefined*/) { + let items = getattr(namespace, this.dest, undefined) + items = _copy_items(items) + items.push(values) + setattr(namespace, this.dest, items) + } +}) + + +const _AppendConstAction = _callable(class _AppendConstAction extends Action { + + constructor() { + let [ + option_strings, + dest, + const_value, + default_value, + required, + help, + metavar + ] = _parse_opts(arguments, { + option_strings: no_default, + dest: no_default, + const: no_default, + default: undefined, + required: false, + help: undefined, + metavar: undefined + }) + + super({ + option_strings, + dest, + nargs: 0, + const: const_value, + default: default_value, + required, + help, + metavar + }) + } + + call(parser, namespace/*, values, option_string = undefined*/) { + let items = getattr(namespace, this.dest, undefined) + items = _copy_items(items) + items.push(this.const) + setattr(namespace, this.dest, items) + } +}) + + +const _CountAction = _callable(class _CountAction extends Action { + + constructor() { + let [ + option_strings, + dest, + default_value, + required, + help + ] = _parse_opts(arguments, { + option_strings: no_default, + dest: no_default, + default: undefined, + required: false, + help: undefined + }) + + super({ + option_strings, + dest, + nargs: 0, + default: default_value, + required, + help + }) + } + + call(parser, namespace/*, values, option_string = undefined*/) { + let count = getattr(namespace, this.dest, undefined) + if (count === undefined) { + count = 0 + } + setattr(namespace, this.dest, count + 1) + } +}) + + +const _HelpAction = _callable(class _HelpAction extends Action { + + constructor() { + let [ + option_strings, + dest, + default_value, + help + ] = _parse_opts(arguments, { + option_strings: no_default, + dest: SUPPRESS, + default: SUPPRESS, + help: undefined + }) + + super({ + option_strings, + dest, + default: default_value, + nargs: 0, + help + }) + } + + call(parser/*, namespace, values, option_string = undefined*/) { + parser.print_help() + parser.exit() + } +}) + + +const _VersionAction = _callable(class _VersionAction extends Action { + + constructor() { + let [ + option_strings, + version, + dest, + default_value, + help + ] = _parse_opts(arguments, { + option_strings: no_default, + version: undefined, + dest: SUPPRESS, + default: SUPPRESS, + help: "show program's version number and exit" + }) + + super({ + option_strings, + dest, + default: default_value, + nargs: 0, + help + }) + this.version = version + } + + call(parser/*, namespace, values, option_string = undefined*/) { + let version = this.version + if (version === undefined) { + version = parser.version + } + let formatter = parser._get_formatter() + formatter.add_text(version) + parser._print_message(formatter.format_help(), process.stdout) + parser.exit() + } +}) + + +const _SubParsersAction = _camelcase_alias(_callable(class _SubParsersAction extends Action { + + constructor() { + let [ + option_strings, + prog, + parser_class, + dest, + required, + help, + metavar + ] = _parse_opts(arguments, { + option_strings: no_default, + prog: no_default, + parser_class: no_default, + dest: SUPPRESS, + required: false, + help: undefined, + metavar: undefined + }) + + let name_parser_map = {} + + super({ + option_strings, + dest, + nargs: PARSER, + choices: name_parser_map, + required, + help, + metavar + }) + + this._prog_prefix = prog + this._parser_class = parser_class + this._name_parser_map = name_parser_map + this._choices_actions = [] + } + + add_parser() { + let [ + name, + kwargs + ] = _parse_opts(arguments, { + name: no_default, + '**kwargs': no_default + }) + + // set prog from the existing prefix + if (kwargs.prog === undefined) { + kwargs.prog = sub('%s %s', this._prog_prefix, name) + } + + let aliases = getattr(kwargs, 'aliases', []) + delete kwargs.aliases + + // create a pseudo-action to hold the choice help + if ('help' in kwargs) { + let help = kwargs.help + delete kwargs.help + let choice_action = this._ChoicesPseudoAction(name, aliases, help) + this._choices_actions.push(choice_action) + } + + // create the parser and add it to the map + let parser = new this._parser_class(kwargs) + this._name_parser_map[name] = parser + + // make parser available under aliases also + for (let alias of aliases) { + this._name_parser_map[alias] = parser + } + + return parser + } + + _get_subactions() { + return this._choices_actions + } + + call(parser, namespace, values/*, option_string = undefined*/) { + let parser_name = values[0] + let arg_strings = values.slice(1) + + // set the parser name if requested + if (this.dest !== SUPPRESS) { + setattr(namespace, this.dest, parser_name) + } + + // select the parser + if (hasattr(this._name_parser_map, parser_name)) { + parser = this._name_parser_map[parser_name] + } else { + let args = {parser_name, + choices: this._name_parser_map.join(', ')} + let msg = sub('unknown parser %(parser_name)r (choices: %(choices)s)', args) + throw new ArgumentError(this, msg) + } + + // parse all the remaining options into the namespace + // store any unrecognized options on the object, so that the top + // level parser can decide what to do with them + + // In case this subparser defines new defaults, we parse them + // in a new namespace object and then update the original + // namespace for the relevant parts. + let subnamespace + [ subnamespace, arg_strings ] = parser.parse_known_args(arg_strings, undefined) + for (let [ key, value ] of Object.entries(subnamespace)) { + setattr(namespace, key, value) + } + + if (arg_strings.length) { + setdefault(namespace, _UNRECOGNIZED_ARGS_ATTR, []) + getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).push(...arg_strings) + } + } +})) + + +_SubParsersAction.prototype._ChoicesPseudoAction = _callable(class _ChoicesPseudoAction extends Action { + constructor(name, aliases, help) { + let metavar = name, dest = name + if (aliases.length) { + metavar += sub(' (%s)', aliases.join(', ')) + } + super({ option_strings: [], dest, help, metavar }) + } +}) + + +const _ExtendAction = _callable(class _ExtendAction extends _AppendAction { + call(parser, namespace, values/*, option_string = undefined*/) { + let items = getattr(namespace, this.dest, undefined) + items = _copy_items(items) + items = items.concat(values) + setattr(namespace, this.dest, items) + } +}) + + +// ============== +// Type classes +// ============== +const FileType = _callable(class FileType extends Function { + /* + * Factory for creating file object types + * + * Instances of FileType are typically passed as type= arguments to the + * ArgumentParser add_argument() method. + * + * Keyword Arguments: + * - mode -- A string indicating how the file is to be opened. Accepts the + * same values as the builtin open() function. + * - bufsize -- The file's desired buffer size. Accepts the same values as + * the builtin open() function. + * - encoding -- The file's encoding. Accepts the same values as the + * builtin open() function. + * - errors -- A string indicating how encoding and decoding errors are to + * be handled. Accepts the same value as the builtin open() function. + */ + + constructor() { + let [ + flags, + encoding, + mode, + autoClose, + emitClose, + start, + end, + highWaterMark, + fs + ] = _parse_opts(arguments, { + flags: 'r', + encoding: undefined, + mode: undefined, // 0o666 + autoClose: undefined, // true + emitClose: undefined, // false + start: undefined, // 0 + end: undefined, // Infinity + highWaterMark: undefined, // 64 * 1024 + fs: undefined + }) + + // when this class is called as a function, redirect it to .call() method of itself + super('return arguments.callee.call.apply(arguments.callee, arguments)') + + Object.defineProperty(this, 'name', { + get() { + return sub('FileType(%r)', flags) + } + }) + this._flags = flags + this._options = {} + if (encoding !== undefined) this._options.encoding = encoding + if (mode !== undefined) this._options.mode = mode + if (autoClose !== undefined) this._options.autoClose = autoClose + if (emitClose !== undefined) this._options.emitClose = emitClose + if (start !== undefined) this._options.start = start + if (end !== undefined) this._options.end = end + if (highWaterMark !== undefined) this._options.highWaterMark = highWaterMark + if (fs !== undefined) this._options.fs = fs + } + + call(string) { + // the special argument "-" means sys.std{in,out} + if (string === '-') { + if (this._flags.includes('r')) { + return process.stdin + } else if (this._flags.includes('w')) { + return process.stdout + } else { + let msg = sub('argument "-" with mode %r', this._flags) + throw new TypeError(msg) + } + } + + // all other arguments are used as file names + let fd + try { + fd = fs.openSync(string, this._flags, this._options.mode) + } catch (e) { + let args = { filename: string, error: e.message } + let message = "can't open '%(filename)s': %(error)s" + throw new ArgumentTypeError(sub(message, args)) + } + + let options = Object.assign({ fd, flags: this._flags }, this._options) + if (this._flags.includes('r')) { + return fs.createReadStream(undefined, options) + } else if (this._flags.includes('w')) { + return fs.createWriteStream(undefined, options) + } else { + let msg = sub('argument "%s" with mode %r', string, this._flags) + throw new TypeError(msg) + } + } + + [util.inspect.custom]() { + let args = [ this._flags ] + let kwargs = Object.entries(this._options).map(([ k, v ]) => { + if (k === 'mode') v = { value: v, [util.inspect.custom]() { return '0o' + this.value.toString(8) } } + return [ k, v ] + }) + let args_str = [] + .concat(args.filter(arg => arg !== -1).map(repr)) + .concat(kwargs.filter(([/*kw*/, arg]) => arg !== undefined) + .map(([kw, arg]) => sub('%s=%r', kw, arg))) + .join(', ') + return sub('%s(%s)', this.constructor.name, args_str) + } + + toString() { + return this[util.inspect.custom]() + } +}) + +// =========================== +// Optional and Positional Parsing +// =========================== +const Namespace = _callable(class Namespace extends _AttributeHolder() { + /* + * Simple object for storing attributes. + * + * Implements equality by attribute names and values, and provides a simple + * string representation. + */ + + constructor(options = {}) { + super() + Object.assign(this, options) + } +}) + +// unset string tag to mimic plain object +Namespace.prototype[Symbol.toStringTag] = undefined + + +const _ActionsContainer = _camelcase_alias(_callable(class _ActionsContainer { + + constructor() { + let [ + description, + prefix_chars, + argument_default, + conflict_handler + ] = _parse_opts(arguments, { + description: no_default, + prefix_chars: no_default, + argument_default: no_default, + conflict_handler: no_default + }) + + this.description = description + this.argument_default = argument_default + this.prefix_chars = prefix_chars + this.conflict_handler = conflict_handler + + // set up registries + this._registries = {} + + // register actions + this.register('action', undefined, _StoreAction) + this.register('action', 'store', _StoreAction) + this.register('action', 'store_const', _StoreConstAction) + this.register('action', 'store_true', _StoreTrueAction) + this.register('action', 'store_false', _StoreFalseAction) + this.register('action', 'append', _AppendAction) + this.register('action', 'append_const', _AppendConstAction) + this.register('action', 'count', _CountAction) + this.register('action', 'help', _HelpAction) + this.register('action', 'version', _VersionAction) + this.register('action', 'parsers', _SubParsersAction) + this.register('action', 'extend', _ExtendAction) + // LEGACY (v1 compatibility): camelcase variants + ;[ 'storeConst', 'storeTrue', 'storeFalse', 'appendConst' ].forEach(old_name => { + let new_name = _to_new_name(old_name) + this.register('action', old_name, util.deprecate(this._registry_get('action', new_name), + sub('{action: "%s"} is renamed to {action: "%s"}', old_name, new_name))) + }) + // end + + // raise an exception if the conflict handler is invalid + this._get_handler() + + // action storage + this._actions = [] + this._option_string_actions = {} + + // groups + this._action_groups = [] + this._mutually_exclusive_groups = [] + + // defaults storage + this._defaults = {} + + // determines whether an "option" looks like a negative number + this._negative_number_matcher = /^-\d+$|^-\d*\.\d+$/ + + // whether or not there are any optionals that look like negative + // numbers -- uses a list so it can be shared and edited + this._has_negative_number_optionals = [] + } + + // ==================== + // Registration methods + // ==================== + register(registry_name, value, object) { + let registry = setdefault(this._registries, registry_name, {}) + registry[value] = object + } + + _registry_get(registry_name, value, default_value = undefined) { + return getattr(this._registries[registry_name], value, default_value) + } + + // ================================== + // Namespace default accessor methods + // ================================== + set_defaults(kwargs) { + Object.assign(this._defaults, kwargs) + + // if these defaults match any existing arguments, replace + // the previous default on the object with the new one + for (let action of this._actions) { + if (action.dest in kwargs) { + action.default = kwargs[action.dest] + } + } + } + + get_default(dest) { + for (let action of this._actions) { + if (action.dest === dest && action.default !== undefined) { + return action.default + } + } + return this._defaults[dest] + } + + + // ======================= + // Adding argument actions + // ======================= + add_argument() { + /* + * add_argument(dest, ..., name=value, ...) + * add_argument(option_string, option_string, ..., name=value, ...) + */ + let [ + args, + kwargs + ] = _parse_opts(arguments, { + '*args': no_default, + '**kwargs': no_default + }) + // LEGACY (v1 compatibility), old-style add_argument([ args ], { options }) + if (args.length === 1 && Array.isArray(args[0])) { + args = args[0] + deprecate('argument-array', + sub('use add_argument(%(args)s, {...}) instead of add_argument([ %(args)s ], { ... })', { + args: args.map(repr).join(', ') + })) + } + // end + + // if no positional args are supplied or only one is supplied and + // it doesn't look like an option string, parse a positional + // argument + let chars = this.prefix_chars + if (!args.length || args.length === 1 && !chars.includes(args[0][0])) { + if (args.length && 'dest' in kwargs) { + throw new TypeError('dest supplied twice for positional argument') + } + kwargs = this._get_positional_kwargs(...args, kwargs) + + // otherwise, we're adding an optional argument + } else { + kwargs = this._get_optional_kwargs(...args, kwargs) + } + + // if no default was supplied, use the parser-level default + if (!('default' in kwargs)) { + let dest = kwargs.dest + if (dest in this._defaults) { + kwargs.default = this._defaults[dest] + } else if (this.argument_default !== undefined) { + kwargs.default = this.argument_default + } + } + + // create the action object, and add it to the parser + let action_class = this._pop_action_class(kwargs) + if (typeof action_class !== 'function') { + throw new TypeError(sub('unknown action "%s"', action_class)) + } + // eslint-disable-next-line new-cap + let action = new action_class(kwargs) + + // raise an error if the action type is not callable + let type_func = this._registry_get('type', action.type, action.type) + if (typeof type_func !== 'function') { + throw new TypeError(sub('%r is not callable', type_func)) + } + + if (type_func === FileType) { + throw new TypeError(sub('%r is a FileType class object, instance of it' + + ' must be passed', type_func)) + } + + // raise an error if the metavar does not match the type + if ('_get_formatter' in this) { + try { + this._get_formatter()._format_args(action, undefined) + } catch (err) { + // check for 'invalid nargs value' is an artifact of TypeError and ValueError in js being the same + if (err instanceof TypeError && err.message !== 'invalid nargs value') { + throw new TypeError('length of metavar tuple does not match nargs') + } else { + throw err + } + } + } + + return this._add_action(action) + } + + add_argument_group() { + let group = _ArgumentGroup(this, ...arguments) + this._action_groups.push(group) + return group + } + + add_mutually_exclusive_group() { + // eslint-disable-next-line no-use-before-define + let group = _MutuallyExclusiveGroup(this, ...arguments) + this._mutually_exclusive_groups.push(group) + return group + } + + _add_action(action) { + // resolve any conflicts + this._check_conflict(action) + + // add to actions list + this._actions.push(action) + action.container = this + + // index the action by any option strings it has + for (let option_string of action.option_strings) { + this._option_string_actions[option_string] = action + } + + // set the flag if any option strings look like negative numbers + for (let option_string of action.option_strings) { + if (this._negative_number_matcher.test(option_string)) { + if (!this._has_negative_number_optionals.length) { + this._has_negative_number_optionals.push(true) + } + } + } + + // return the created action + return action + } + + _remove_action(action) { + _array_remove(this._actions, action) + } + + _add_container_actions(container) { + // collect groups by titles + let title_group_map = {} + for (let group of this._action_groups) { + if (group.title in title_group_map) { + let msg = 'cannot merge actions - two groups are named %r' + throw new TypeError(sub(msg, group.title)) + } + title_group_map[group.title] = group + } + + // map each action to its group + let group_map = new Map() + for (let group of container._action_groups) { + + // if a group with the title exists, use that, otherwise + // create a new group matching the container's group + if (!(group.title in title_group_map)) { + title_group_map[group.title] = this.add_argument_group({ + title: group.title, + description: group.description, + conflict_handler: group.conflict_handler + }) + } + + // map the actions to their new group + for (let action of group._group_actions) { + group_map.set(action, title_group_map[group.title]) + } + } + + // add container's mutually exclusive groups + // NOTE: if add_mutually_exclusive_group ever gains title= and + // description= then this code will need to be expanded as above + for (let group of container._mutually_exclusive_groups) { + let mutex_group = this.add_mutually_exclusive_group({ + required: group.required + }) + + // map the actions to their new mutex group + for (let action of group._group_actions) { + group_map.set(action, mutex_group) + } + } + + // add all actions to this container or their group + for (let action of container._actions) { + group_map.get(action)._add_action(action) + } + } + + _get_positional_kwargs() { + let [ + dest, + kwargs + ] = _parse_opts(arguments, { + dest: no_default, + '**kwargs': no_default + }) + + // make sure required is not specified + if ('required' in kwargs) { + let msg = "'required' is an invalid argument for positionals" + throw new TypeError(msg) + } + + // mark positional arguments as required if at least one is + // always required + if (![OPTIONAL, ZERO_OR_MORE].includes(kwargs.nargs)) { + kwargs.required = true + } + if (kwargs.nargs === ZERO_OR_MORE && !('default' in kwargs)) { + kwargs.required = true + } + + // return the keyword arguments with no option strings + return Object.assign(kwargs, { dest, option_strings: [] }) + } + + _get_optional_kwargs() { + let [ + args, + kwargs + ] = _parse_opts(arguments, { + '*args': no_default, + '**kwargs': no_default + }) + + // determine short and long option strings + let option_strings = [] + let long_option_strings = [] + let option_string + for (option_string of args) { + // error on strings that don't start with an appropriate prefix + if (!this.prefix_chars.includes(option_string[0])) { + let args = {option: option_string, + prefix_chars: this.prefix_chars} + let msg = 'invalid option string %(option)r: ' + + 'must start with a character %(prefix_chars)r' + throw new TypeError(sub(msg, args)) + } + + // strings starting with two prefix characters are long options + option_strings.push(option_string) + if (option_string.length > 1 && this.prefix_chars.includes(option_string[1])) { + long_option_strings.push(option_string) + } + } + + // infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x' + let dest = kwargs.dest + delete kwargs.dest + if (dest === undefined) { + let dest_option_string + if (long_option_strings.length) { + dest_option_string = long_option_strings[0] + } else { + dest_option_string = option_strings[0] + } + dest = _string_lstrip(dest_option_string, this.prefix_chars) + if (!dest) { + let msg = 'dest= is required for options like %r' + throw new TypeError(sub(msg, option_string)) + } + dest = dest.replace(/-/g, '_') + } + + // return the updated keyword arguments + return Object.assign(kwargs, { dest, option_strings }) + } + + _pop_action_class(kwargs, default_value = undefined) { + let action = getattr(kwargs, 'action', default_value) + delete kwargs.action + return this._registry_get('action', action, action) + } + + _get_handler() { + // determine function from conflict handler string + let handler_func_name = sub('_handle_conflict_%s', this.conflict_handler) + if (typeof this[handler_func_name] === 'function') { + return this[handler_func_name] + } else { + let msg = 'invalid conflict_resolution value: %r' + throw new TypeError(sub(msg, this.conflict_handler)) + } + } + + _check_conflict(action) { + + // find all options that conflict with this option + let confl_optionals = [] + for (let option_string of action.option_strings) { + if (hasattr(this._option_string_actions, option_string)) { + let confl_optional = this._option_string_actions[option_string] + confl_optionals.push([ option_string, confl_optional ]) + } + } + + // resolve any conflicts + if (confl_optionals.length) { + let conflict_handler = this._get_handler() + conflict_handler.call(this, action, confl_optionals) + } + } + + _handle_conflict_error(action, conflicting_actions) { + let message = conflicting_actions.length === 1 ? + 'conflicting option string: %s' : + 'conflicting option strings: %s' + let conflict_string = conflicting_actions.map(([ option_string/*, action*/ ]) => option_string).join(', ') + throw new ArgumentError(action, sub(message, conflict_string)) + } + + _handle_conflict_resolve(action, conflicting_actions) { + + // remove all conflicting options + for (let [ option_string, action ] of conflicting_actions) { + + // remove the conflicting option + _array_remove(action.option_strings, option_string) + delete this._option_string_actions[option_string] + + // if the option now has no option string, remove it from the + // container holding it + if (!action.option_strings.length) { + action.container._remove_action(action) + } + } + } +})) + + +const _ArgumentGroup = _callable(class _ArgumentGroup extends _ActionsContainer { + + constructor() { + let [ + container, + title, + description, + kwargs + ] = _parse_opts(arguments, { + container: no_default, + title: undefined, + description: undefined, + '**kwargs': no_default + }) + + // add any missing keyword arguments by checking the container + setdefault(kwargs, 'conflict_handler', container.conflict_handler) + setdefault(kwargs, 'prefix_chars', container.prefix_chars) + setdefault(kwargs, 'argument_default', container.argument_default) + super(Object.assign({ description }, kwargs)) + + // group attributes + this.title = title + this._group_actions = [] + + // share most attributes with the container + this._registries = container._registries + this._actions = container._actions + this._option_string_actions = container._option_string_actions + this._defaults = container._defaults + this._has_negative_number_optionals = + container._has_negative_number_optionals + this._mutually_exclusive_groups = container._mutually_exclusive_groups + } + + _add_action(action) { + action = super._add_action(action) + this._group_actions.push(action) + return action + } + + _remove_action(action) { + super._remove_action(action) + _array_remove(this._group_actions, action) + } +}) + + +const _MutuallyExclusiveGroup = _callable(class _MutuallyExclusiveGroup extends _ArgumentGroup { + + constructor() { + let [ + container, + required + ] = _parse_opts(arguments, { + container: no_default, + required: false + }) + + super(container) + this.required = required + this._container = container + } + + _add_action(action) { + if (action.required) { + let msg = 'mutually exclusive arguments must be optional' + throw new TypeError(msg) + } + action = this._container._add_action(action) + this._group_actions.push(action) + return action + } + + _remove_action(action) { + this._container._remove_action(action) + _array_remove(this._group_actions, action) + } +}) + + +const ArgumentParser = _camelcase_alias(_callable(class ArgumentParser extends _AttributeHolder(_ActionsContainer) { + /* + * Object for parsing command line strings into Python objects. + * + * Keyword Arguments: + * - prog -- The name of the program (default: sys.argv[0]) + * - usage -- A usage message (default: auto-generated from arguments) + * - description -- A description of what the program does + * - epilog -- Text following the argument descriptions + * - parents -- Parsers whose arguments should be copied into this one + * - formatter_class -- HelpFormatter class for printing help messages + * - prefix_chars -- Characters that prefix optional arguments + * - fromfile_prefix_chars -- Characters that prefix files containing + * additional arguments + * - argument_default -- The default value for all arguments + * - conflict_handler -- String indicating how to handle conflicts + * - add_help -- Add a -h/-help option + * - allow_abbrev -- Allow long options to be abbreviated unambiguously + * - exit_on_error -- Determines whether or not ArgumentParser exits with + * error info when an error occurs + */ + + constructor() { + let [ + prog, + usage, + description, + epilog, + parents, + formatter_class, + prefix_chars, + fromfile_prefix_chars, + argument_default, + conflict_handler, + add_help, + allow_abbrev, + exit_on_error, + debug, // LEGACY (v1 compatibility), debug mode + version // LEGACY (v1 compatibility), version + ] = _parse_opts(arguments, { + prog: undefined, + usage: undefined, + description: undefined, + epilog: undefined, + parents: [], + formatter_class: HelpFormatter, + prefix_chars: '-', + fromfile_prefix_chars: undefined, + argument_default: undefined, + conflict_handler: 'error', + add_help: true, + allow_abbrev: true, + exit_on_error: true, + debug: undefined, // LEGACY (v1 compatibility), debug mode + version: undefined // LEGACY (v1 compatibility), version + }) + + // LEGACY (v1 compatibility) + if (debug !== undefined) { + deprecate('debug', + 'The "debug" argument to ArgumentParser is deprecated. Please ' + + 'override ArgumentParser.exit function instead.' + ) + } + + if (version !== undefined) { + deprecate('version', + 'The "version" argument to ArgumentParser is deprecated. Please use ' + + "add_argument(..., { action: 'version', version: 'N', ... }) instead." + ) + } + // end + + super({ + description, + prefix_chars, + argument_default, + conflict_handler + }) + + // default setting for prog + if (prog === undefined) { + prog = path.basename(get_argv()[0] || '') + } + + this.prog = prog + this.usage = usage + this.epilog = epilog + this.formatter_class = formatter_class + this.fromfile_prefix_chars = fromfile_prefix_chars + this.add_help = add_help + this.allow_abbrev = allow_abbrev + this.exit_on_error = exit_on_error + // LEGACY (v1 compatibility), debug mode + this.debug = debug + // end + + this._positionals = this.add_argument_group('positional arguments') + this._optionals = this.add_argument_group('optional arguments') + this._subparsers = undefined + + // register types + function identity(string) { + return string + } + this.register('type', undefined, identity) + this.register('type', null, identity) + this.register('type', 'auto', identity) + this.register('type', 'int', function (x) { + let result = Number(x) + if (!Number.isInteger(result)) { + throw new TypeError(sub('could not convert string to int: %r', x)) + } + return result + }) + this.register('type', 'float', function (x) { + let result = Number(x) + if (isNaN(result)) { + throw new TypeError(sub('could not convert string to float: %r', x)) + } + return result + }) + this.register('type', 'str', String) + // LEGACY (v1 compatibility): custom types + this.register('type', 'string', + util.deprecate(String, 'use {type:"str"} or {type:String} instead of {type:"string"}')) + // end + + // add help argument if necessary + // (using explicit default to override global argument_default) + let default_prefix = prefix_chars.includes('-') ? '-' : prefix_chars[0] + if (this.add_help) { + this.add_argument( + default_prefix + 'h', + default_prefix.repeat(2) + 'help', + { + action: 'help', + default: SUPPRESS, + help: 'show this help message and exit' + } + ) + } + // LEGACY (v1 compatibility), version + if (version) { + this.add_argument( + default_prefix + 'v', + default_prefix.repeat(2) + 'version', + { + action: 'version', + default: SUPPRESS, + version: this.version, + help: "show program's version number and exit" + } + ) + } + // end + + // add parent arguments and defaults + for (let parent of parents) { + this._add_container_actions(parent) + Object.assign(this._defaults, parent._defaults) + } + } + + // ======================= + // Pretty __repr__ methods + // ======================= + _get_kwargs() { + let names = [ + 'prog', + 'usage', + 'description', + 'formatter_class', + 'conflict_handler', + 'add_help' + ] + return names.map(name => [ name, getattr(this, name) ]) + } + + // ================================== + // Optional/Positional adding methods + // ================================== + add_subparsers() { + let [ + kwargs + ] = _parse_opts(arguments, { + '**kwargs': no_default + }) + + if (this._subparsers !== undefined) { + this.error('cannot have multiple subparser arguments') + } + + // add the parser class to the arguments if it's not present + setdefault(kwargs, 'parser_class', this.constructor) + + if ('title' in kwargs || 'description' in kwargs) { + let title = getattr(kwargs, 'title', 'subcommands') + let description = getattr(kwargs, 'description', undefined) + delete kwargs.title + delete kwargs.description + this._subparsers = this.add_argument_group(title, description) + } else { + this._subparsers = this._positionals + } + + // prog defaults to the usage message of this parser, skipping + // optional arguments and with no "usage:" prefix + if (kwargs.prog === undefined) { + let formatter = this._get_formatter() + let positionals = this._get_positional_actions() + let groups = this._mutually_exclusive_groups + formatter.add_usage(this.usage, positionals, groups, '') + kwargs.prog = formatter.format_help().trim() + } + + // create the parsers action and add it to the positionals list + let parsers_class = this._pop_action_class(kwargs, 'parsers') + // eslint-disable-next-line new-cap + let action = new parsers_class(Object.assign({ option_strings: [] }, kwargs)) + this._subparsers._add_action(action) + + // return the created parsers action + return action + } + + _add_action(action) { + if (action.option_strings.length) { + this._optionals._add_action(action) + } else { + this._positionals._add_action(action) + } + return action + } + + _get_optional_actions() { + return this._actions.filter(action => action.option_strings.length) + } + + _get_positional_actions() { + return this._actions.filter(action => !action.option_strings.length) + } + + // ===================================== + // Command line argument parsing methods + // ===================================== + parse_args(args = undefined, namespace = undefined) { + let argv + [ args, argv ] = this.parse_known_args(args, namespace) + if (argv && argv.length > 0) { + let msg = 'unrecognized arguments: %s' + this.error(sub(msg, argv.join(' '))) + } + return args + } + + parse_known_args(args = undefined, namespace = undefined) { + if (args === undefined) { + args = get_argv().slice(1) + } + + // default Namespace built from parser defaults + if (namespace === undefined) { + namespace = new Namespace() + } + + // add any action defaults that aren't present + for (let action of this._actions) { + if (action.dest !== SUPPRESS) { + if (!hasattr(namespace, action.dest)) { + if (action.default !== SUPPRESS) { + setattr(namespace, action.dest, action.default) + } + } + } + } + + // add any parser defaults that aren't present + for (let dest of Object.keys(this._defaults)) { + if (!hasattr(namespace, dest)) { + setattr(namespace, dest, this._defaults[dest]) + } + } + + // parse the arguments and exit if there are any errors + if (this.exit_on_error) { + try { + [ namespace, args ] = this._parse_known_args(args, namespace) + } catch (err) { + if (err instanceof ArgumentError) { + this.error(err.message) + } else { + throw err + } + } + } else { + [ namespace, args ] = this._parse_known_args(args, namespace) + } + + if (hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) { + args = args.concat(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) + delattr(namespace, _UNRECOGNIZED_ARGS_ATTR) + } + + return [ namespace, args ] + } + + _parse_known_args(arg_strings, namespace) { + // replace arg strings that are file references + if (this.fromfile_prefix_chars !== undefined) { + arg_strings = this._read_args_from_files(arg_strings) + } + + // map all mutually exclusive arguments to the other arguments + // they can't occur with + let action_conflicts = new Map() + for (let mutex_group of this._mutually_exclusive_groups) { + let group_actions = mutex_group._group_actions + for (let [ i, mutex_action ] of Object.entries(mutex_group._group_actions)) { + let conflicts = action_conflicts.get(mutex_action) || [] + conflicts = conflicts.concat(group_actions.slice(0, +i)) + conflicts = conflicts.concat(group_actions.slice(+i + 1)) + action_conflicts.set(mutex_action, conflicts) + } + } + + // find all option indices, and determine the arg_string_pattern + // which has an 'O' if there is an option at an index, + // an 'A' if there is an argument, or a '-' if there is a '--' + let option_string_indices = {} + let arg_string_pattern_parts = [] + let arg_strings_iter = Object.entries(arg_strings)[Symbol.iterator]() + for (let [ i, arg_string ] of arg_strings_iter) { + + // all args after -- are non-options + if (arg_string === '--') { + arg_string_pattern_parts.push('-') + for ([ i, arg_string ] of arg_strings_iter) { + arg_string_pattern_parts.push('A') + } + + // otherwise, add the arg to the arg strings + // and note the index if it was an option + } else { + let option_tuple = this._parse_optional(arg_string) + let pattern + if (option_tuple === undefined) { + pattern = 'A' + } else { + option_string_indices[i] = option_tuple + pattern = 'O' + } + arg_string_pattern_parts.push(pattern) + } + } + + // join the pieces together to form the pattern + let arg_strings_pattern = arg_string_pattern_parts.join('') + + // converts arg strings to the appropriate and then takes the action + let seen_actions = new Set() + let seen_non_default_actions = new Set() + let extras + + let take_action = (action, argument_strings, option_string = undefined) => { + seen_actions.add(action) + let argument_values = this._get_values(action, argument_strings) + + // error if this argument is not allowed with other previously + // seen arguments, assuming that actions that use the default + // value don't really count as "present" + if (argument_values !== action.default) { + seen_non_default_actions.add(action) + for (let conflict_action of action_conflicts.get(action) || []) { + if (seen_non_default_actions.has(conflict_action)) { + let msg = 'not allowed with argument %s' + let action_name = _get_action_name(conflict_action) + throw new ArgumentError(action, sub(msg, action_name)) + } + } + } + + // take the action if we didn't receive a SUPPRESS value + // (e.g. from a default) + if (argument_values !== SUPPRESS) { + action(this, namespace, argument_values, option_string) + } + } + + // function to convert arg_strings into an optional action + let consume_optional = start_index => { + + // get the optional identified at this index + let option_tuple = option_string_indices[start_index] + let [ action, option_string, explicit_arg ] = option_tuple + + // identify additional optionals in the same arg string + // (e.g. -xyz is the same as -x -y -z if no args are required) + let action_tuples = [] + let stop + for (;;) { + + // if we found no optional action, skip it + if (action === undefined) { + extras.push(arg_strings[start_index]) + return start_index + 1 + } + + // if there is an explicit argument, try to match the + // optional's string arguments to only this + if (explicit_arg !== undefined) { + let arg_count = this._match_argument(action, 'A') + + // if the action is a single-dash option and takes no + // arguments, try to parse more single-dash options out + // of the tail of the option string + let chars = this.prefix_chars + if (arg_count === 0 && !chars.includes(option_string[1])) { + action_tuples.push([ action, [], option_string ]) + let char = option_string[0] + option_string = char + explicit_arg[0] + let new_explicit_arg = explicit_arg.slice(1) || undefined + let optionals_map = this._option_string_actions + if (hasattr(optionals_map, option_string)) { + action = optionals_map[option_string] + explicit_arg = new_explicit_arg + } else { + let msg = 'ignored explicit argument %r' + throw new ArgumentError(action, sub(msg, explicit_arg)) + } + + // if the action expect exactly one argument, we've + // successfully matched the option; exit the loop + } else if (arg_count === 1) { + stop = start_index + 1 + let args = [ explicit_arg ] + action_tuples.push([ action, args, option_string ]) + break + + // error if a double-dash option did not use the + // explicit argument + } else { + let msg = 'ignored explicit argument %r' + throw new ArgumentError(action, sub(msg, explicit_arg)) + } + + // if there is no explicit argument, try to match the + // optional's string arguments with the following strings + // if successful, exit the loop + } else { + let start = start_index + 1 + let selected_patterns = arg_strings_pattern.slice(start) + let arg_count = this._match_argument(action, selected_patterns) + stop = start + arg_count + let args = arg_strings.slice(start, stop) + action_tuples.push([ action, args, option_string ]) + break + } + } + + // add the Optional to the list and return the index at which + // the Optional's string args stopped + assert(action_tuples.length) + for (let [ action, args, option_string ] of action_tuples) { + take_action(action, args, option_string) + } + return stop + } + + // the list of Positionals left to be parsed; this is modified + // by consume_positionals() + let positionals = this._get_positional_actions() + + // function to convert arg_strings into positional actions + let consume_positionals = start_index => { + // match as many Positionals as possible + let selected_pattern = arg_strings_pattern.slice(start_index) + let arg_counts = this._match_arguments_partial(positionals, selected_pattern) + + // slice off the appropriate arg strings for each Positional + // and add the Positional and its args to the list + for (let i = 0; i < positionals.length && i < arg_counts.length; i++) { + let action = positionals[i] + let arg_count = arg_counts[i] + let args = arg_strings.slice(start_index, start_index + arg_count) + start_index += arg_count + take_action(action, args) + } + + // slice off the Positionals that we just parsed and return the + // index at which the Positionals' string args stopped + positionals = positionals.slice(arg_counts.length) + return start_index + } + + // consume Positionals and Optionals alternately, until we have + // passed the last option string + extras = [] + let start_index = 0 + let max_option_string_index = Math.max(-1, ...Object.keys(option_string_indices).map(Number)) + while (start_index <= max_option_string_index) { + + // consume any Positionals preceding the next option + let next_option_string_index = Math.min( + // eslint-disable-next-line no-loop-func + ...Object.keys(option_string_indices).map(Number).filter(index => index >= start_index) + ) + if (start_index !== next_option_string_index) { + let positionals_end_index = consume_positionals(start_index) + + // only try to parse the next optional if we didn't consume + // the option string during the positionals parsing + if (positionals_end_index > start_index) { + start_index = positionals_end_index + continue + } else { + start_index = positionals_end_index + } + } + + // if we consumed all the positionals we could and we're not + // at the index of an option string, there were extra arguments + if (!(start_index in option_string_indices)) { + let strings = arg_strings.slice(start_index, next_option_string_index) + extras = extras.concat(strings) + start_index = next_option_string_index + } + + // consume the next optional and any arguments for it + start_index = consume_optional(start_index) + } + + // consume any positionals following the last Optional + let stop_index = consume_positionals(start_index) + + // if we didn't consume all the argument strings, there were extras + extras = extras.concat(arg_strings.slice(stop_index)) + + // make sure all required actions were present and also convert + // action defaults which were not given as arguments + let required_actions = [] + for (let action of this._actions) { + if (!seen_actions.has(action)) { + if (action.required) { + required_actions.push(_get_action_name(action)) + } else { + // Convert action default now instead of doing it before + // parsing arguments to avoid calling convert functions + // twice (which may fail) if the argument was given, but + // only if it was defined already in the namespace + if (action.default !== undefined && + typeof action.default === 'string' && + hasattr(namespace, action.dest) && + action.default === getattr(namespace, action.dest)) { + setattr(namespace, action.dest, + this._get_value(action, action.default)) + } + } + } + } + + if (required_actions.length) { + this.error(sub('the following arguments are required: %s', + required_actions.join(', '))) + } + + // make sure all required groups had one option present + for (let group of this._mutually_exclusive_groups) { + if (group.required) { + let no_actions_used = true + for (let action of group._group_actions) { + if (seen_non_default_actions.has(action)) { + no_actions_used = false + break + } + } + + // if no actions were used, report the error + if (no_actions_used) { + let names = group._group_actions + .filter(action => action.help !== SUPPRESS) + .map(action => _get_action_name(action)) + let msg = 'one of the arguments %s is required' + this.error(sub(msg, names.join(' '))) + } + } + } + + // return the updated namespace and the extra arguments + return [ namespace, extras ] + } + + _read_args_from_files(arg_strings) { + // expand arguments referencing files + let new_arg_strings = [] + for (let arg_string of arg_strings) { + + // for regular arguments, just add them back into the list + if (!arg_string || !this.fromfile_prefix_chars.includes(arg_string[0])) { + new_arg_strings.push(arg_string) + + // replace arguments referencing files with the file content + } else { + try { + let args_file = fs.readFileSync(arg_string.slice(1), 'utf8') + let arg_strings = [] + for (let arg_line of splitlines(args_file)) { + for (let arg of this.convert_arg_line_to_args(arg_line)) { + arg_strings.push(arg) + } + } + arg_strings = this._read_args_from_files(arg_strings) + new_arg_strings = new_arg_strings.concat(arg_strings) + } catch (err) { + this.error(err.message) + } + } + } + + // return the modified argument list + return new_arg_strings + } + + convert_arg_line_to_args(arg_line) { + return [arg_line] + } + + _match_argument(action, arg_strings_pattern) { + // match the pattern for this action to the arg strings + let nargs_pattern = this._get_nargs_pattern(action) + let match = arg_strings_pattern.match(new RegExp('^' + nargs_pattern)) + + // raise an exception if we weren't able to find a match + if (match === null) { + let nargs_errors = { + undefined: 'expected one argument', + [OPTIONAL]: 'expected at most one argument', + [ONE_OR_MORE]: 'expected at least one argument' + } + let msg = nargs_errors[action.nargs] + if (msg === undefined) { + msg = sub(action.nargs === 1 ? 'expected %s argument' : 'expected %s arguments', action.nargs) + } + throw new ArgumentError(action, msg) + } + + // return the number of arguments matched + return match[1].length + } + + _match_arguments_partial(actions, arg_strings_pattern) { + // progressively shorten the actions list by slicing off the + // final actions until we find a match + let result = [] + for (let i of range(actions.length, 0, -1)) { + let actions_slice = actions.slice(0, i) + let pattern = actions_slice.map(action => this._get_nargs_pattern(action)).join('') + let match = arg_strings_pattern.match(new RegExp('^' + pattern)) + if (match !== null) { + result = result.concat(match.slice(1).map(string => string.length)) + break + } + } + + // return the list of arg string counts + return result + } + + _parse_optional(arg_string) { + // if it's an empty string, it was meant to be a positional + if (!arg_string) { + return undefined + } + + // if it doesn't start with a prefix, it was meant to be positional + if (!this.prefix_chars.includes(arg_string[0])) { + return undefined + } + + // if the option string is present in the parser, return the action + if (arg_string in this._option_string_actions) { + let action = this._option_string_actions[arg_string] + return [ action, arg_string, undefined ] + } + + // if it's just a single character, it was meant to be positional + if (arg_string.length === 1) { + return undefined + } + + // if the option string before the "=" is present, return the action + if (arg_string.includes('=')) { + let [ option_string, explicit_arg ] = _string_split(arg_string, '=', 1) + if (option_string in this._option_string_actions) { + let action = this._option_string_actions[option_string] + return [ action, option_string, explicit_arg ] + } + } + + // search through all possible prefixes of the option string + // and all actions in the parser for possible interpretations + let option_tuples = this._get_option_tuples(arg_string) + + // if multiple actions match, the option string was ambiguous + if (option_tuples.length > 1) { + let options = option_tuples.map(([ /*action*/, option_string/*, explicit_arg*/ ]) => option_string).join(', ') + let args = {option: arg_string, matches: options} + let msg = 'ambiguous option: %(option)s could match %(matches)s' + this.error(sub(msg, args)) + + // if exactly one action matched, this segmentation is good, + // so return the parsed action + } else if (option_tuples.length === 1) { + let [ option_tuple ] = option_tuples + return option_tuple + } + + // if it was not found as an option, but it looks like a negative + // number, it was meant to be positional + // unless there are negative-number-like options + if (this._negative_number_matcher.test(arg_string)) { + if (!this._has_negative_number_optionals.length) { + return undefined + } + } + + // if it contains a space, it was meant to be a positional + if (arg_string.includes(' ')) { + return undefined + } + + // it was meant to be an optional but there is no such option + // in this parser (though it might be a valid option in a subparser) + return [ undefined, arg_string, undefined ] + } + + _get_option_tuples(option_string) { + let result = [] + + // option strings starting with two prefix characters are only + // split at the '=' + let chars = this.prefix_chars + if (chars.includes(option_string[0]) && chars.includes(option_string[1])) { + if (this.allow_abbrev) { + let option_prefix, explicit_arg + if (option_string.includes('=')) { + [ option_prefix, explicit_arg ] = _string_split(option_string, '=', 1) + } else { + option_prefix = option_string + explicit_arg = undefined + } + for (let option_string of Object.keys(this._option_string_actions)) { + if (option_string.startsWith(option_prefix)) { + let action = this._option_string_actions[option_string] + let tup = [ action, option_string, explicit_arg ] + result.push(tup) + } + } + } + + // single character options can be concatenated with their arguments + // but multiple character options always have to have their argument + // separate + } else if (chars.includes(option_string[0]) && !chars.includes(option_string[1])) { + let option_prefix = option_string + let explicit_arg = undefined + let short_option_prefix = option_string.slice(0, 2) + let short_explicit_arg = option_string.slice(2) + + for (let option_string of Object.keys(this._option_string_actions)) { + if (option_string === short_option_prefix) { + let action = this._option_string_actions[option_string] + let tup = [ action, option_string, short_explicit_arg ] + result.push(tup) + } else if (option_string.startsWith(option_prefix)) { + let action = this._option_string_actions[option_string] + let tup = [ action, option_string, explicit_arg ] + result.push(tup) + } + } + + // shouldn't ever get here + } else { + this.error(sub('unexpected option string: %s', option_string)) + } + + // return the collected option tuples + return result + } + + _get_nargs_pattern(action) { + // in all examples below, we have to allow for '--' args + // which are represented as '-' in the pattern + let nargs = action.nargs + let nargs_pattern + + // the default (None) is assumed to be a single argument + if (nargs === undefined) { + nargs_pattern = '(-*A-*)' + + // allow zero or one arguments + } else if (nargs === OPTIONAL) { + nargs_pattern = '(-*A?-*)' + + // allow zero or more arguments + } else if (nargs === ZERO_OR_MORE) { + nargs_pattern = '(-*[A-]*)' + + // allow one or more arguments + } else if (nargs === ONE_OR_MORE) { + nargs_pattern = '(-*A[A-]*)' + + // allow any number of options or arguments + } else if (nargs === REMAINDER) { + nargs_pattern = '([-AO]*)' + + // allow one argument followed by any number of options or arguments + } else if (nargs === PARSER) { + nargs_pattern = '(-*A[-AO]*)' + + // suppress action, like nargs=0 + } else if (nargs === SUPPRESS) { + nargs_pattern = '(-*-*)' + + // all others should be integers + } else { + nargs_pattern = sub('(-*%s-*)', 'A'.repeat(nargs).split('').join('-*')) + } + + // if this is an optional action, -- is not allowed + if (action.option_strings.length) { + nargs_pattern = nargs_pattern.replace(/-\*/g, '') + nargs_pattern = nargs_pattern.replace(/-/g, '') + } + + // return the pattern + return nargs_pattern + } + + // ======================== + // Alt command line argument parsing, allowing free intermix + // ======================== + + parse_intermixed_args(args = undefined, namespace = undefined) { + let argv + [ args, argv ] = this.parse_known_intermixed_args(args, namespace) + if (argv.length) { + let msg = 'unrecognized arguments: %s' + this.error(sub(msg, argv.join(' '))) + } + return args + } + + parse_known_intermixed_args(args = undefined, namespace = undefined) { + // returns a namespace and list of extras + // + // positional can be freely intermixed with optionals. optionals are + // first parsed with all positional arguments deactivated. The 'extras' + // are then parsed. If the parser definition is incompatible with the + // intermixed assumptions (e.g. use of REMAINDER, subparsers) a + // TypeError is raised. + // + // positionals are 'deactivated' by setting nargs and default to + // SUPPRESS. This blocks the addition of that positional to the + // namespace + + let extras + let positionals = this._get_positional_actions() + let a = positionals.filter(action => [ PARSER, REMAINDER ].includes(action.nargs)) + if (a.length) { + throw new TypeError(sub('parse_intermixed_args: positional arg' + + ' with nargs=%s', a[0].nargs)) + } + + for (let group of this._mutually_exclusive_groups) { + for (let action of group._group_actions) { + if (positionals.includes(action)) { + throw new TypeError('parse_intermixed_args: positional in' + + ' mutuallyExclusiveGroup') + } + } + } + + let save_usage + try { + save_usage = this.usage + let remaining_args + try { + if (this.usage === undefined) { + // capture the full usage for use in error messages + this.usage = this.format_usage().slice(7) + } + for (let action of positionals) { + // deactivate positionals + action.save_nargs = action.nargs + // action.nargs = 0 + action.nargs = SUPPRESS + action.save_default = action.default + action.default = SUPPRESS + } + [ namespace, remaining_args ] = this.parse_known_args(args, + namespace) + for (let action of positionals) { + // remove the empty positional values from namespace + let attr = getattr(namespace, action.dest) + if (Array.isArray(attr) && attr.length === 0) { + // eslint-disable-next-line no-console + console.warn(sub('Do not expect %s in %s', action.dest, namespace)) + delattr(namespace, action.dest) + } + } + } finally { + // restore nargs and usage before exiting + for (let action of positionals) { + action.nargs = action.save_nargs + action.default = action.save_default + } + } + let optionals = this._get_optional_actions() + try { + // parse positionals. optionals aren't normally required, but + // they could be, so make sure they aren't. + for (let action of optionals) { + action.save_required = action.required + action.required = false + } + for (let group of this._mutually_exclusive_groups) { + group.save_required = group.required + group.required = false + } + [ namespace, extras ] = this.parse_known_args(remaining_args, + namespace) + } finally { + // restore parser values before exiting + for (let action of optionals) { + action.required = action.save_required + } + for (let group of this._mutually_exclusive_groups) { + group.required = group.save_required + } + } + } finally { + this.usage = save_usage + } + return [ namespace, extras ] + } + + // ======================== + // Value conversion methods + // ======================== + _get_values(action, arg_strings) { + // for everything but PARSER, REMAINDER args, strip out first '--' + if (![PARSER, REMAINDER].includes(action.nargs)) { + try { + _array_remove(arg_strings, '--') + } catch (err) {} + } + + let value + // optional argument produces a default when not present + if (!arg_strings.length && action.nargs === OPTIONAL) { + if (action.option_strings.length) { + value = action.const + } else { + value = action.default + } + if (typeof value === 'string') { + value = this._get_value(action, value) + this._check_value(action, value) + } + + // when nargs='*' on a positional, if there were no command-line + // args, use the default if it is anything other than None + } else if (!arg_strings.length && action.nargs === ZERO_OR_MORE && + !action.option_strings.length) { + if (action.default !== undefined) { + value = action.default + } else { + value = arg_strings + } + this._check_value(action, value) + + // single argument or optional argument produces a single value + } else if (arg_strings.length === 1 && [undefined, OPTIONAL].includes(action.nargs)) { + let arg_string = arg_strings[0] + value = this._get_value(action, arg_string) + this._check_value(action, value) + + // REMAINDER arguments convert all values, checking none + } else if (action.nargs === REMAINDER) { + value = arg_strings.map(v => this._get_value(action, v)) + + // PARSER arguments convert all values, but check only the first + } else if (action.nargs === PARSER) { + value = arg_strings.map(v => this._get_value(action, v)) + this._check_value(action, value[0]) + + // SUPPRESS argument does not put anything in the namespace + } else if (action.nargs === SUPPRESS) { + value = SUPPRESS + + // all other types of nargs produce a list + } else { + value = arg_strings.map(v => this._get_value(action, v)) + for (let v of value) { + this._check_value(action, v) + } + } + + // return the converted value + return value + } + + _get_value(action, arg_string) { + let type_func = this._registry_get('type', action.type, action.type) + if (typeof type_func !== 'function') { + let msg = '%r is not callable' + throw new ArgumentError(action, sub(msg, type_func)) + } + + // convert the value to the appropriate type + let result + try { + try { + result = type_func(arg_string) + } catch (err) { + // Dear TC39, why would you ever consider making es6 classes not callable? + // We had one universal interface, [[Call]], which worked for anything + // (with familiar this-instanceof guard for classes). Now we have two. + if (err instanceof TypeError && + /Class constructor .* cannot be invoked without 'new'/.test(err.message)) { + // eslint-disable-next-line new-cap + result = new type_func(arg_string) + } else { + throw err + } + } + + } catch (err) { + // ArgumentTypeErrors indicate errors + if (err instanceof ArgumentTypeError) { + //let name = getattr(action.type, 'name', repr(action.type)) + let msg = err.message + throw new ArgumentError(action, msg) + + // TypeErrors or ValueErrors also indicate errors + } else if (err instanceof TypeError) { + let name = getattr(action.type, 'name', repr(action.type)) + let args = {type: name, value: arg_string} + let msg = 'invalid %(type)s value: %(value)r' + throw new ArgumentError(action, sub(msg, args)) + } else { + throw err + } + } + + // return the converted value + return result + } + + _check_value(action, value) { + // converted value must be one of the choices (if specified) + if (action.choices !== undefined && !_choices_to_array(action.choices).includes(value)) { + let args = {value, + choices: _choices_to_array(action.choices).map(repr).join(', ')} + let msg = 'invalid choice: %(value)r (choose from %(choices)s)' + throw new ArgumentError(action, sub(msg, args)) + } + } + + // ======================= + // Help-formatting methods + // ======================= + format_usage() { + let formatter = this._get_formatter() + formatter.add_usage(this.usage, this._actions, + this._mutually_exclusive_groups) + return formatter.format_help() + } + + format_help() { + let formatter = this._get_formatter() + + // usage + formatter.add_usage(this.usage, this._actions, + this._mutually_exclusive_groups) + + // description + formatter.add_text(this.description) + + // positionals, optionals and user-defined groups + for (let action_group of this._action_groups) { + formatter.start_section(action_group.title) + formatter.add_text(action_group.description) + formatter.add_arguments(action_group._group_actions) + formatter.end_section() + } + + // epilog + formatter.add_text(this.epilog) + + // determine help from format above + return formatter.format_help() + } + + _get_formatter() { + // eslint-disable-next-line new-cap + return new this.formatter_class({ prog: this.prog }) + } + + // ===================== + // Help-printing methods + // ===================== + print_usage(file = undefined) { + if (file === undefined) file = process.stdout + this._print_message(this.format_usage(), file) + } + + print_help(file = undefined) { + if (file === undefined) file = process.stdout + this._print_message(this.format_help(), file) + } + + _print_message(message, file = undefined) { + if (message) { + if (file === undefined) file = process.stderr + file.write(message) + } + } + + // =============== + // Exiting methods + // =============== + exit(status = 0, message = undefined) { + if (message) { + this._print_message(message, process.stderr) + } + process.exit(status) + } + + error(message) { + /* + * error(message: string) + * + * Prints a usage message incorporating the message to stderr and + * exits. + * + * If you override this in a subclass, it should not return -- it + * should either exit or raise an exception. + */ + + // LEGACY (v1 compatibility), debug mode + if (this.debug === true) throw new Error(message) + // end + this.print_usage(process.stderr) + let args = {prog: this.prog, message: message} + this.exit(2, sub('%(prog)s: error: %(message)s\n', args)) + } +})) + + +module.exports = { + ArgumentParser, + ArgumentError, + ArgumentTypeError, + BooleanOptionalAction, + FileType, + HelpFormatter, + ArgumentDefaultsHelpFormatter, + RawDescriptionHelpFormatter, + RawTextHelpFormatter, + MetavarTypeHelpFormatter, + Namespace, + Action, + ONE_OR_MORE, + OPTIONAL, + PARSER, + REMAINDER, + SUPPRESS, + ZERO_OR_MORE +} + +// LEGACY (v1 compatibility), Const alias +Object.defineProperty(module.exports, 'Const', { + get() { + let result = {} + Object.entries({ ONE_OR_MORE, OPTIONAL, PARSER, REMAINDER, SUPPRESS, ZERO_OR_MORE }).forEach(([ n, v ]) => { + Object.defineProperty(result, n, { + get() { + deprecate(n, sub('use argparse.%s instead of argparse.Const.%s', n, n)) + return v + } + }) + }) + Object.entries({ _UNRECOGNIZED_ARGS_ATTR }).forEach(([ n, v ]) => { + Object.defineProperty(result, n, { + get() { + deprecate(n, sub('argparse.Const.%s is an internal symbol and will no longer be available', n)) + return v + } + }) + }) + return result + }, + enumerable: false +}) +// end diff --git a/node_modules/@11ty/eleventy/node_modules/argparse/lib/sub.js b/node_modules/@11ty/eleventy/node_modules/argparse/lib/sub.js new file mode 100644 index 0000000..e3eb321 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/argparse/lib/sub.js @@ -0,0 +1,67 @@ +// Limited implementation of python % string operator, supports only %s and %r for now +// (other formats are not used here, but may appear in custom templates) + +'use strict' + +const { inspect } = require('util') + + +module.exports = function sub(pattern, ...values) { + let regex = /%(?:(%)|(-)?(\*)?(?:\((\w+)\))?([A-Za-z]))/g + + let result = pattern.replace(regex, function (_, is_literal, is_left_align, is_padded, name, format) { + if (is_literal) return '%' + + let padded_count = 0 + if (is_padded) { + if (values.length === 0) throw new TypeError('not enough arguments for format string') + padded_count = values.shift() + if (!Number.isInteger(padded_count)) throw new TypeError('* wants int') + } + + let str + if (name !== undefined) { + let dict = values[0] + if (typeof dict !== 'object' || dict === null) throw new TypeError('format requires a mapping') + if (!(name in dict)) throw new TypeError(`no such key: '${name}'`) + str = dict[name] + } else { + if (values.length === 0) throw new TypeError('not enough arguments for format string') + str = values.shift() + } + + switch (format) { + case 's': + str = String(str) + break + case 'r': + str = inspect(str) + break + case 'd': + case 'i': + if (typeof str !== 'number') { + throw new TypeError(`%${format} format: a number is required, not ${typeof str}`) + } + str = String(str.toFixed(0)) + break + default: + throw new TypeError(`unsupported format character '${format}'`) + } + + if (padded_count > 0) { + return is_left_align ? str.padEnd(padded_count) : str.padStart(padded_count) + } else { + return str + } + }) + + if (values.length) { + if (values.length === 1 && typeof values[0] === 'object' && values[0] !== null) { + // mapping + } else { + throw new TypeError('not all arguments converted during string formatting') + } + } + + return result +} diff --git a/node_modules/@11ty/eleventy/node_modules/argparse/lib/textwrap.js b/node_modules/@11ty/eleventy/node_modules/argparse/lib/textwrap.js new file mode 100644 index 0000000..23d51cd --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/argparse/lib/textwrap.js @@ -0,0 +1,440 @@ +// Partial port of python's argparse module, version 3.9.0 (only wrap and fill functions): +// https://github.com/python/cpython/blob/v3.9.0b4/Lib/textwrap.py + +'use strict' + +/* + * Text wrapping and filling. + */ + +// Copyright (C) 1999-2001 Gregory P. Ward. +// Copyright (C) 2002, 2003 Python Software Foundation. +// Copyright (C) 2020 argparse.js authors +// Originally written by Greg Ward + +// Hardcode the recognized whitespace characters to the US-ASCII +// whitespace characters. The main reason for doing this is that +// some Unicode spaces (like \u00a0) are non-breaking whitespaces. +// +// This less funky little regex just split on recognized spaces. E.g. +// "Hello there -- you goof-ball, use the -b option!" +// splits into +// Hello/ /there/ /--/ /you/ /goof-ball,/ /use/ /the/ /-b/ /option!/ +const wordsep_simple_re = /([\t\n\x0b\x0c\r ]+)/ + +class TextWrapper { + /* + * Object for wrapping/filling text. The public interface consists of + * the wrap() and fill() methods; the other methods are just there for + * subclasses to override in order to tweak the default behaviour. + * If you want to completely replace the main wrapping algorithm, + * you'll probably have to override _wrap_chunks(). + * + * Several instance attributes control various aspects of wrapping: + * width (default: 70) + * the maximum width of wrapped lines (unless break_long_words + * is false) + * initial_indent (default: "") + * string that will be prepended to the first line of wrapped + * output. Counts towards the line's width. + * subsequent_indent (default: "") + * string that will be prepended to all lines save the first + * of wrapped output; also counts towards each line's width. + * expand_tabs (default: true) + * Expand tabs in input text to spaces before further processing. + * Each tab will become 0 .. 'tabsize' spaces, depending on its position + * in its line. If false, each tab is treated as a single character. + * tabsize (default: 8) + * Expand tabs in input text to 0 .. 'tabsize' spaces, unless + * 'expand_tabs' is false. + * replace_whitespace (default: true) + * Replace all whitespace characters in the input text by spaces + * after tab expansion. Note that if expand_tabs is false and + * replace_whitespace is true, every tab will be converted to a + * single space! + * fix_sentence_endings (default: false) + * Ensure that sentence-ending punctuation is always followed + * by two spaces. Off by default because the algorithm is + * (unavoidably) imperfect. + * break_long_words (default: true) + * Break words longer than 'width'. If false, those words will not + * be broken, and some lines might be longer than 'width'. + * break_on_hyphens (default: true) + * Allow breaking hyphenated words. If true, wrapping will occur + * preferably on whitespaces and right after hyphens part of + * compound words. + * drop_whitespace (default: true) + * Drop leading and trailing whitespace from lines. + * max_lines (default: None) + * Truncate wrapped lines. + * placeholder (default: ' [...]') + * Append to the last line of truncated text. + */ + + constructor(options = {}) { + let { + width = 70, + initial_indent = '', + subsequent_indent = '', + expand_tabs = true, + replace_whitespace = true, + fix_sentence_endings = false, + break_long_words = true, + drop_whitespace = true, + break_on_hyphens = true, + tabsize = 8, + max_lines = undefined, + placeholder=' [...]' + } = options + + this.width = width + this.initial_indent = initial_indent + this.subsequent_indent = subsequent_indent + this.expand_tabs = expand_tabs + this.replace_whitespace = replace_whitespace + this.fix_sentence_endings = fix_sentence_endings + this.break_long_words = break_long_words + this.drop_whitespace = drop_whitespace + this.break_on_hyphens = break_on_hyphens + this.tabsize = tabsize + this.max_lines = max_lines + this.placeholder = placeholder + } + + + // -- Private methods ----------------------------------------------- + // (possibly useful for subclasses to override) + + _munge_whitespace(text) { + /* + * _munge_whitespace(text : string) -> string + * + * Munge whitespace in text: expand tabs and convert all other + * whitespace characters to spaces. Eg. " foo\\tbar\\n\\nbaz" + * becomes " foo bar baz". + */ + if (this.expand_tabs) { + text = text.replace(/\t/g, ' '.repeat(this.tabsize)) // not strictly correct in js + } + if (this.replace_whitespace) { + text = text.replace(/[\t\n\x0b\x0c\r]/g, ' ') + } + return text + } + + _split(text) { + /* + * _split(text : string) -> [string] + * + * Split the text to wrap into indivisible chunks. Chunks are + * not quite the same as words; see _wrap_chunks() for full + * details. As an example, the text + * Look, goof-ball -- use the -b option! + * breaks into the following chunks: + * 'Look,', ' ', 'goof-', 'ball', ' ', '--', ' ', + * 'use', ' ', 'the', ' ', '-b', ' ', 'option!' + * if break_on_hyphens is True, or in: + * 'Look,', ' ', 'goof-ball', ' ', '--', ' ', + * 'use', ' ', 'the', ' ', '-b', ' ', option!' + * otherwise. + */ + let chunks = text.split(wordsep_simple_re) + chunks = chunks.filter(Boolean) + return chunks + } + + _handle_long_word(reversed_chunks, cur_line, cur_len, width) { + /* + * _handle_long_word(chunks : [string], + * cur_line : [string], + * cur_len : int, width : int) + * + * Handle a chunk of text (most likely a word, not whitespace) that + * is too long to fit in any line. + */ + // Figure out when indent is larger than the specified width, and make + // sure at least one character is stripped off on every pass + let space_left + if (width < 1) { + space_left = 1 + } else { + space_left = width - cur_len + } + + // If we're allowed to break long words, then do so: put as much + // of the next chunk onto the current line as will fit. + if (this.break_long_words) { + cur_line.push(reversed_chunks[reversed_chunks.length - 1].slice(0, space_left)) + reversed_chunks[reversed_chunks.length - 1] = reversed_chunks[reversed_chunks.length - 1].slice(space_left) + + // Otherwise, we have to preserve the long word intact. Only add + // it to the current line if there's nothing already there -- + // that minimizes how much we violate the width constraint. + } else if (!cur_line) { + cur_line.push(...reversed_chunks.pop()) + } + + // If we're not allowed to break long words, and there's already + // text on the current line, do nothing. Next time through the + // main loop of _wrap_chunks(), we'll wind up here again, but + // cur_len will be zero, so the next line will be entirely + // devoted to the long word that we can't handle right now. + } + + _wrap_chunks(chunks) { + /* + * _wrap_chunks(chunks : [string]) -> [string] + * + * Wrap a sequence of text chunks and return a list of lines of + * length 'self.width' or less. (If 'break_long_words' is false, + * some lines may be longer than this.) Chunks correspond roughly + * to words and the whitespace between them: each chunk is + * indivisible (modulo 'break_long_words'), but a line break can + * come between any two chunks. Chunks should not have internal + * whitespace; ie. a chunk is either all whitespace or a "word". + * Whitespace chunks will be removed from the beginning and end of + * lines, but apart from that whitespace is preserved. + */ + let lines = [] + let indent + if (this.width <= 0) { + throw Error(`invalid width ${this.width} (must be > 0)`) + } + if (this.max_lines !== undefined) { + if (this.max_lines > 1) { + indent = this.subsequent_indent + } else { + indent = this.initial_indent + } + if (indent.length + this.placeholder.trimStart().length > this.width) { + throw Error('placeholder too large for max width') + } + } + + // Arrange in reverse order so items can be efficiently popped + // from a stack of chucks. + chunks = chunks.reverse() + + while (chunks.length > 0) { + + // Start the list of chunks that will make up the current line. + // cur_len is just the length of all the chunks in cur_line. + let cur_line = [] + let cur_len = 0 + + // Figure out which static string will prefix this line. + let indent + if (lines) { + indent = this.subsequent_indent + } else { + indent = this.initial_indent + } + + // Maximum width for this line. + let width = this.width - indent.length + + // First chunk on line is whitespace -- drop it, unless this + // is the very beginning of the text (ie. no lines started yet). + if (this.drop_whitespace && chunks[chunks.length - 1].trim() === '' && lines.length > 0) { + chunks.pop() + } + + while (chunks.length > 0) { + let l = chunks[chunks.length - 1].length + + // Can at least squeeze this chunk onto the current line. + if (cur_len + l <= width) { + cur_line.push(chunks.pop()) + cur_len += l + + // Nope, this line is full. + } else { + break + } + } + + // The current line is full, and the next chunk is too big to + // fit on *any* line (not just this one). + if (chunks.length && chunks[chunks.length - 1].length > width) { + this._handle_long_word(chunks, cur_line, cur_len, width) + cur_len = cur_line.map(l => l.length).reduce((a, b) => a + b, 0) + } + + // If the last chunk on this line is all whitespace, drop it. + if (this.drop_whitespace && cur_line.length > 0 && cur_line[cur_line.length - 1].trim() === '') { + cur_len -= cur_line[cur_line.length - 1].length + cur_line.pop() + } + + if (cur_line) { + if (this.max_lines === undefined || + lines.length + 1 < this.max_lines || + (chunks.length === 0 || + this.drop_whitespace && + chunks.length === 1 && + !chunks[0].trim()) && cur_len <= width) { + // Convert current line back to a string and store it in + // list of all lines (return value). + lines.push(indent + cur_line.join('')) + } else { + let had_break = false + while (cur_line) { + if (cur_line[cur_line.length - 1].trim() && + cur_len + this.placeholder.length <= width) { + cur_line.push(this.placeholder) + lines.push(indent + cur_line.join('')) + had_break = true + break + } + cur_len -= cur_line[-1].length + cur_line.pop() + } + if (!had_break) { + if (lines) { + let prev_line = lines[lines.length - 1].trimEnd() + if (prev_line.length + this.placeholder.length <= + this.width) { + lines[lines.length - 1] = prev_line + this.placeholder + break + } + } + lines.push(indent + this.placeholder.lstrip()) + } + break + } + } + } + + return lines + } + + _split_chunks(text) { + text = this._munge_whitespace(text) + return this._split(text) + } + + // -- Public interface ---------------------------------------------- + + wrap(text) { + /* + * wrap(text : string) -> [string] + * + * Reformat the single paragraph in 'text' so it fits in lines of + * no more than 'self.width' columns, and return a list of wrapped + * lines. Tabs in 'text' are expanded with string.expandtabs(), + * and all other whitespace characters (including newline) are + * converted to space. + */ + let chunks = this._split_chunks(text) + // not implemented in js + //if (this.fix_sentence_endings) { + // this._fix_sentence_endings(chunks) + //} + return this._wrap_chunks(chunks) + } + + fill(text) { + /* + * fill(text : string) -> string + * + * Reformat the single paragraph in 'text' to fit in lines of no + * more than 'self.width' columns, and return a new string + * containing the entire wrapped paragraph. + */ + return this.wrap(text).join('\n') + } +} + + +// -- Convenience interface --------------------------------------------- + +function wrap(text, options = {}) { + /* + * Wrap a single paragraph of text, returning a list of wrapped lines. + * + * Reformat the single paragraph in 'text' so it fits in lines of no + * more than 'width' columns, and return a list of wrapped lines. By + * default, tabs in 'text' are expanded with string.expandtabs(), and + * all other whitespace characters (including newline) are converted to + * space. See TextWrapper class for available keyword args to customize + * wrapping behaviour. + */ + let { width = 70, ...kwargs } = options + let w = new TextWrapper(Object.assign({ width }, kwargs)) + return w.wrap(text) +} + +function fill(text, options = {}) { + /* + * Fill a single paragraph of text, returning a new string. + * + * Reformat the single paragraph in 'text' to fit in lines of no more + * than 'width' columns, and return a new string containing the entire + * wrapped paragraph. As with wrap(), tabs are expanded and other + * whitespace characters converted to space. See TextWrapper class for + * available keyword args to customize wrapping behaviour. + */ + let { width = 70, ...kwargs } = options + let w = new TextWrapper(Object.assign({ width }, kwargs)) + return w.fill(text) +} + +// -- Loosely related functionality ------------------------------------- + +let _whitespace_only_re = /^[ \t]+$/mg +let _leading_whitespace_re = /(^[ \t]*)(?:[^ \t\n])/mg + +function dedent(text) { + /* + * Remove any common leading whitespace from every line in `text`. + * + * This can be used to make triple-quoted strings line up with the left + * edge of the display, while still presenting them in the source code + * in indented form. + * + * Note that tabs and spaces are both treated as whitespace, but they + * are not equal: the lines " hello" and "\\thello" are + * considered to have no common leading whitespace. + * + * Entirely blank lines are normalized to a newline character. + */ + // Look for the longest leading string of spaces and tabs common to + // all lines. + let margin = undefined + text = text.replace(_whitespace_only_re, '') + let indents = text.match(_leading_whitespace_re) || [] + for (let indent of indents) { + indent = indent.slice(0, -1) + + if (margin === undefined) { + margin = indent + + // Current line more deeply indented than previous winner: + // no change (previous winner is still on top). + } else if (indent.startsWith(margin)) { + // pass + + // Current line consistent with and no deeper than previous winner: + // it's the new winner. + } else if (margin.startsWith(indent)) { + margin = indent + + // Find the largest common whitespace between current line and previous + // winner. + } else { + for (let i = 0; i < margin.length && i < indent.length; i++) { + if (margin[i] !== indent[i]) { + margin = margin.slice(0, i) + break + } + } + } + } + + if (margin) { + text = text.replace(new RegExp('^' + margin, 'mg'), '') + } + return text +} + +module.exports = { wrap, fill, dedent } diff --git a/node_modules/@11ty/eleventy/node_modules/argparse/package.json b/node_modules/@11ty/eleventy/node_modules/argparse/package.json new file mode 100644 index 0000000..647d2af --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/argparse/package.json @@ -0,0 +1,31 @@ +{ + "name": "argparse", + "description": "CLI arguments parser. Native port of python's argparse.", + "version": "2.0.1", + "keywords": [ + "cli", + "parser", + "argparse", + "option", + "args" + ], + "main": "argparse.js", + "files": [ + "argparse.js", + "lib/" + ], + "license": "Python-2.0", + "repository": "nodeca/argparse", + "scripts": { + "lint": "eslint .", + "test": "npm run lint && nyc mocha", + "coverage": "npm run test && nyc report --reporter html" + }, + "devDependencies": { + "@babel/eslint-parser": "^7.11.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "eslint": "^7.5.0", + "mocha": "^8.0.1", + "nyc": "^15.1.0" + } +} diff --git a/node_modules/@11ty/eleventy/node_modules/entities/LICENSE b/node_modules/@11ty/eleventy/node_modules/entities/LICENSE new file mode 100644 index 0000000..c464f86 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/LICENSE @@ -0,0 +1,11 @@ +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/@11ty/eleventy/node_modules/entities/decode.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/decode.d.ts new file mode 100644 index 0000000..5c0b480 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/decode.d.ts @@ -0,0 +1 @@ +export * from "./dist/commonjs/decode.js"; diff --git a/node_modules/@11ty/eleventy/node_modules/entities/decode.js b/node_modules/@11ty/eleventy/node_modules/entities/decode.js new file mode 100644 index 0000000..c278895 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/decode.js @@ -0,0 +1,3 @@ +// Make exports work in Node < 12 +// eslint-disable-next-line no-undef, unicorn/prefer-module +module.exports = require("./dist/commonjs/decode.js"); diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.d.ts new file mode 100644 index 0000000..32f77c9 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.d.ts @@ -0,0 +1,19 @@ +/** + * Polyfill for `String.fromCodePoint`. It is used to create a string from a Unicode code point. + */ +export declare const fromCodePoint: (...codePoints: number[]) => string; +/** + * Replace the given code point with a replacement character if it is a + * surrogate or is outside the valid range. Otherwise return the code + * point unchanged. + */ +export declare function replaceCodePoint(codePoint: number): number; +/** + * Replace the code point if relevant, then convert it to a string. + * + * @deprecated Use `fromCodePoint(replaceCodePoint(codePoint))` instead. + * @param codePoint The code point to decode. + * @returns The decoded code point. + */ +export declare function decodeCodePoint(codePoint: number): string; +//# sourceMappingURL=decode-codepoint.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.d.ts.map new file mode 100644 index 0000000..3518e57 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"decode-codepoint.d.ts","sourceRoot":"","sources":["../../src/decode-codepoint.ts"],"names":[],"mappings":"AAkCA;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,CAAC,GAAG,UAAU,EAAE,MAAM,EAAE,KAAK,MAgBpD,CAAC;AAEN;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.js new file mode 100644 index 0000000..9539f67 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.js @@ -0,0 +1,77 @@ +"use strict"; +// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134 +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.fromCodePoint = void 0; +exports.replaceCodePoint = replaceCodePoint; +exports.decodeCodePoint = decodeCodePoint; +const decodeMap = new Map([ + [0, 65533], + // C1 Unicode control character reference replacements + [128, 8364], + [130, 8218], + [131, 402], + [132, 8222], + [133, 8230], + [134, 8224], + [135, 8225], + [136, 710], + [137, 8240], + [138, 352], + [139, 8249], + [140, 338], + [142, 381], + [145, 8216], + [146, 8217], + [147, 8220], + [148, 8221], + [149, 8226], + [150, 8211], + [151, 8212], + [152, 732], + [153, 8482], + [154, 353], + [155, 8250], + [156, 339], + [158, 382], + [159, 376], +]); +/** + * Polyfill for `String.fromCodePoint`. It is used to create a string from a Unicode code point. + */ +exports.fromCodePoint = +// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, n/no-unsupported-features/es-builtins +(_a = String.fromCodePoint) !== null && _a !== void 0 ? _a : function (codePoint) { + let output = ""; + if (codePoint > 65535) { + codePoint -= 65536; + output += String.fromCharCode(((codePoint >>> 10) & 1023) | 55296); + codePoint = 56320 | (codePoint & 1023); + } + output += String.fromCharCode(codePoint); + return output; +}; +/** + * Replace the given code point with a replacement character if it is a + * surrogate or is outside the valid range. Otherwise return the code + * point unchanged. + */ +function replaceCodePoint(codePoint) { + var _a; + if ((codePoint >= 55296 && codePoint <= 57343) || + codePoint > 1114111) { + return 65533; + } + return (_a = decodeMap.get(codePoint)) !== null && _a !== void 0 ? _a : codePoint; +} +/** + * Replace the code point if relevant, then convert it to a string. + * + * @deprecated Use `fromCodePoint(replaceCodePoint(codePoint))` instead. + * @param codePoint The code point to decode. + * @returns The decoded code point. + */ +function decodeCodePoint(codePoint) { + return (0, exports.fromCodePoint)(replaceCodePoint(codePoint)); +} +//# sourceMappingURL=decode-codepoint.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.js.map new file mode 100644 index 0000000..ba274bf --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode-codepoint.js.map @@ -0,0 +1 @@ +{"version":3,"file":"decode-codepoint.js","sourceRoot":"","sources":["../../src/decode-codepoint.ts"],"names":[],"mappings":";AAAA,qHAAqH;;;;AA4DrH,4CASC;AASD,0CAEC;AA9ED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACtB,CAAC,CAAC,EAAE,KAAM,CAAC;IACX,sDAAsD;IACtD,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;CACb,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,aAAa;AACtB,8GAA8G;AAC9G,MAAA,MAAM,CAAC,aAAa,mCACpB,UAAU,SAAiB;IACvB,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,IAAI,SAAS,GAAG,KAAO,EAAE,CAAC;QACtB,SAAS,IAAI,KAAS,CAAC;QACvB,MAAM,IAAI,MAAM,CAAC,YAAY,CACzB,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,GAAG,IAAM,CAAC,GAAG,KAAO,CAC1C,CAAC;QACF,SAAS,GAAG,KAAO,GAAG,CAAC,SAAS,GAAG,IAAM,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEN;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,SAAiB;;IAC9C,IACI,CAAC,SAAS,IAAI,KAAO,IAAI,SAAS,IAAI,KAAO,CAAC;QAC9C,SAAS,GAAG,OAAU,EACxB,CAAC;QACC,OAAO,KAAO,CAAC;IACnB,CAAC;IAED,OAAO,MAAA,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAI,SAAS,CAAC;AACjD,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,SAAiB;IAC7C,OAAO,IAAA,qBAAa,EAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;AACtD,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.d.ts new file mode 100644 index 0000000..96c160c --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.d.ts @@ -0,0 +1,209 @@ +export declare enum BinTrieFlags { + VALUE_LENGTH = 49152, + BRANCH_LENGTH = 16256, + JUMP_TABLE = 127 +} +export declare enum DecodingMode { + /** Entities in text nodes that can end with any character. */ + Legacy = 0, + /** Only allow entities terminated with a semicolon. */ + Strict = 1, + /** Entities in attributes have limitations on ending characters. */ + Attribute = 2 +} +/** + * Producers for character reference errors as defined in the HTML spec. + */ +export interface EntityErrorProducer { + missingSemicolonAfterCharacterReference(): void; + absenceOfDigitsInNumericCharacterReference(consumedCharacters: number): void; + validateNumericCharacterReference(code: number): void; +} +/** + * Token decoder with support of writing partial entities. + */ +export declare class EntityDecoder { + /** The tree used to decode entities. */ + private readonly decodeTree; + /** + * The function that is called when a codepoint is decoded. + * + * For multi-byte named entities, this will be called multiple times, + * with the second codepoint, and the same `consumed` value. + * + * @param codepoint The decoded codepoint. + * @param consumed The number of bytes consumed by the decoder. + */ + private readonly emitCodePoint; + /** An object that is used to produce errors. */ + private readonly errors?; + constructor( + /** The tree used to decode entities. */ + decodeTree: Uint16Array, + /** + * The function that is called when a codepoint is decoded. + * + * For multi-byte named entities, this will be called multiple times, + * with the second codepoint, and the same `consumed` value. + * + * @param codepoint The decoded codepoint. + * @param consumed The number of bytes consumed by the decoder. + */ + emitCodePoint: (cp: number, consumed: number) => void, + /** An object that is used to produce errors. */ + errors?: EntityErrorProducer | undefined); + /** The current state of the decoder. */ + private state; + /** Characters that were consumed while parsing an entity. */ + private consumed; + /** + * The result of the entity. + * + * Either the result index of a numeric entity, or the codepoint of a + * numeric entity. + */ + private result; + /** The current index in the decode tree. */ + private treeIndex; + /** The number of characters that were consumed in excess. */ + private excess; + /** The mode in which the decoder is operating. */ + private decodeMode; + /** Resets the instance to make it reusable. */ + startEntity(decodeMode: DecodingMode): void; + /** + * Write an entity to the decoder. This can be called multiple times with partial entities. + * If the entity is incomplete, the decoder will return -1. + * + * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the + * entity is incomplete, and resume when the next string is written. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The offset at which the entity begins. Should be 0 if this is not the first call. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + write(input: string, offset: number): number; + /** + * Switches between the numeric decimal and hexadecimal states. + * + * Equivalent to the `Numeric character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + private stateNumericStart; + private addToNumericResult; + /** + * Parses a hexadecimal numeric entity. + * + * Equivalent to the `Hexademical character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + private stateNumericHex; + /** + * Parses a decimal numeric entity. + * + * Equivalent to the `Decimal character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + private stateNumericDecimal; + /** + * Validate and emit a numeric entity. + * + * Implements the logic from the `Hexademical character reference start + * state` and `Numeric character reference end state` in the HTML spec. + * + * @param lastCp The last code point of the entity. Used to see if the + * entity was terminated with a semicolon. + * @param expectedLength The minimum number of characters that should be + * consumed. Used to validate that at least one digit + * was consumed. + * @returns The number of characters that were consumed. + */ + private emitNumericEntity; + /** + * Parses a named entity. + * + * Equivalent to the `Named character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + private stateNamedEntity; + /** + * Emit a named entity that was not terminated with a semicolon. + * + * @returns The number of characters consumed. + */ + private emitNotTerminatedNamedEntity; + /** + * Emit a named entity. + * + * @param result The index of the entity in the decode tree. + * @param valueLength The number of bytes in the entity. + * @param consumed The number of characters consumed. + * + * @returns The number of characters consumed. + */ + private emitNamedEntityData; + /** + * Signal to the parser that the end of the input was reached. + * + * Remaining data will be emitted and relevant errors will be produced. + * + * @returns The number of characters consumed. + */ + end(): number; +} +/** + * Determines the branch of the current node that is taken given the current + * character. This function is used to traverse the trie. + * + * @param decodeTree The trie. + * @param current The current node. + * @param nodeIdx The index right after the current node and its value. + * @param char The current character. + * @returns The index of the next node, or -1 if no branch is taken. + */ +export declare function determineBranch(decodeTree: Uint16Array, current: number, nodeIndex: number, char: number): number; +/** + * Decodes an HTML string. + * + * @param htmlString The string to decode. + * @param mode The decoding mode. + * @returns The decoded string. + */ +export declare function decodeHTML(htmlString: string, mode?: DecodingMode): string; +/** + * Decodes an HTML string in an attribute. + * + * @param htmlAttribute The string to decode. + * @returns The decoded string. + */ +export declare function decodeHTMLAttribute(htmlAttribute: string): string; +/** + * Decodes an HTML string, requiring all entities to be terminated by a semicolon. + * + * @param htmlString The string to decode. + * @returns The decoded string. + */ +export declare function decodeHTMLStrict(htmlString: string): string; +/** + * Decodes an XML string, requiring all entities to be terminated by a semicolon. + * + * @param xmlString The string to decode. + * @returns The decoded string. + */ +export declare function decodeXML(xmlString: string): string; +export { htmlDecodeTree } from "./generated/decode-data-html.js"; +export { xmlDecodeTree } from "./generated/decode-data-xml.js"; +export { decodeCodePoint, replaceCodePoint, fromCodePoint, } from "./decode-codepoint.js"; +//# sourceMappingURL=decode.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.d.ts.map new file mode 100644 index 0000000..fc233f4 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../../src/decode.ts"],"names":[],"mappings":"AAsBA,oBAAY,YAAY;IACpB,YAAY,QAAwB;IACpC,aAAa,QAAwB;IACrC,UAAU,MAAwB;CACrC;AAuCD,oBAAY,YAAY;IACpB,8DAA8D;IAC9D,MAAM,IAAI;IACV,uDAAuD;IACvD,MAAM,IAAI;IACV,oEAAoE;IACpE,SAAS,IAAI;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,uCAAuC,IAAI,IAAI,CAAC;IAChD,0CAA0C,CACtC,kBAAkB,EAAE,MAAM,GAC3B,IAAI,CAAC;IACR,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACzD;AAED;;GAEG;AACH,qBAAa,aAAa;IAElB,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,gDAAgD;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;;IAbxB,wCAAwC;IACvB,UAAU,EAAE,WAAW;IACxC;;;;;;;;OAQG;IACc,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI;IACtE,gDAAgD;IAC/B,MAAM,CAAC,EAAE,mBAAmB,GAAG,SAAS;IAG7D,wCAAwC;IACxC,OAAO,CAAC,KAAK,CAAkC;IAC/C,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAK;IACrB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAK;IAEnB,4CAA4C;IAC5C,OAAO,CAAC,SAAS,CAAK;IACtB,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAK;IACnB,kDAAkD;IAClD,OAAO,CAAC,UAAU,CAAuB;IAEzC,+CAA+C;IAC/C,WAAW,CAAC,UAAU,EAAE,YAAY,GAAG,IAAI;IAS3C;;;;;;;;;;OAUG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IA8B5C;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,kBAAkB;IAe1B;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAkBvB;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAsDxB;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IAYpC;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;;;;;OAMG;IACH,GAAG,IAAI,MAAM;CA6BhB;AAoDD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC3B,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACb,MAAM,CAsCR;AAKD;;;;;;GAMG;AACH,wBAAgB,UAAU,CACtB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,YAAkC,GACzC,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnD;AAGD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EACH,eAAe,EACf,gBAAgB,EAChB,aAAa,GAChB,MAAM,uBAAuB,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.js new file mode 100644 index 0000000..3e239db --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.js @@ -0,0 +1,511 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.fromCodePoint = exports.replaceCodePoint = exports.decodeCodePoint = exports.xmlDecodeTree = exports.htmlDecodeTree = exports.EntityDecoder = exports.DecodingMode = exports.BinTrieFlags = void 0; +exports.determineBranch = determineBranch; +exports.decodeHTML = decodeHTML; +exports.decodeHTMLAttribute = decodeHTMLAttribute; +exports.decodeHTMLStrict = decodeHTMLStrict; +exports.decodeXML = decodeXML; +const decode_data_html_js_1 = require("./generated/decode-data-html.js"); +const decode_data_xml_js_1 = require("./generated/decode-data-xml.js"); +const decode_codepoint_js_1 = require("./decode-codepoint.js"); +var CharCodes; +(function (CharCodes) { + CharCodes[CharCodes["NUM"] = 35] = "NUM"; + CharCodes[CharCodes["SEMI"] = 59] = "SEMI"; + CharCodes[CharCodes["EQUALS"] = 61] = "EQUALS"; + CharCodes[CharCodes["ZERO"] = 48] = "ZERO"; + CharCodes[CharCodes["NINE"] = 57] = "NINE"; + CharCodes[CharCodes["LOWER_A"] = 97] = "LOWER_A"; + CharCodes[CharCodes["LOWER_F"] = 102] = "LOWER_F"; + CharCodes[CharCodes["LOWER_X"] = 120] = "LOWER_X"; + CharCodes[CharCodes["LOWER_Z"] = 122] = "LOWER_Z"; + CharCodes[CharCodes["UPPER_A"] = 65] = "UPPER_A"; + CharCodes[CharCodes["UPPER_F"] = 70] = "UPPER_F"; + CharCodes[CharCodes["UPPER_Z"] = 90] = "UPPER_Z"; +})(CharCodes || (CharCodes = {})); +/** Bit that needs to be set to convert an upper case ASCII character to lower case */ +const TO_LOWER_BIT = 32; +var BinTrieFlags; +(function (BinTrieFlags) { + BinTrieFlags[BinTrieFlags["VALUE_LENGTH"] = 49152] = "VALUE_LENGTH"; + BinTrieFlags[BinTrieFlags["BRANCH_LENGTH"] = 16256] = "BRANCH_LENGTH"; + BinTrieFlags[BinTrieFlags["JUMP_TABLE"] = 127] = "JUMP_TABLE"; +})(BinTrieFlags || (exports.BinTrieFlags = BinTrieFlags = {})); +function isNumber(code) { + return code >= CharCodes.ZERO && code <= CharCodes.NINE; +} +function isHexadecimalCharacter(code) { + return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F) || + (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F)); +} +function isAsciiAlphaNumeric(code) { + return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z) || + (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z) || + isNumber(code)); +} +/** + * Checks if the given character is a valid end character for an entity in an attribute. + * + * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error. + * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state + */ +function isEntityInAttributeInvalidEnd(code) { + return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code); +} +var EntityDecoderState; +(function (EntityDecoderState) { + EntityDecoderState[EntityDecoderState["EntityStart"] = 0] = "EntityStart"; + EntityDecoderState[EntityDecoderState["NumericStart"] = 1] = "NumericStart"; + EntityDecoderState[EntityDecoderState["NumericDecimal"] = 2] = "NumericDecimal"; + EntityDecoderState[EntityDecoderState["NumericHex"] = 3] = "NumericHex"; + EntityDecoderState[EntityDecoderState["NamedEntity"] = 4] = "NamedEntity"; +})(EntityDecoderState || (EntityDecoderState = {})); +var DecodingMode; +(function (DecodingMode) { + /** Entities in text nodes that can end with any character. */ + DecodingMode[DecodingMode["Legacy"] = 0] = "Legacy"; + /** Only allow entities terminated with a semicolon. */ + DecodingMode[DecodingMode["Strict"] = 1] = "Strict"; + /** Entities in attributes have limitations on ending characters. */ + DecodingMode[DecodingMode["Attribute"] = 2] = "Attribute"; +})(DecodingMode || (exports.DecodingMode = DecodingMode = {})); +/** + * Token decoder with support of writing partial entities. + */ +class EntityDecoder { + constructor( + /** The tree used to decode entities. */ + decodeTree, + /** + * The function that is called when a codepoint is decoded. + * + * For multi-byte named entities, this will be called multiple times, + * with the second codepoint, and the same `consumed` value. + * + * @param codepoint The decoded codepoint. + * @param consumed The number of bytes consumed by the decoder. + */ + emitCodePoint, + /** An object that is used to produce errors. */ + errors) { + this.decodeTree = decodeTree; + this.emitCodePoint = emitCodePoint; + this.errors = errors; + /** The current state of the decoder. */ + this.state = EntityDecoderState.EntityStart; + /** Characters that were consumed while parsing an entity. */ + this.consumed = 1; + /** + * The result of the entity. + * + * Either the result index of a numeric entity, or the codepoint of a + * numeric entity. + */ + this.result = 0; + /** The current index in the decode tree. */ + this.treeIndex = 0; + /** The number of characters that were consumed in excess. */ + this.excess = 1; + /** The mode in which the decoder is operating. */ + this.decodeMode = DecodingMode.Strict; + } + /** Resets the instance to make it reusable. */ + startEntity(decodeMode) { + this.decodeMode = decodeMode; + this.state = EntityDecoderState.EntityStart; + this.result = 0; + this.treeIndex = 0; + this.excess = 1; + this.consumed = 1; + } + /** + * Write an entity to the decoder. This can be called multiple times with partial entities. + * If the entity is incomplete, the decoder will return -1. + * + * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the + * entity is incomplete, and resume when the next string is written. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The offset at which the entity begins. Should be 0 if this is not the first call. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + write(input, offset) { + switch (this.state) { + case EntityDecoderState.EntityStart: { + if (input.charCodeAt(offset) === CharCodes.NUM) { + this.state = EntityDecoderState.NumericStart; + this.consumed += 1; + return this.stateNumericStart(input, offset + 1); + } + this.state = EntityDecoderState.NamedEntity; + return this.stateNamedEntity(input, offset); + } + case EntityDecoderState.NumericStart: { + return this.stateNumericStart(input, offset); + } + case EntityDecoderState.NumericDecimal: { + return this.stateNumericDecimal(input, offset); + } + case EntityDecoderState.NumericHex: { + return this.stateNumericHex(input, offset); + } + case EntityDecoderState.NamedEntity: { + return this.stateNamedEntity(input, offset); + } + } + } + /** + * Switches between the numeric decimal and hexadecimal states. + * + * Equivalent to the `Numeric character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + stateNumericStart(input, offset) { + if (offset >= input.length) { + return -1; + } + if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) { + this.state = EntityDecoderState.NumericHex; + this.consumed += 1; + return this.stateNumericHex(input, offset + 1); + } + this.state = EntityDecoderState.NumericDecimal; + return this.stateNumericDecimal(input, offset); + } + addToNumericResult(input, start, end, base) { + if (start !== end) { + const digitCount = end - start; + this.result = + this.result * Math.pow(base, digitCount) + + Number.parseInt(input.substr(start, digitCount), base); + this.consumed += digitCount; + } + } + /** + * Parses a hexadecimal numeric entity. + * + * Equivalent to the `Hexademical character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + stateNumericHex(input, offset) { + const startIndex = offset; + while (offset < input.length) { + const char = input.charCodeAt(offset); + if (isNumber(char) || isHexadecimalCharacter(char)) { + offset += 1; + } + else { + this.addToNumericResult(input, startIndex, offset, 16); + return this.emitNumericEntity(char, 3); + } + } + this.addToNumericResult(input, startIndex, offset, 16); + return -1; + } + /** + * Parses a decimal numeric entity. + * + * Equivalent to the `Decimal character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + stateNumericDecimal(input, offset) { + const startIndex = offset; + while (offset < input.length) { + const char = input.charCodeAt(offset); + if (isNumber(char)) { + offset += 1; + } + else { + this.addToNumericResult(input, startIndex, offset, 10); + return this.emitNumericEntity(char, 2); + } + } + this.addToNumericResult(input, startIndex, offset, 10); + return -1; + } + /** + * Validate and emit a numeric entity. + * + * Implements the logic from the `Hexademical character reference start + * state` and `Numeric character reference end state` in the HTML spec. + * + * @param lastCp The last code point of the entity. Used to see if the + * entity was terminated with a semicolon. + * @param expectedLength The minimum number of characters that should be + * consumed. Used to validate that at least one digit + * was consumed. + * @returns The number of characters that were consumed. + */ + emitNumericEntity(lastCp, expectedLength) { + var _a; + // Ensure we consumed at least one digit. + if (this.consumed <= expectedLength) { + (_a = this.errors) === null || _a === void 0 ? void 0 : _a.absenceOfDigitsInNumericCharacterReference(this.consumed); + return 0; + } + // Figure out if this is a legit end of the entity + if (lastCp === CharCodes.SEMI) { + this.consumed += 1; + } + else if (this.decodeMode === DecodingMode.Strict) { + return 0; + } + this.emitCodePoint((0, decode_codepoint_js_1.replaceCodePoint)(this.result), this.consumed); + if (this.errors) { + if (lastCp !== CharCodes.SEMI) { + this.errors.missingSemicolonAfterCharacterReference(); + } + this.errors.validateNumericCharacterReference(this.result); + } + return this.consumed; + } + /** + * Parses a named entity. + * + * Equivalent to the `Named character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + stateNamedEntity(input, offset) { + const { decodeTree } = this; + let current = decodeTree[this.treeIndex]; + // The mask is the number of bytes of the value, including the current byte. + let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14; + for (; offset < input.length; offset++, this.excess++) { + const char = input.charCodeAt(offset); + this.treeIndex = determineBranch(decodeTree, current, this.treeIndex + Math.max(1, valueLength), char); + if (this.treeIndex < 0) { + return this.result === 0 || + // If we are parsing an attribute + (this.decodeMode === DecodingMode.Attribute && + // We shouldn't have consumed any characters after the entity, + (valueLength === 0 || + // And there should be no invalid characters. + isEntityInAttributeInvalidEnd(char))) + ? 0 + : this.emitNotTerminatedNamedEntity(); + } + current = decodeTree[this.treeIndex]; + valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14; + // If the branch is a value, store it and continue + if (valueLength !== 0) { + // If the entity is terminated by a semicolon, we are done. + if (char === CharCodes.SEMI) { + return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess); + } + // If we encounter a non-terminated (legacy) entity while parsing strictly, then ignore it. + if (this.decodeMode !== DecodingMode.Strict) { + this.result = this.treeIndex; + this.consumed += this.excess; + this.excess = 0; + } + } + } + return -1; + } + /** + * Emit a named entity that was not terminated with a semicolon. + * + * @returns The number of characters consumed. + */ + emitNotTerminatedNamedEntity() { + var _a; + const { result, decodeTree } = this; + const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14; + this.emitNamedEntityData(result, valueLength, this.consumed); + (_a = this.errors) === null || _a === void 0 ? void 0 : _a.missingSemicolonAfterCharacterReference(); + return this.consumed; + } + /** + * Emit a named entity. + * + * @param result The index of the entity in the decode tree. + * @param valueLength The number of bytes in the entity. + * @param consumed The number of characters consumed. + * + * @returns The number of characters consumed. + */ + emitNamedEntityData(result, valueLength, consumed) { + const { decodeTree } = this; + this.emitCodePoint(valueLength === 1 + ? decodeTree[result] & ~BinTrieFlags.VALUE_LENGTH + : decodeTree[result + 1], consumed); + if (valueLength === 3) { + // For multi-byte values, we need to emit the second byte. + this.emitCodePoint(decodeTree[result + 2], consumed); + } + return consumed; + } + /** + * Signal to the parser that the end of the input was reached. + * + * Remaining data will be emitted and relevant errors will be produced. + * + * @returns The number of characters consumed. + */ + end() { + var _a; + switch (this.state) { + case EntityDecoderState.NamedEntity: { + // Emit a named entity if we have one. + return this.result !== 0 && + (this.decodeMode !== DecodingMode.Attribute || + this.result === this.treeIndex) + ? this.emitNotTerminatedNamedEntity() + : 0; + } + // Otherwise, emit a numeric entity if we have one. + case EntityDecoderState.NumericDecimal: { + return this.emitNumericEntity(0, 2); + } + case EntityDecoderState.NumericHex: { + return this.emitNumericEntity(0, 3); + } + case EntityDecoderState.NumericStart: { + (_a = this.errors) === null || _a === void 0 ? void 0 : _a.absenceOfDigitsInNumericCharacterReference(this.consumed); + return 0; + } + case EntityDecoderState.EntityStart: { + // Return 0 if we have no entity. + return 0; + } + } + } +} +exports.EntityDecoder = EntityDecoder; +/** + * Creates a function that decodes entities in a string. + * + * @param decodeTree The decode tree. + * @returns A function that decodes entities in a string. + */ +function getDecoder(decodeTree) { + let returnValue = ""; + const decoder = new EntityDecoder(decodeTree, (data) => (returnValue += (0, decode_codepoint_js_1.fromCodePoint)(data))); + return function decodeWithTrie(input, decodeMode) { + let lastIndex = 0; + let offset = 0; + while ((offset = input.indexOf("&", offset)) >= 0) { + returnValue += input.slice(lastIndex, offset); + decoder.startEntity(decodeMode); + const length = decoder.write(input, + // Skip the "&" + offset + 1); + if (length < 0) { + lastIndex = offset + decoder.end(); + break; + } + lastIndex = offset + length; + // If `length` is 0, skip the current `&` and continue. + offset = length === 0 ? lastIndex + 1 : lastIndex; + } + const result = returnValue + input.slice(lastIndex); + // Make sure we don't keep a reference to the final string. + returnValue = ""; + return result; + }; +} +/** + * Determines the branch of the current node that is taken given the current + * character. This function is used to traverse the trie. + * + * @param decodeTree The trie. + * @param current The current node. + * @param nodeIdx The index right after the current node and its value. + * @param char The current character. + * @returns The index of the next node, or -1 if no branch is taken. + */ +function determineBranch(decodeTree, current, nodeIndex, char) { + const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7; + const jumpOffset = current & BinTrieFlags.JUMP_TABLE; + // Case 1: Single branch encoded in jump offset + if (branchCount === 0) { + return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1; + } + // Case 2: Multiple branches encoded in jump table + if (jumpOffset) { + const value = char - jumpOffset; + return value < 0 || value >= branchCount + ? -1 + : decodeTree[nodeIndex + value] - 1; + } + // Case 3: Multiple branches encoded in dictionary + // Binary search for the character. + let lo = nodeIndex; + let hi = lo + branchCount - 1; + while (lo <= hi) { + const mid = (lo + hi) >>> 1; + const midValue = decodeTree[mid]; + if (midValue < char) { + lo = mid + 1; + } + else if (midValue > char) { + hi = mid - 1; + } + else { + return decodeTree[mid + branchCount]; + } + } + return -1; +} +const htmlDecoder = /* #__PURE__ */ getDecoder(decode_data_html_js_1.htmlDecodeTree); +const xmlDecoder = /* #__PURE__ */ getDecoder(decode_data_xml_js_1.xmlDecodeTree); +/** + * Decodes an HTML string. + * + * @param htmlString The string to decode. + * @param mode The decoding mode. + * @returns The decoded string. + */ +function decodeHTML(htmlString, mode = DecodingMode.Legacy) { + return htmlDecoder(htmlString, mode); +} +/** + * Decodes an HTML string in an attribute. + * + * @param htmlAttribute The string to decode. + * @returns The decoded string. + */ +function decodeHTMLAttribute(htmlAttribute) { + return htmlDecoder(htmlAttribute, DecodingMode.Attribute); +} +/** + * Decodes an HTML string, requiring all entities to be terminated by a semicolon. + * + * @param htmlString The string to decode. + * @returns The decoded string. + */ +function decodeHTMLStrict(htmlString) { + return htmlDecoder(htmlString, DecodingMode.Strict); +} +/** + * Decodes an XML string, requiring all entities to be terminated by a semicolon. + * + * @param xmlString The string to decode. + * @returns The decoded string. + */ +function decodeXML(xmlString) { + return xmlDecoder(xmlString, DecodingMode.Strict); +} +// Re-export for use by eg. htmlparser2 +var decode_data_html_js_2 = require("./generated/decode-data-html.js"); +Object.defineProperty(exports, "htmlDecodeTree", { enumerable: true, get: function () { return decode_data_html_js_2.htmlDecodeTree; } }); +var decode_data_xml_js_2 = require("./generated/decode-data-xml.js"); +Object.defineProperty(exports, "xmlDecodeTree", { enumerable: true, get: function () { return decode_data_xml_js_2.xmlDecodeTree; } }); +var decode_codepoint_js_2 = require("./decode-codepoint.js"); +Object.defineProperty(exports, "decodeCodePoint", { enumerable: true, get: function () { return decode_codepoint_js_2.decodeCodePoint; } }); +Object.defineProperty(exports, "replaceCodePoint", { enumerable: true, get: function () { return decode_codepoint_js_2.replaceCodePoint; } }); +Object.defineProperty(exports, "fromCodePoint", { enumerable: true, get: function () { return decode_codepoint_js_2.fromCodePoint; } }); +//# sourceMappingURL=decode.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.js.map new file mode 100644 index 0000000..7a5819c --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/decode.js.map @@ -0,0 +1 @@ +{"version":3,"file":"decode.js","sourceRoot":"","sources":["../../src/decode.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.d.ts new file mode 100644 index 0000000..e110bea --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.d.ts @@ -0,0 +1,22 @@ +/** + * Encodes all characters in the input using HTML entities. This includes + * characters that are valid ASCII characters in HTML documents, such as `#`. + * + * To get a more compact output, consider using the `encodeNonAsciiHTML` + * function, which will only encode characters that are not valid in HTML + * documents, as well as non-ASCII characters. + * + * If a character has no equivalent entity, a numeric hexadecimal reference + * (eg. `ü`) will be used. + */ +export declare function encodeHTML(input: string): string; +/** + * Encodes all non-ASCII characters, as well as characters not valid in HTML + * documents using HTML entities. This function will not encode characters that + * are valid in HTML documents, such as `#`. + * + * If a character has no equivalent entity, a numeric hexadecimal reference + * (eg. `ü`) will be used. + */ +export declare function encodeNonAsciiHTML(input: string): string; +//# sourceMappingURL=encode.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.d.ts.map new file mode 100644 index 0000000..3ef0d10 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AACD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.js new file mode 100644 index 0000000..cbbe90d --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.js @@ -0,0 +1,73 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.encodeHTML = encodeHTML; +exports.encodeNonAsciiHTML = encodeNonAsciiHTML; +const encode_html_js_1 = require("./generated/encode-html.js"); +const escape_js_1 = require("./escape.js"); +const htmlReplacer = /[\t\n\f!-,./:-@[-`{-}\u0080-\uFFFF]/g; +/** + * Encodes all characters in the input using HTML entities. This includes + * characters that are valid ASCII characters in HTML documents, such as `#`. + * + * To get a more compact output, consider using the `encodeNonAsciiHTML` + * function, which will only encode characters that are not valid in HTML + * documents, as well as non-ASCII characters. + * + * If a character has no equivalent entity, a numeric hexadecimal reference + * (eg. `ü`) will be used. + */ +function encodeHTML(input) { + return encodeHTMLTrieRe(htmlReplacer, input); +} +/** + * Encodes all non-ASCII characters, as well as characters not valid in HTML + * documents using HTML entities. This function will not encode characters that + * are valid in HTML documents, such as `#`. + * + * If a character has no equivalent entity, a numeric hexadecimal reference + * (eg. `ü`) will be used. + */ +function encodeNonAsciiHTML(input) { + return encodeHTMLTrieRe(escape_js_1.xmlReplacer, input); +} +function encodeHTMLTrieRe(regExp, input) { + let returnValue = ""; + let lastIndex = 0; + let match; + while ((match = regExp.exec(input)) !== null) { + const { index } = match; + returnValue += input.substring(lastIndex, index); + const char = input.charCodeAt(index); + let next = encode_html_js_1.htmlTrie.get(char); + if (typeof next === "object") { + // We are in a branch. Try to match the next char. + if (index + 1 < input.length) { + const nextChar = input.charCodeAt(index + 1); + const value = typeof next.n === "number" + ? next.n === nextChar + ? next.o + : undefined + : next.n.get(nextChar); + if (value !== undefined) { + returnValue += value; + lastIndex = regExp.lastIndex += 1; + continue; + } + } + next = next.v; + } + // We might have a tree node without a value; skip and use a numeric entity. + if (next === undefined) { + const cp = (0, escape_js_1.getCodePoint)(input, index); + returnValue += `&#x${cp.toString(16)};`; + // Increase by 1 if we have a surrogate pair + lastIndex = regExp.lastIndex += Number(cp !== char); + } + else { + returnValue += next; + lastIndex = index + 1; + } + } + return returnValue + input.substr(lastIndex); +} +//# sourceMappingURL=encode.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.js.map new file mode 100644 index 0000000..aa0afcf --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/encode.js.map @@ -0,0 +1 @@ +{"version":3,"file":"encode.js","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":";;AAgBA,gCAEC;AASD,gDAEC;AA7BD,+DAAsD;AACtD,2CAAwD;AAExD,MAAM,YAAY,GAAG,sCAAsC,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,SAAgB,UAAU,CAAC,KAAa;IACpC,OAAO,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AACD;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAAC,KAAa;IAC5C,OAAO,gBAAgB,CAAC,uBAAW,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc,EAAE,KAAa;IACnD,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;QACxB,WAAW,IAAI,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,IAAI,GAAG,yBAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,kDAAkD;YAClD,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC7C,MAAM,KAAK,GACP,OAAO,IAAI,CAAC,CAAC,KAAK,QAAQ;oBACtB,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,QAAQ;wBACjB,CAAC,CAAC,IAAI,CAAC,CAAC;wBACR,CAAC,CAAC,SAAS;oBACf,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAE/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACtB,WAAW,IAAI,KAAK,CAAC;oBACrB,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;oBAClC,SAAS;gBACb,CAAC;YACL,CAAC;YAED,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,4EAA4E;QAC5E,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,MAAM,EAAE,GAAG,IAAA,wBAAY,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACtC,WAAW,IAAI,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC;YACxC,4CAA4C;YAC5C,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACJ,WAAW,IAAI,IAAI,CAAC;YACpB,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;QAC1B,CAAC;IACL,CAAC;IAED,OAAO,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACjD,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.d.ts new file mode 100644 index 0000000..19bfc87 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.d.ts @@ -0,0 +1,43 @@ +export declare const xmlReplacer: RegExp; +export declare const getCodePoint: (c: string, index: number) => number; +/** + * Encodes all non-ASCII characters, as well as characters not valid in XML + * documents using XML entities. + * + * If a character has no equivalent entity, a + * numeric hexadecimal reference (eg. `ü`) will be used. + */ +export declare function encodeXML(input: string): string; +/** + * Encodes all non-ASCII characters, as well as characters not valid in XML + * documents using numeric hexadecimal reference (eg. `ü`). + * + * Have a look at `escapeUTF8` if you want a more concise output at the expense + * of reduced transportability. + * + * @param data String to escape. + */ +export declare const escape: typeof encodeXML; +/** + * Encodes all characters not valid in XML documents using XML entities. + * + * Note that the output will be character-set dependent. + * + * @param data String to escape. + */ +export declare const escapeUTF8: (data: string) => string; +/** + * Encodes all characters that have to be escaped in HTML attributes, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + * + * @param data String to escape. + */ +export declare const escapeAttribute: (data: string) => string; +/** + * Encodes all characters that have to be escaped in HTML text, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + * + * @param data String to escape. + */ +export declare const escapeText: (data: string) => string; +//# sourceMappingURL=escape.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.d.ts.map new file mode 100644 index 0000000..02a129c --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,EAAE,MAAiC,CAAC;AAW5D,eAAO,MAAM,YAAY,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAWoB,CAAC;AAE9E;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA0B/C;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,EAAE,OAAO,SAAqB,CAAC;AAqClD;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAG1C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAQ3C,CAAC;AAEN;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAQ1C,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.js new file mode 100644 index 0000000..ff9f814 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.js @@ -0,0 +1,121 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.escapeText = exports.escapeAttribute = exports.escapeUTF8 = exports.escape = exports.getCodePoint = exports.xmlReplacer = void 0; +exports.encodeXML = encodeXML; +exports.xmlReplacer = /["$&'<>\u0080-\uFFFF]/g; +const xmlCodeMap = new Map([ + [34, """], + [38, "&"], + [39, "'"], + [60, "<"], + [62, ">"], +]); +// For compatibility with node < 4, we wrap `codePointAt` +exports.getCodePoint = +// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition +String.prototype.codePointAt == null + ? (c, index) => (c.charCodeAt(index) & 64512) === 55296 + ? (c.charCodeAt(index) - 55296) * 1024 + + c.charCodeAt(index + 1) - + 56320 + + 65536 + : c.charCodeAt(index) + : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + (input, index) => input.codePointAt(index); +/** + * Encodes all non-ASCII characters, as well as characters not valid in XML + * documents using XML entities. + * + * If a character has no equivalent entity, a + * numeric hexadecimal reference (eg. `ü`) will be used. + */ +function encodeXML(input) { + let returnValue = ""; + let lastIndex = 0; + let match; + while ((match = exports.xmlReplacer.exec(input)) !== null) { + const { index } = match; + const char = input.charCodeAt(index); + const next = xmlCodeMap.get(char); + if (next === undefined) { + returnValue += `${input.substring(lastIndex, index)}&#x${(0, exports.getCodePoint)(input, index).toString(16)};`; + // Increase by 1 if we have a surrogate pair + lastIndex = exports.xmlReplacer.lastIndex += Number((char & 64512) === 55296); + } + else { + returnValue += input.substring(lastIndex, index) + next; + lastIndex = index + 1; + } + } + return returnValue + input.substr(lastIndex); +} +/** + * Encodes all non-ASCII characters, as well as characters not valid in XML + * documents using numeric hexadecimal reference (eg. `ü`). + * + * Have a look at `escapeUTF8` if you want a more concise output at the expense + * of reduced transportability. + * + * @param data String to escape. + */ +exports.escape = encodeXML; +/** + * Creates a function that escapes all characters matched by the given regular + * expression using the given map of characters to escape to their entities. + * + * @param regex Regular expression to match characters to escape. + * @param map Map of characters to escape to their entities. + * + * @returns Function that escapes all characters matched by the given regular + * expression using the given map of characters to escape to their entities. + */ +function getEscaper(regex, map) { + return function escape(data) { + let match; + let lastIndex = 0; + let result = ""; + while ((match = regex.exec(data))) { + if (lastIndex !== match.index) { + result += data.substring(lastIndex, match.index); + } + // We know that this character will be in the map. + result += map.get(match[0].charCodeAt(0)); + // Every match will be of length 1 + lastIndex = match.index + 1; + } + return result + data.substring(lastIndex); + }; +} +/** + * Encodes all characters not valid in XML documents using XML entities. + * + * Note that the output will be character-set dependent. + * + * @param data String to escape. + */ +exports.escapeUTF8 = getEscaper(/["&'<>]/g, xmlCodeMap); +/** + * Encodes all characters that have to be escaped in HTML attributes, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + * + * @param data String to escape. + */ +exports.escapeAttribute = +/* #__PURE__ */ getEscaper(/["&\u00A0]/g, new Map([ + [34, """], + [38, "&"], + [160, " "], +])); +/** + * Encodes all characters that have to be escaped in HTML text, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + * + * @param data String to escape. + */ +exports.escapeText = getEscaper(/[&<>\u00A0]/g, new Map([ + [38, "&"], + [60, "<"], + [62, ">"], + [160, " "], +])); +//# sourceMappingURL=escape.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.js.map new file mode 100644 index 0000000..832692d --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/escape.js.map @@ -0,0 +1 @@ +{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts new file mode 100644 index 0000000..cd09535 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts @@ -0,0 +1,2 @@ +export declare const htmlDecodeTree: Uint16Array; +//# sourceMappingURL=decode-data-html.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts.map new file mode 100644 index 0000000..6bb1ecf --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"decode-data-html.d.ts","sourceRoot":"","sources":["../../../src/generated/decode-data-html.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,EAAE,WAK5B,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.js new file mode 100644 index 0000000..f79d060 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.js @@ -0,0 +1,10 @@ +"use strict"; +// Generated using scripts/write-decode-map.ts +Object.defineProperty(exports, "__esModule", { value: true }); +exports.htmlDecodeTree = void 0; +exports.htmlDecodeTree = new Uint16Array( +// prettier-ignore +/* #__PURE__ */ "\u1d41<\xd5\u0131\u028a\u049d\u057b\u05d0\u0675\u06de\u07a2\u07d6\u080f\u0a4a\u0a91\u0da1\u0e6d\u0f09\u0f26\u10ca\u1228\u12e1\u1415\u149d\u14c3\u14df\u1525\0\0\0\0\0\0\u156b\u16cd\u198d\u1c12\u1ddd\u1f7e\u2060\u21b0\u228d\u23c0\u23fb\u2442\u2824\u2912\u2d08\u2e48\u2fce\u3016\u32ba\u3639\u37ac\u38fe\u3a28\u3a71\u3ae0\u3b2e\u0800EMabcfglmnoprstu\\bfms\x7f\x84\x8b\x90\x95\x98\xa6\xb3\xb9\xc8\xcflig\u803b\xc6\u40c6P\u803b&\u4026cute\u803b\xc1\u40c1reve;\u4102\u0100iyx}rc\u803b\xc2\u40c2;\u4410r;\uc000\ud835\udd04rave\u803b\xc0\u40c0pha;\u4391acr;\u4100d;\u6a53\u0100gp\x9d\xa1on;\u4104f;\uc000\ud835\udd38plyFunction;\u6061ing\u803b\xc5\u40c5\u0100cs\xbe\xc3r;\uc000\ud835\udc9cign;\u6254ilde\u803b\xc3\u40c3ml\u803b\xc4\u40c4\u0400aceforsu\xe5\xfb\xfe\u0117\u011c\u0122\u0127\u012a\u0100cr\xea\xf2kslash;\u6216\u0176\xf6\xf8;\u6ae7ed;\u6306y;\u4411\u0180crt\u0105\u010b\u0114ause;\u6235noullis;\u612ca;\u4392r;\uc000\ud835\udd05pf;\uc000\ud835\udd39eve;\u42d8c\xf2\u0113mpeq;\u624e\u0700HOacdefhilorsu\u014d\u0151\u0156\u0180\u019e\u01a2\u01b5\u01b7\u01ba\u01dc\u0215\u0273\u0278\u027ecy;\u4427PY\u803b\xa9\u40a9\u0180cpy\u015d\u0162\u017aute;\u4106\u0100;i\u0167\u0168\u62d2talDifferentialD;\u6145leys;\u612d\u0200aeio\u0189\u018e\u0194\u0198ron;\u410cdil\u803b\xc7\u40c7rc;\u4108nint;\u6230ot;\u410a\u0100dn\u01a7\u01adilla;\u40b8terDot;\u40b7\xf2\u017fi;\u43a7rcle\u0200DMPT\u01c7\u01cb\u01d1\u01d6ot;\u6299inus;\u6296lus;\u6295imes;\u6297o\u0100cs\u01e2\u01f8kwiseContourIntegral;\u6232eCurly\u0100DQ\u0203\u020foubleQuote;\u601duote;\u6019\u0200lnpu\u021e\u0228\u0247\u0255on\u0100;e\u0225\u0226\u6237;\u6a74\u0180git\u022f\u0236\u023aruent;\u6261nt;\u622fourIntegral;\u622e\u0100fr\u024c\u024e;\u6102oduct;\u6210nterClockwiseContourIntegral;\u6233oss;\u6a2fcr;\uc000\ud835\udc9ep\u0100;C\u0284\u0285\u62d3ap;\u624d\u0580DJSZacefios\u02a0\u02ac\u02b0\u02b4\u02b8\u02cb\u02d7\u02e1\u02e6\u0333\u048d\u0100;o\u0179\u02a5trahd;\u6911cy;\u4402cy;\u4405cy;\u440f\u0180grs\u02bf\u02c4\u02c7ger;\u6021r;\u61a1hv;\u6ae4\u0100ay\u02d0\u02d5ron;\u410e;\u4414l\u0100;t\u02dd\u02de\u6207a;\u4394r;\uc000\ud835\udd07\u0100af\u02eb\u0327\u0100cm\u02f0\u0322ritical\u0200ADGT\u0300\u0306\u0316\u031ccute;\u40b4o\u0174\u030b\u030d;\u42d9bleAcute;\u42ddrave;\u4060ilde;\u42dcond;\u62c4ferentialD;\u6146\u0470\u033d\0\0\0\u0342\u0354\0\u0405f;\uc000\ud835\udd3b\u0180;DE\u0348\u0349\u034d\u40a8ot;\u60dcqual;\u6250ble\u0300CDLRUV\u0363\u0372\u0382\u03cf\u03e2\u03f8ontourIntegra\xec\u0239o\u0274\u0379\0\0\u037b\xbb\u0349nArrow;\u61d3\u0100eo\u0387\u03a4ft\u0180ART\u0390\u0396\u03a1rrow;\u61d0ightArrow;\u61d4e\xe5\u02cang\u0100LR\u03ab\u03c4eft\u0100AR\u03b3\u03b9rrow;\u67f8ightArrow;\u67faightArrow;\u67f9ight\u0100AT\u03d8\u03derrow;\u61d2ee;\u62a8p\u0241\u03e9\0\0\u03efrrow;\u61d1ownArrow;\u61d5erticalBar;\u6225n\u0300ABLRTa\u0412\u042a\u0430\u045e\u047f\u037crrow\u0180;BU\u041d\u041e\u0422\u6193ar;\u6913pArrow;\u61f5reve;\u4311eft\u02d2\u043a\0\u0446\0\u0450ightVector;\u6950eeVector;\u695eector\u0100;B\u0459\u045a\u61bdar;\u6956ight\u01d4\u0467\0\u0471eeVector;\u695fector\u0100;B\u047a\u047b\u61c1ar;\u6957ee\u0100;A\u0486\u0487\u62a4rrow;\u61a7\u0100ct\u0492\u0497r;\uc000\ud835\udc9frok;\u4110\u0800NTacdfglmopqstux\u04bd\u04c0\u04c4\u04cb\u04de\u04e2\u04e7\u04ee\u04f5\u0521\u052f\u0536\u0552\u055d\u0560\u0565G;\u414aH\u803b\xd0\u40d0cute\u803b\xc9\u40c9\u0180aiy\u04d2\u04d7\u04dcron;\u411arc\u803b\xca\u40ca;\u442dot;\u4116r;\uc000\ud835\udd08rave\u803b\xc8\u40c8ement;\u6208\u0100ap\u04fa\u04fecr;\u4112ty\u0253\u0506\0\0\u0512mallSquare;\u65fberySmallSquare;\u65ab\u0100gp\u0526\u052aon;\u4118f;\uc000\ud835\udd3csilon;\u4395u\u0100ai\u053c\u0549l\u0100;T\u0542\u0543\u6a75ilde;\u6242librium;\u61cc\u0100ci\u0557\u055ar;\u6130m;\u6a73a;\u4397ml\u803b\xcb\u40cb\u0100ip\u056a\u056fsts;\u6203onentialE;\u6147\u0280cfios\u0585\u0588\u058d\u05b2\u05ccy;\u4424r;\uc000\ud835\udd09lled\u0253\u0597\0\0\u05a3mallSquare;\u65fcerySmallSquare;\u65aa\u0370\u05ba\0\u05bf\0\0\u05c4f;\uc000\ud835\udd3dAll;\u6200riertrf;\u6131c\xf2\u05cb\u0600JTabcdfgorst\u05e8\u05ec\u05ef\u05fa\u0600\u0612\u0616\u061b\u061d\u0623\u066c\u0672cy;\u4403\u803b>\u403emma\u0100;d\u05f7\u05f8\u4393;\u43dcreve;\u411e\u0180eiy\u0607\u060c\u0610dil;\u4122rc;\u411c;\u4413ot;\u4120r;\uc000\ud835\udd0a;\u62d9pf;\uc000\ud835\udd3eeater\u0300EFGLST\u0635\u0644\u064e\u0656\u065b\u0666qual\u0100;L\u063e\u063f\u6265ess;\u62dbullEqual;\u6267reater;\u6aa2ess;\u6277lantEqual;\u6a7eilde;\u6273cr;\uc000\ud835\udca2;\u626b\u0400Aacfiosu\u0685\u068b\u0696\u069b\u069e\u06aa\u06be\u06caRDcy;\u442a\u0100ct\u0690\u0694ek;\u42c7;\u405eirc;\u4124r;\u610clbertSpace;\u610b\u01f0\u06af\0\u06b2f;\u610dizontalLine;\u6500\u0100ct\u06c3\u06c5\xf2\u06a9rok;\u4126mp\u0144\u06d0\u06d8ownHum\xf0\u012fqual;\u624f\u0700EJOacdfgmnostu\u06fa\u06fe\u0703\u0707\u070e\u071a\u071e\u0721\u0728\u0744\u0778\u078b\u078f\u0795cy;\u4415lig;\u4132cy;\u4401cute\u803b\xcd\u40cd\u0100iy\u0713\u0718rc\u803b\xce\u40ce;\u4418ot;\u4130r;\u6111rave\u803b\xcc\u40cc\u0180;ap\u0720\u072f\u073f\u0100cg\u0734\u0737r;\u412ainaryI;\u6148lie\xf3\u03dd\u01f4\u0749\0\u0762\u0100;e\u074d\u074e\u622c\u0100gr\u0753\u0758ral;\u622bsection;\u62c2isible\u0100CT\u076c\u0772omma;\u6063imes;\u6062\u0180gpt\u077f\u0783\u0788on;\u412ef;\uc000\ud835\udd40a;\u4399cr;\u6110ilde;\u4128\u01eb\u079a\0\u079ecy;\u4406l\u803b\xcf\u40cf\u0280cfosu\u07ac\u07b7\u07bc\u07c2\u07d0\u0100iy\u07b1\u07b5rc;\u4134;\u4419r;\uc000\ud835\udd0dpf;\uc000\ud835\udd41\u01e3\u07c7\0\u07ccr;\uc000\ud835\udca5rcy;\u4408kcy;\u4404\u0380HJacfos\u07e4\u07e8\u07ec\u07f1\u07fd\u0802\u0808cy;\u4425cy;\u440cppa;\u439a\u0100ey\u07f6\u07fbdil;\u4136;\u441ar;\uc000\ud835\udd0epf;\uc000\ud835\udd42cr;\uc000\ud835\udca6\u0580JTaceflmost\u0825\u0829\u082c\u0850\u0863\u09b3\u09b8\u09c7\u09cd\u0a37\u0a47cy;\u4409\u803b<\u403c\u0280cmnpr\u0837\u083c\u0841\u0844\u084dute;\u4139bda;\u439bg;\u67ealacetrf;\u6112r;\u619e\u0180aey\u0857\u085c\u0861ron;\u413ddil;\u413b;\u441b\u0100fs\u0868\u0970t\u0500ACDFRTUVar\u087e\u08a9\u08b1\u08e0\u08e6\u08fc\u092f\u095b\u0390\u096a\u0100nr\u0883\u088fgleBracket;\u67e8row\u0180;BR\u0899\u089a\u089e\u6190ar;\u61e4ightArrow;\u61c6eiling;\u6308o\u01f5\u08b7\0\u08c3bleBracket;\u67e6n\u01d4\u08c8\0\u08d2eeVector;\u6961ector\u0100;B\u08db\u08dc\u61c3ar;\u6959loor;\u630aight\u0100AV\u08ef\u08f5rrow;\u6194ector;\u694e\u0100er\u0901\u0917e\u0180;AV\u0909\u090a\u0910\u62a3rrow;\u61a4ector;\u695aiangle\u0180;BE\u0924\u0925\u0929\u62b2ar;\u69cfqual;\u62b4p\u0180DTV\u0937\u0942\u094cownVector;\u6951eeVector;\u6960ector\u0100;B\u0956\u0957\u61bfar;\u6958ector\u0100;B\u0965\u0966\u61bcar;\u6952ight\xe1\u039cs\u0300EFGLST\u097e\u098b\u0995\u099d\u09a2\u09adqualGreater;\u62daullEqual;\u6266reater;\u6276ess;\u6aa1lantEqual;\u6a7dilde;\u6272r;\uc000\ud835\udd0f\u0100;e\u09bd\u09be\u62d8ftarrow;\u61daidot;\u413f\u0180npw\u09d4\u0a16\u0a1bg\u0200LRlr\u09de\u09f7\u0a02\u0a10eft\u0100AR\u09e6\u09ecrrow;\u67f5ightArrow;\u67f7ightArrow;\u67f6eft\u0100ar\u03b3\u0a0aight\xe1\u03bfight\xe1\u03caf;\uc000\ud835\udd43er\u0100LR\u0a22\u0a2ceftArrow;\u6199ightArrow;\u6198\u0180cht\u0a3e\u0a40\u0a42\xf2\u084c;\u61b0rok;\u4141;\u626a\u0400acefiosu\u0a5a\u0a5d\u0a60\u0a77\u0a7c\u0a85\u0a8b\u0a8ep;\u6905y;\u441c\u0100dl\u0a65\u0a6fiumSpace;\u605flintrf;\u6133r;\uc000\ud835\udd10nusPlus;\u6213pf;\uc000\ud835\udd44c\xf2\u0a76;\u439c\u0480Jacefostu\u0aa3\u0aa7\u0aad\u0ac0\u0b14\u0b19\u0d91\u0d97\u0d9ecy;\u440acute;\u4143\u0180aey\u0ab4\u0ab9\u0aberon;\u4147dil;\u4145;\u441d\u0180gsw\u0ac7\u0af0\u0b0eative\u0180MTV\u0ad3\u0adf\u0ae8ediumSpace;\u600bhi\u0100cn\u0ae6\u0ad8\xeb\u0ad9eryThi\xee\u0ad9ted\u0100GL\u0af8\u0b06reaterGreate\xf2\u0673essLes\xf3\u0a48Line;\u400ar;\uc000\ud835\udd11\u0200Bnpt\u0b22\u0b28\u0b37\u0b3areak;\u6060BreakingSpace;\u40a0f;\u6115\u0680;CDEGHLNPRSTV\u0b55\u0b56\u0b6a\u0b7c\u0ba1\u0beb\u0c04\u0c5e\u0c84\u0ca6\u0cd8\u0d61\u0d85\u6aec\u0100ou\u0b5b\u0b64ngruent;\u6262pCap;\u626doubleVerticalBar;\u6226\u0180lqx\u0b83\u0b8a\u0b9bement;\u6209ual\u0100;T\u0b92\u0b93\u6260ilde;\uc000\u2242\u0338ists;\u6204reater\u0380;EFGLST\u0bb6\u0bb7\u0bbd\u0bc9\u0bd3\u0bd8\u0be5\u626fqual;\u6271ullEqual;\uc000\u2267\u0338reater;\uc000\u226b\u0338ess;\u6279lantEqual;\uc000\u2a7e\u0338ilde;\u6275ump\u0144\u0bf2\u0bfdownHump;\uc000\u224e\u0338qual;\uc000\u224f\u0338e\u0100fs\u0c0a\u0c27tTriangle\u0180;BE\u0c1a\u0c1b\u0c21\u62eaar;\uc000\u29cf\u0338qual;\u62ecs\u0300;EGLST\u0c35\u0c36\u0c3c\u0c44\u0c4b\u0c58\u626equal;\u6270reater;\u6278ess;\uc000\u226a\u0338lantEqual;\uc000\u2a7d\u0338ilde;\u6274ested\u0100GL\u0c68\u0c79reaterGreater;\uc000\u2aa2\u0338essLess;\uc000\u2aa1\u0338recedes\u0180;ES\u0c92\u0c93\u0c9b\u6280qual;\uc000\u2aaf\u0338lantEqual;\u62e0\u0100ei\u0cab\u0cb9verseElement;\u620cghtTriangle\u0180;BE\u0ccb\u0ccc\u0cd2\u62ebar;\uc000\u29d0\u0338qual;\u62ed\u0100qu\u0cdd\u0d0cuareSu\u0100bp\u0ce8\u0cf9set\u0100;E\u0cf0\u0cf3\uc000\u228f\u0338qual;\u62e2erset\u0100;E\u0d03\u0d06\uc000\u2290\u0338qual;\u62e3\u0180bcp\u0d13\u0d24\u0d4eset\u0100;E\u0d1b\u0d1e\uc000\u2282\u20d2qual;\u6288ceeds\u0200;EST\u0d32\u0d33\u0d3b\u0d46\u6281qual;\uc000\u2ab0\u0338lantEqual;\u62e1ilde;\uc000\u227f\u0338erset\u0100;E\u0d58\u0d5b\uc000\u2283\u20d2qual;\u6289ilde\u0200;EFT\u0d6e\u0d6f\u0d75\u0d7f\u6241qual;\u6244ullEqual;\u6247ilde;\u6249erticalBar;\u6224cr;\uc000\ud835\udca9ilde\u803b\xd1\u40d1;\u439d\u0700Eacdfgmoprstuv\u0dbd\u0dc2\u0dc9\u0dd5\u0ddb\u0de0\u0de7\u0dfc\u0e02\u0e20\u0e22\u0e32\u0e3f\u0e44lig;\u4152cute\u803b\xd3\u40d3\u0100iy\u0dce\u0dd3rc\u803b\xd4\u40d4;\u441eblac;\u4150r;\uc000\ud835\udd12rave\u803b\xd2\u40d2\u0180aei\u0dee\u0df2\u0df6cr;\u414cga;\u43a9cron;\u439fpf;\uc000\ud835\udd46enCurly\u0100DQ\u0e0e\u0e1aoubleQuote;\u601cuote;\u6018;\u6a54\u0100cl\u0e27\u0e2cr;\uc000\ud835\udcaaash\u803b\xd8\u40d8i\u016c\u0e37\u0e3cde\u803b\xd5\u40d5es;\u6a37ml\u803b\xd6\u40d6er\u0100BP\u0e4b\u0e60\u0100ar\u0e50\u0e53r;\u603eac\u0100ek\u0e5a\u0e5c;\u63deet;\u63b4arenthesis;\u63dc\u0480acfhilors\u0e7f\u0e87\u0e8a\u0e8f\u0e92\u0e94\u0e9d\u0eb0\u0efcrtialD;\u6202y;\u441fr;\uc000\ud835\udd13i;\u43a6;\u43a0usMinus;\u40b1\u0100ip\u0ea2\u0eadncareplan\xe5\u069df;\u6119\u0200;eio\u0eb9\u0eba\u0ee0\u0ee4\u6abbcedes\u0200;EST\u0ec8\u0ec9\u0ecf\u0eda\u627aqual;\u6aaflantEqual;\u627cilde;\u627eme;\u6033\u0100dp\u0ee9\u0eeeuct;\u620fortion\u0100;a\u0225\u0ef9l;\u621d\u0100ci\u0f01\u0f06r;\uc000\ud835\udcab;\u43a8\u0200Ufos\u0f11\u0f16\u0f1b\u0f1fOT\u803b\"\u4022r;\uc000\ud835\udd14pf;\u611acr;\uc000\ud835\udcac\u0600BEacefhiorsu\u0f3e\u0f43\u0f47\u0f60\u0f73\u0fa7\u0faa\u0fad\u1096\u10a9\u10b4\u10bearr;\u6910G\u803b\xae\u40ae\u0180cnr\u0f4e\u0f53\u0f56ute;\u4154g;\u67ebr\u0100;t\u0f5c\u0f5d\u61a0l;\u6916\u0180aey\u0f67\u0f6c\u0f71ron;\u4158dil;\u4156;\u4420\u0100;v\u0f78\u0f79\u611cerse\u0100EU\u0f82\u0f99\u0100lq\u0f87\u0f8eement;\u620builibrium;\u61cbpEquilibrium;\u696fr\xbb\u0f79o;\u43a1ght\u0400ACDFTUVa\u0fc1\u0feb\u0ff3\u1022\u1028\u105b\u1087\u03d8\u0100nr\u0fc6\u0fd2gleBracket;\u67e9row\u0180;BL\u0fdc\u0fdd\u0fe1\u6192ar;\u61e5eftArrow;\u61c4eiling;\u6309o\u01f5\u0ff9\0\u1005bleBracket;\u67e7n\u01d4\u100a\0\u1014eeVector;\u695dector\u0100;B\u101d\u101e\u61c2ar;\u6955loor;\u630b\u0100er\u102d\u1043e\u0180;AV\u1035\u1036\u103c\u62a2rrow;\u61a6ector;\u695biangle\u0180;BE\u1050\u1051\u1055\u62b3ar;\u69d0qual;\u62b5p\u0180DTV\u1063\u106e\u1078ownVector;\u694feeVector;\u695cector\u0100;B\u1082\u1083\u61bear;\u6954ector\u0100;B\u1091\u1092\u61c0ar;\u6953\u0100pu\u109b\u109ef;\u611dndImplies;\u6970ightarrow;\u61db\u0100ch\u10b9\u10bcr;\u611b;\u61b1leDelayed;\u69f4\u0680HOacfhimoqstu\u10e4\u10f1\u10f7\u10fd\u1119\u111e\u1151\u1156\u1161\u1167\u11b5\u11bb\u11bf\u0100Cc\u10e9\u10eeHcy;\u4429y;\u4428FTcy;\u442ccute;\u415a\u0280;aeiy\u1108\u1109\u110e\u1113\u1117\u6abcron;\u4160dil;\u415erc;\u415c;\u4421r;\uc000\ud835\udd16ort\u0200DLRU\u112a\u1134\u113e\u1149ownArrow\xbb\u041eeftArrow\xbb\u089aightArrow\xbb\u0fddpArrow;\u6191gma;\u43a3allCircle;\u6218pf;\uc000\ud835\udd4a\u0272\u116d\0\0\u1170t;\u621aare\u0200;ISU\u117b\u117c\u1189\u11af\u65a1ntersection;\u6293u\u0100bp\u118f\u119eset\u0100;E\u1197\u1198\u628fqual;\u6291erset\u0100;E\u11a8\u11a9\u6290qual;\u6292nion;\u6294cr;\uc000\ud835\udcaear;\u62c6\u0200bcmp\u11c8\u11db\u1209\u120b\u0100;s\u11cd\u11ce\u62d0et\u0100;E\u11cd\u11d5qual;\u6286\u0100ch\u11e0\u1205eeds\u0200;EST\u11ed\u11ee\u11f4\u11ff\u627bqual;\u6ab0lantEqual;\u627dilde;\u627fTh\xe1\u0f8c;\u6211\u0180;es\u1212\u1213\u1223\u62d1rset\u0100;E\u121c\u121d\u6283qual;\u6287et\xbb\u1213\u0580HRSacfhiors\u123e\u1244\u1249\u1255\u125e\u1271\u1276\u129f\u12c2\u12c8\u12d1ORN\u803b\xde\u40deADE;\u6122\u0100Hc\u124e\u1252cy;\u440by;\u4426\u0100bu\u125a\u125c;\u4009;\u43a4\u0180aey\u1265\u126a\u126fron;\u4164dil;\u4162;\u4422r;\uc000\ud835\udd17\u0100ei\u127b\u1289\u01f2\u1280\0\u1287efore;\u6234a;\u4398\u0100cn\u128e\u1298kSpace;\uc000\u205f\u200aSpace;\u6009lde\u0200;EFT\u12ab\u12ac\u12b2\u12bc\u623cqual;\u6243ullEqual;\u6245ilde;\u6248pf;\uc000\ud835\udd4bipleDot;\u60db\u0100ct\u12d6\u12dbr;\uc000\ud835\udcafrok;\u4166\u0ae1\u12f7\u130e\u131a\u1326\0\u132c\u1331\0\0\0\0\0\u1338\u133d\u1377\u1385\0\u13ff\u1404\u140a\u1410\u0100cr\u12fb\u1301ute\u803b\xda\u40dar\u0100;o\u1307\u1308\u619fcir;\u6949r\u01e3\u1313\0\u1316y;\u440eve;\u416c\u0100iy\u131e\u1323rc\u803b\xdb\u40db;\u4423blac;\u4170r;\uc000\ud835\udd18rave\u803b\xd9\u40d9acr;\u416a\u0100di\u1341\u1369er\u0100BP\u1348\u135d\u0100ar\u134d\u1350r;\u405fac\u0100ek\u1357\u1359;\u63dfet;\u63b5arenthesis;\u63ddon\u0100;P\u1370\u1371\u62c3lus;\u628e\u0100gp\u137b\u137fon;\u4172f;\uc000\ud835\udd4c\u0400ADETadps\u1395\u13ae\u13b8\u13c4\u03e8\u13d2\u13d7\u13f3rrow\u0180;BD\u1150\u13a0\u13a4ar;\u6912ownArrow;\u61c5ownArrow;\u6195quilibrium;\u696eee\u0100;A\u13cb\u13cc\u62a5rrow;\u61a5own\xe1\u03f3er\u0100LR\u13de\u13e8eftArrow;\u6196ightArrow;\u6197i\u0100;l\u13f9\u13fa\u43d2on;\u43a5ing;\u416ecr;\uc000\ud835\udcb0ilde;\u4168ml\u803b\xdc\u40dc\u0480Dbcdefosv\u1427\u142c\u1430\u1433\u143e\u1485\u148a\u1490\u1496ash;\u62abar;\u6aeby;\u4412ash\u0100;l\u143b\u143c\u62a9;\u6ae6\u0100er\u1443\u1445;\u62c1\u0180bty\u144c\u1450\u147aar;\u6016\u0100;i\u144f\u1455cal\u0200BLST\u1461\u1465\u146a\u1474ar;\u6223ine;\u407ceparator;\u6758ilde;\u6240ThinSpace;\u600ar;\uc000\ud835\udd19pf;\uc000\ud835\udd4dcr;\uc000\ud835\udcb1dash;\u62aa\u0280cefos\u14a7\u14ac\u14b1\u14b6\u14bcirc;\u4174dge;\u62c0r;\uc000\ud835\udd1apf;\uc000\ud835\udd4ecr;\uc000\ud835\udcb2\u0200fios\u14cb\u14d0\u14d2\u14d8r;\uc000\ud835\udd1b;\u439epf;\uc000\ud835\udd4fcr;\uc000\ud835\udcb3\u0480AIUacfosu\u14f1\u14f5\u14f9\u14fd\u1504\u150f\u1514\u151a\u1520cy;\u442fcy;\u4407cy;\u442ecute\u803b\xdd\u40dd\u0100iy\u1509\u150drc;\u4176;\u442br;\uc000\ud835\udd1cpf;\uc000\ud835\udd50cr;\uc000\ud835\udcb4ml;\u4178\u0400Hacdefos\u1535\u1539\u153f\u154b\u154f\u155d\u1560\u1564cy;\u4416cute;\u4179\u0100ay\u1544\u1549ron;\u417d;\u4417ot;\u417b\u01f2\u1554\0\u155boWidt\xe8\u0ad9a;\u4396r;\u6128pf;\u6124cr;\uc000\ud835\udcb5\u0be1\u1583\u158a\u1590\0\u15b0\u15b6\u15bf\0\0\0\0\u15c6\u15db\u15eb\u165f\u166d\0\u1695\u169b\u16b2\u16b9\0\u16becute\u803b\xe1\u40e1reve;\u4103\u0300;Ediuy\u159c\u159d\u15a1\u15a3\u15a8\u15ad\u623e;\uc000\u223e\u0333;\u623frc\u803b\xe2\u40e2te\u80bb\xb4\u0306;\u4430lig\u803b\xe6\u40e6\u0100;r\xb2\u15ba;\uc000\ud835\udd1erave\u803b\xe0\u40e0\u0100ep\u15ca\u15d6\u0100fp\u15cf\u15d4sym;\u6135\xe8\u15d3ha;\u43b1\u0100ap\u15dfc\u0100cl\u15e4\u15e7r;\u4101g;\u6a3f\u0264\u15f0\0\0\u160a\u0280;adsv\u15fa\u15fb\u15ff\u1601\u1607\u6227nd;\u6a55;\u6a5clope;\u6a58;\u6a5a\u0380;elmrsz\u1618\u1619\u161b\u161e\u163f\u164f\u1659\u6220;\u69a4e\xbb\u1619sd\u0100;a\u1625\u1626\u6221\u0461\u1630\u1632\u1634\u1636\u1638\u163a\u163c\u163e;\u69a8;\u69a9;\u69aa;\u69ab;\u69ac;\u69ad;\u69ae;\u69aft\u0100;v\u1645\u1646\u621fb\u0100;d\u164c\u164d\u62be;\u699d\u0100pt\u1654\u1657h;\u6222\xbb\xb9arr;\u637c\u0100gp\u1663\u1667on;\u4105f;\uc000\ud835\udd52\u0380;Eaeiop\u12c1\u167b\u167d\u1682\u1684\u1687\u168a;\u6a70cir;\u6a6f;\u624ad;\u624bs;\u4027rox\u0100;e\u12c1\u1692\xf1\u1683ing\u803b\xe5\u40e5\u0180cty\u16a1\u16a6\u16a8r;\uc000\ud835\udcb6;\u402amp\u0100;e\u12c1\u16af\xf1\u0288ilde\u803b\xe3\u40e3ml\u803b\xe4\u40e4\u0100ci\u16c2\u16c8onin\xf4\u0272nt;\u6a11\u0800Nabcdefiklnoprsu\u16ed\u16f1\u1730\u173c\u1743\u1748\u1778\u177d\u17e0\u17e6\u1839\u1850\u170d\u193d\u1948\u1970ot;\u6aed\u0100cr\u16f6\u171ek\u0200ceps\u1700\u1705\u170d\u1713ong;\u624cpsilon;\u43f6rime;\u6035im\u0100;e\u171a\u171b\u623dq;\u62cd\u0176\u1722\u1726ee;\u62bded\u0100;g\u172c\u172d\u6305e\xbb\u172drk\u0100;t\u135c\u1737brk;\u63b6\u0100oy\u1701\u1741;\u4431quo;\u601e\u0280cmprt\u1753\u175b\u1761\u1764\u1768aus\u0100;e\u010a\u0109ptyv;\u69b0s\xe9\u170cno\xf5\u0113\u0180ahw\u176f\u1771\u1773;\u43b2;\u6136een;\u626cr;\uc000\ud835\udd1fg\u0380costuvw\u178d\u179d\u17b3\u17c1\u17d5\u17db\u17de\u0180aiu\u1794\u1796\u179a\xf0\u0760rc;\u65efp\xbb\u1371\u0180dpt\u17a4\u17a8\u17adot;\u6a00lus;\u6a01imes;\u6a02\u0271\u17b9\0\0\u17becup;\u6a06ar;\u6605riangle\u0100du\u17cd\u17d2own;\u65bdp;\u65b3plus;\u6a04e\xe5\u1444\xe5\u14adarow;\u690d\u0180ako\u17ed\u1826\u1835\u0100cn\u17f2\u1823k\u0180lst\u17fa\u05ab\u1802ozenge;\u69ebriangle\u0200;dlr\u1812\u1813\u1818\u181d\u65b4own;\u65beeft;\u65c2ight;\u65b8k;\u6423\u01b1\u182b\0\u1833\u01b2\u182f\0\u1831;\u6592;\u65914;\u6593ck;\u6588\u0100eo\u183e\u184d\u0100;q\u1843\u1846\uc000=\u20e5uiv;\uc000\u2261\u20e5t;\u6310\u0200ptwx\u1859\u185e\u1867\u186cf;\uc000\ud835\udd53\u0100;t\u13cb\u1863om\xbb\u13cctie;\u62c8\u0600DHUVbdhmptuv\u1885\u1896\u18aa\u18bb\u18d7\u18db\u18ec\u18ff\u1905\u190a\u1910\u1921\u0200LRlr\u188e\u1890\u1892\u1894;\u6557;\u6554;\u6556;\u6553\u0280;DUdu\u18a1\u18a2\u18a4\u18a6\u18a8\u6550;\u6566;\u6569;\u6564;\u6567\u0200LRlr\u18b3\u18b5\u18b7\u18b9;\u655d;\u655a;\u655c;\u6559\u0380;HLRhlr\u18ca\u18cb\u18cd\u18cf\u18d1\u18d3\u18d5\u6551;\u656c;\u6563;\u6560;\u656b;\u6562;\u655fox;\u69c9\u0200LRlr\u18e4\u18e6\u18e8\u18ea;\u6555;\u6552;\u6510;\u650c\u0280;DUdu\u06bd\u18f7\u18f9\u18fb\u18fd;\u6565;\u6568;\u652c;\u6534inus;\u629flus;\u629eimes;\u62a0\u0200LRlr\u1919\u191b\u191d\u191f;\u655b;\u6558;\u6518;\u6514\u0380;HLRhlr\u1930\u1931\u1933\u1935\u1937\u1939\u193b\u6502;\u656a;\u6561;\u655e;\u653c;\u6524;\u651c\u0100ev\u0123\u1942bar\u803b\xa6\u40a6\u0200ceio\u1951\u1956\u195a\u1960r;\uc000\ud835\udcb7mi;\u604fm\u0100;e\u171a\u171cl\u0180;bh\u1968\u1969\u196b\u405c;\u69c5sub;\u67c8\u016c\u1974\u197el\u0100;e\u1979\u197a\u6022t\xbb\u197ap\u0180;Ee\u012f\u1985\u1987;\u6aae\u0100;q\u06dc\u06db\u0ce1\u19a7\0\u19e8\u1a11\u1a15\u1a32\0\u1a37\u1a50\0\0\u1ab4\0\0\u1ac1\0\0\u1b21\u1b2e\u1b4d\u1b52\0\u1bfd\0\u1c0c\u0180cpr\u19ad\u19b2\u19ddute;\u4107\u0300;abcds\u19bf\u19c0\u19c4\u19ca\u19d5\u19d9\u6229nd;\u6a44rcup;\u6a49\u0100au\u19cf\u19d2p;\u6a4bp;\u6a47ot;\u6a40;\uc000\u2229\ufe00\u0100eo\u19e2\u19e5t;\u6041\xee\u0693\u0200aeiu\u19f0\u19fb\u1a01\u1a05\u01f0\u19f5\0\u19f8s;\u6a4don;\u410ddil\u803b\xe7\u40e7rc;\u4109ps\u0100;s\u1a0c\u1a0d\u6a4cm;\u6a50ot;\u410b\u0180dmn\u1a1b\u1a20\u1a26il\u80bb\xb8\u01adptyv;\u69b2t\u8100\xa2;e\u1a2d\u1a2e\u40a2r\xe4\u01b2r;\uc000\ud835\udd20\u0180cei\u1a3d\u1a40\u1a4dy;\u4447ck\u0100;m\u1a47\u1a48\u6713ark\xbb\u1a48;\u43c7r\u0380;Ecefms\u1a5f\u1a60\u1a62\u1a6b\u1aa4\u1aaa\u1aae\u65cb;\u69c3\u0180;el\u1a69\u1a6a\u1a6d\u42c6q;\u6257e\u0261\u1a74\0\0\u1a88rrow\u0100lr\u1a7c\u1a81eft;\u61baight;\u61bb\u0280RSacd\u1a92\u1a94\u1a96\u1a9a\u1a9f\xbb\u0f47;\u64c8st;\u629birc;\u629aash;\u629dnint;\u6a10id;\u6aefcir;\u69c2ubs\u0100;u\u1abb\u1abc\u6663it\xbb\u1abc\u02ec\u1ac7\u1ad4\u1afa\0\u1b0aon\u0100;e\u1acd\u1ace\u403a\u0100;q\xc7\xc6\u026d\u1ad9\0\0\u1ae2a\u0100;t\u1ade\u1adf\u402c;\u4040\u0180;fl\u1ae8\u1ae9\u1aeb\u6201\xee\u1160e\u0100mx\u1af1\u1af6ent\xbb\u1ae9e\xf3\u024d\u01e7\u1afe\0\u1b07\u0100;d\u12bb\u1b02ot;\u6a6dn\xf4\u0246\u0180fry\u1b10\u1b14\u1b17;\uc000\ud835\udd54o\xe4\u0254\u8100\xa9;s\u0155\u1b1dr;\u6117\u0100ao\u1b25\u1b29rr;\u61b5ss;\u6717\u0100cu\u1b32\u1b37r;\uc000\ud835\udcb8\u0100bp\u1b3c\u1b44\u0100;e\u1b41\u1b42\u6acf;\u6ad1\u0100;e\u1b49\u1b4a\u6ad0;\u6ad2dot;\u62ef\u0380delprvw\u1b60\u1b6c\u1b77\u1b82\u1bac\u1bd4\u1bf9arr\u0100lr\u1b68\u1b6a;\u6938;\u6935\u0270\u1b72\0\0\u1b75r;\u62dec;\u62dfarr\u0100;p\u1b7f\u1b80\u61b6;\u693d\u0300;bcdos\u1b8f\u1b90\u1b96\u1ba1\u1ba5\u1ba8\u622arcap;\u6a48\u0100au\u1b9b\u1b9ep;\u6a46p;\u6a4aot;\u628dr;\u6a45;\uc000\u222a\ufe00\u0200alrv\u1bb5\u1bbf\u1bde\u1be3rr\u0100;m\u1bbc\u1bbd\u61b7;\u693cy\u0180evw\u1bc7\u1bd4\u1bd8q\u0270\u1bce\0\0\u1bd2re\xe3\u1b73u\xe3\u1b75ee;\u62ceedge;\u62cfen\u803b\xa4\u40a4earrow\u0100lr\u1bee\u1bf3eft\xbb\u1b80ight\xbb\u1bbde\xe4\u1bdd\u0100ci\u1c01\u1c07onin\xf4\u01f7nt;\u6231lcty;\u632d\u0980AHabcdefhijlorstuwz\u1c38\u1c3b\u1c3f\u1c5d\u1c69\u1c75\u1c8a\u1c9e\u1cac\u1cb7\u1cfb\u1cff\u1d0d\u1d7b\u1d91\u1dab\u1dbb\u1dc6\u1dcdr\xf2\u0381ar;\u6965\u0200glrs\u1c48\u1c4d\u1c52\u1c54ger;\u6020eth;\u6138\xf2\u1133h\u0100;v\u1c5a\u1c5b\u6010\xbb\u090a\u016b\u1c61\u1c67arow;\u690fa\xe3\u0315\u0100ay\u1c6e\u1c73ron;\u410f;\u4434\u0180;ao\u0332\u1c7c\u1c84\u0100gr\u02bf\u1c81r;\u61catseq;\u6a77\u0180glm\u1c91\u1c94\u1c98\u803b\xb0\u40b0ta;\u43b4ptyv;\u69b1\u0100ir\u1ca3\u1ca8sht;\u697f;\uc000\ud835\udd21ar\u0100lr\u1cb3\u1cb5\xbb\u08dc\xbb\u101e\u0280aegsv\u1cc2\u0378\u1cd6\u1cdc\u1ce0m\u0180;os\u0326\u1cca\u1cd4nd\u0100;s\u0326\u1cd1uit;\u6666amma;\u43ddin;\u62f2\u0180;io\u1ce7\u1ce8\u1cf8\u40f7de\u8100\xf7;o\u1ce7\u1cf0ntimes;\u62c7n\xf8\u1cf7cy;\u4452c\u026f\u1d06\0\0\u1d0arn;\u631eop;\u630d\u0280lptuw\u1d18\u1d1d\u1d22\u1d49\u1d55lar;\u4024f;\uc000\ud835\udd55\u0280;emps\u030b\u1d2d\u1d37\u1d3d\u1d42q\u0100;d\u0352\u1d33ot;\u6251inus;\u6238lus;\u6214quare;\u62a1blebarwedg\xe5\xfan\u0180adh\u112e\u1d5d\u1d67ownarrow\xf3\u1c83arpoon\u0100lr\u1d72\u1d76ef\xf4\u1cb4igh\xf4\u1cb6\u0162\u1d7f\u1d85karo\xf7\u0f42\u026f\u1d8a\0\0\u1d8ern;\u631fop;\u630c\u0180cot\u1d98\u1da3\u1da6\u0100ry\u1d9d\u1da1;\uc000\ud835\udcb9;\u4455l;\u69f6rok;\u4111\u0100dr\u1db0\u1db4ot;\u62f1i\u0100;f\u1dba\u1816\u65bf\u0100ah\u1dc0\u1dc3r\xf2\u0429a\xf2\u0fa6angle;\u69a6\u0100ci\u1dd2\u1dd5y;\u445fgrarr;\u67ff\u0900Dacdefglmnopqrstux\u1e01\u1e09\u1e19\u1e38\u0578\u1e3c\u1e49\u1e61\u1e7e\u1ea5\u1eaf\u1ebd\u1ee1\u1f2a\u1f37\u1f44\u1f4e\u1f5a\u0100Do\u1e06\u1d34o\xf4\u1c89\u0100cs\u1e0e\u1e14ute\u803b\xe9\u40e9ter;\u6a6e\u0200aioy\u1e22\u1e27\u1e31\u1e36ron;\u411br\u0100;c\u1e2d\u1e2e\u6256\u803b\xea\u40ealon;\u6255;\u444dot;\u4117\u0100Dr\u1e41\u1e45ot;\u6252;\uc000\ud835\udd22\u0180;rs\u1e50\u1e51\u1e57\u6a9aave\u803b\xe8\u40e8\u0100;d\u1e5c\u1e5d\u6a96ot;\u6a98\u0200;ils\u1e6a\u1e6b\u1e72\u1e74\u6a99nters;\u63e7;\u6113\u0100;d\u1e79\u1e7a\u6a95ot;\u6a97\u0180aps\u1e85\u1e89\u1e97cr;\u4113ty\u0180;sv\u1e92\u1e93\u1e95\u6205et\xbb\u1e93p\u01001;\u1e9d\u1ea4\u0133\u1ea1\u1ea3;\u6004;\u6005\u6003\u0100gs\u1eaa\u1eac;\u414bp;\u6002\u0100gp\u1eb4\u1eb8on;\u4119f;\uc000\ud835\udd56\u0180als\u1ec4\u1ece\u1ed2r\u0100;s\u1eca\u1ecb\u62d5l;\u69e3us;\u6a71i\u0180;lv\u1eda\u1edb\u1edf\u43b5on\xbb\u1edb;\u43f5\u0200csuv\u1eea\u1ef3\u1f0b\u1f23\u0100io\u1eef\u1e31rc\xbb\u1e2e\u0269\u1ef9\0\0\u1efb\xed\u0548ant\u0100gl\u1f02\u1f06tr\xbb\u1e5dess\xbb\u1e7a\u0180aei\u1f12\u1f16\u1f1als;\u403dst;\u625fv\u0100;D\u0235\u1f20D;\u6a78parsl;\u69e5\u0100Da\u1f2f\u1f33ot;\u6253rr;\u6971\u0180cdi\u1f3e\u1f41\u1ef8r;\u612fo\xf4\u0352\u0100ah\u1f49\u1f4b;\u43b7\u803b\xf0\u40f0\u0100mr\u1f53\u1f57l\u803b\xeb\u40ebo;\u60ac\u0180cip\u1f61\u1f64\u1f67l;\u4021s\xf4\u056e\u0100eo\u1f6c\u1f74ctatio\xee\u0559nential\xe5\u0579\u09e1\u1f92\0\u1f9e\0\u1fa1\u1fa7\0\0\u1fc6\u1fcc\0\u1fd3\0\u1fe6\u1fea\u2000\0\u2008\u205allingdotse\xf1\u1e44y;\u4444male;\u6640\u0180ilr\u1fad\u1fb3\u1fc1lig;\u8000\ufb03\u0269\u1fb9\0\0\u1fbdg;\u8000\ufb00ig;\u8000\ufb04;\uc000\ud835\udd23lig;\u8000\ufb01lig;\uc000fj\u0180alt\u1fd9\u1fdc\u1fe1t;\u666dig;\u8000\ufb02ns;\u65b1of;\u4192\u01f0\u1fee\0\u1ff3f;\uc000\ud835\udd57\u0100ak\u05bf\u1ff7\u0100;v\u1ffc\u1ffd\u62d4;\u6ad9artint;\u6a0d\u0100ao\u200c\u2055\u0100cs\u2011\u2052\u03b1\u201a\u2030\u2038\u2045\u2048\0\u2050\u03b2\u2022\u2025\u2027\u202a\u202c\0\u202e\u803b\xbd\u40bd;\u6153\u803b\xbc\u40bc;\u6155;\u6159;\u615b\u01b3\u2034\0\u2036;\u6154;\u6156\u02b4\u203e\u2041\0\0\u2043\u803b\xbe\u40be;\u6157;\u615c5;\u6158\u01b6\u204c\0\u204e;\u615a;\u615d8;\u615el;\u6044wn;\u6322cr;\uc000\ud835\udcbb\u0880Eabcdefgijlnorstv\u2082\u2089\u209f\u20a5\u20b0\u20b4\u20f0\u20f5\u20fa\u20ff\u2103\u2112\u2138\u0317\u213e\u2152\u219e\u0100;l\u064d\u2087;\u6a8c\u0180cmp\u2090\u2095\u209dute;\u41f5ma\u0100;d\u209c\u1cda\u43b3;\u6a86reve;\u411f\u0100iy\u20aa\u20aerc;\u411d;\u4433ot;\u4121\u0200;lqs\u063e\u0642\u20bd\u20c9\u0180;qs\u063e\u064c\u20c4lan\xf4\u0665\u0200;cdl\u0665\u20d2\u20d5\u20e5c;\u6aa9ot\u0100;o\u20dc\u20dd\u6a80\u0100;l\u20e2\u20e3\u6a82;\u6a84\u0100;e\u20ea\u20ed\uc000\u22db\ufe00s;\u6a94r;\uc000\ud835\udd24\u0100;g\u0673\u061bmel;\u6137cy;\u4453\u0200;Eaj\u065a\u210c\u210e\u2110;\u6a92;\u6aa5;\u6aa4\u0200Eaes\u211b\u211d\u2129\u2134;\u6269p\u0100;p\u2123\u2124\u6a8arox\xbb\u2124\u0100;q\u212e\u212f\u6a88\u0100;q\u212e\u211bim;\u62e7pf;\uc000\ud835\udd58\u0100ci\u2143\u2146r;\u610am\u0180;el\u066b\u214e\u2150;\u6a8e;\u6a90\u8300>;cdlqr\u05ee\u2160\u216a\u216e\u2173\u2179\u0100ci\u2165\u2167;\u6aa7r;\u6a7aot;\u62d7Par;\u6995uest;\u6a7c\u0280adels\u2184\u216a\u2190\u0656\u219b\u01f0\u2189\0\u218epro\xf8\u209er;\u6978q\u0100lq\u063f\u2196les\xf3\u2088i\xed\u066b\u0100en\u21a3\u21adrtneqq;\uc000\u2269\ufe00\xc5\u21aa\u0500Aabcefkosy\u21c4\u21c7\u21f1\u21f5\u21fa\u2218\u221d\u222f\u2268\u227dr\xf2\u03a0\u0200ilmr\u21d0\u21d4\u21d7\u21dbrs\xf0\u1484f\xbb\u2024il\xf4\u06a9\u0100dr\u21e0\u21e4cy;\u444a\u0180;cw\u08f4\u21eb\u21efir;\u6948;\u61adar;\u610firc;\u4125\u0180alr\u2201\u220e\u2213rts\u0100;u\u2209\u220a\u6665it\xbb\u220alip;\u6026con;\u62b9r;\uc000\ud835\udd25s\u0100ew\u2223\u2229arow;\u6925arow;\u6926\u0280amopr\u223a\u223e\u2243\u225e\u2263rr;\u61fftht;\u623bk\u0100lr\u2249\u2253eftarrow;\u61a9ightarrow;\u61aaf;\uc000\ud835\udd59bar;\u6015\u0180clt\u226f\u2274\u2278r;\uc000\ud835\udcbdas\xe8\u21f4rok;\u4127\u0100bp\u2282\u2287ull;\u6043hen\xbb\u1c5b\u0ae1\u22a3\0\u22aa\0\u22b8\u22c5\u22ce\0\u22d5\u22f3\0\0\u22f8\u2322\u2367\u2362\u237f\0\u2386\u23aa\u23b4cute\u803b\xed\u40ed\u0180;iy\u0771\u22b0\u22b5rc\u803b\xee\u40ee;\u4438\u0100cx\u22bc\u22bfy;\u4435cl\u803b\xa1\u40a1\u0100fr\u039f\u22c9;\uc000\ud835\udd26rave\u803b\xec\u40ec\u0200;ino\u073e\u22dd\u22e9\u22ee\u0100in\u22e2\u22e6nt;\u6a0ct;\u622dfin;\u69dcta;\u6129lig;\u4133\u0180aop\u22fe\u231a\u231d\u0180cgt\u2305\u2308\u2317r;\u412b\u0180elp\u071f\u230f\u2313in\xe5\u078ear\xf4\u0720h;\u4131f;\u62b7ed;\u41b5\u0280;cfot\u04f4\u232c\u2331\u233d\u2341are;\u6105in\u0100;t\u2338\u2339\u621eie;\u69dddo\xf4\u2319\u0280;celp\u0757\u234c\u2350\u235b\u2361al;\u62ba\u0100gr\u2355\u2359er\xf3\u1563\xe3\u234darhk;\u6a17rod;\u6a3c\u0200cgpt\u236f\u2372\u2376\u237by;\u4451on;\u412ff;\uc000\ud835\udd5aa;\u43b9uest\u803b\xbf\u40bf\u0100ci\u238a\u238fr;\uc000\ud835\udcben\u0280;Edsv\u04f4\u239b\u239d\u23a1\u04f3;\u62f9ot;\u62f5\u0100;v\u23a6\u23a7\u62f4;\u62f3\u0100;i\u0777\u23aelde;\u4129\u01eb\u23b8\0\u23bccy;\u4456l\u803b\xef\u40ef\u0300cfmosu\u23cc\u23d7\u23dc\u23e1\u23e7\u23f5\u0100iy\u23d1\u23d5rc;\u4135;\u4439r;\uc000\ud835\udd27ath;\u4237pf;\uc000\ud835\udd5b\u01e3\u23ec\0\u23f1r;\uc000\ud835\udcbfrcy;\u4458kcy;\u4454\u0400acfghjos\u240b\u2416\u2422\u2427\u242d\u2431\u2435\u243bppa\u0100;v\u2413\u2414\u43ba;\u43f0\u0100ey\u241b\u2420dil;\u4137;\u443ar;\uc000\ud835\udd28reen;\u4138cy;\u4445cy;\u445cpf;\uc000\ud835\udd5ccr;\uc000\ud835\udcc0\u0b80ABEHabcdefghjlmnoprstuv\u2470\u2481\u2486\u248d\u2491\u250e\u253d\u255a\u2580\u264e\u265e\u2665\u2679\u267d\u269a\u26b2\u26d8\u275d\u2768\u278b\u27c0\u2801\u2812\u0180art\u2477\u247a\u247cr\xf2\u09c6\xf2\u0395ail;\u691barr;\u690e\u0100;g\u0994\u248b;\u6a8bar;\u6962\u0963\u24a5\0\u24aa\0\u24b1\0\0\0\0\0\u24b5\u24ba\0\u24c6\u24c8\u24cd\0\u24f9ute;\u413amptyv;\u69b4ra\xee\u084cbda;\u43bbg\u0180;dl\u088e\u24c1\u24c3;\u6991\xe5\u088e;\u6a85uo\u803b\xab\u40abr\u0400;bfhlpst\u0899\u24de\u24e6\u24e9\u24eb\u24ee\u24f1\u24f5\u0100;f\u089d\u24e3s;\u691fs;\u691d\xeb\u2252p;\u61abl;\u6939im;\u6973l;\u61a2\u0180;ae\u24ff\u2500\u2504\u6aabil;\u6919\u0100;s\u2509\u250a\u6aad;\uc000\u2aad\ufe00\u0180abr\u2515\u2519\u251drr;\u690crk;\u6772\u0100ak\u2522\u252cc\u0100ek\u2528\u252a;\u407b;\u405b\u0100es\u2531\u2533;\u698bl\u0100du\u2539\u253b;\u698f;\u698d\u0200aeuy\u2546\u254b\u2556\u2558ron;\u413e\u0100di\u2550\u2554il;\u413c\xec\u08b0\xe2\u2529;\u443b\u0200cqrs\u2563\u2566\u256d\u257da;\u6936uo\u0100;r\u0e19\u1746\u0100du\u2572\u2577har;\u6967shar;\u694bh;\u61b2\u0280;fgqs\u258b\u258c\u0989\u25f3\u25ff\u6264t\u0280ahlrt\u2598\u25a4\u25b7\u25c2\u25e8rrow\u0100;t\u0899\u25a1a\xe9\u24f6arpoon\u0100du\u25af\u25b4own\xbb\u045ap\xbb\u0966eftarrows;\u61c7ight\u0180ahs\u25cd\u25d6\u25derrow\u0100;s\u08f4\u08a7arpoon\xf3\u0f98quigarro\xf7\u21f0hreetimes;\u62cb\u0180;qs\u258b\u0993\u25falan\xf4\u09ac\u0280;cdgs\u09ac\u260a\u260d\u261d\u2628c;\u6aa8ot\u0100;o\u2614\u2615\u6a7f\u0100;r\u261a\u261b\u6a81;\u6a83\u0100;e\u2622\u2625\uc000\u22da\ufe00s;\u6a93\u0280adegs\u2633\u2639\u263d\u2649\u264bppro\xf8\u24c6ot;\u62d6q\u0100gq\u2643\u2645\xf4\u0989gt\xf2\u248c\xf4\u099bi\xed\u09b2\u0180ilr\u2655\u08e1\u265asht;\u697c;\uc000\ud835\udd29\u0100;E\u099c\u2663;\u6a91\u0161\u2669\u2676r\u0100du\u25b2\u266e\u0100;l\u0965\u2673;\u696alk;\u6584cy;\u4459\u0280;acht\u0a48\u2688\u268b\u2691\u2696r\xf2\u25c1orne\xf2\u1d08ard;\u696bri;\u65fa\u0100io\u269f\u26a4dot;\u4140ust\u0100;a\u26ac\u26ad\u63b0che\xbb\u26ad\u0200Eaes\u26bb\u26bd\u26c9\u26d4;\u6268p\u0100;p\u26c3\u26c4\u6a89rox\xbb\u26c4\u0100;q\u26ce\u26cf\u6a87\u0100;q\u26ce\u26bbim;\u62e6\u0400abnoptwz\u26e9\u26f4\u26f7\u271a\u272f\u2741\u2747\u2750\u0100nr\u26ee\u26f1g;\u67ecr;\u61fdr\xeb\u08c1g\u0180lmr\u26ff\u270d\u2714eft\u0100ar\u09e6\u2707ight\xe1\u09f2apsto;\u67fcight\xe1\u09fdparrow\u0100lr\u2725\u2729ef\xf4\u24edight;\u61ac\u0180afl\u2736\u2739\u273dr;\u6985;\uc000\ud835\udd5dus;\u6a2dimes;\u6a34\u0161\u274b\u274fst;\u6217\xe1\u134e\u0180;ef\u2757\u2758\u1800\u65cange\xbb\u2758ar\u0100;l\u2764\u2765\u4028t;\u6993\u0280achmt\u2773\u2776\u277c\u2785\u2787r\xf2\u08a8orne\xf2\u1d8car\u0100;d\u0f98\u2783;\u696d;\u600eri;\u62bf\u0300achiqt\u2798\u279d\u0a40\u27a2\u27ae\u27bbquo;\u6039r;\uc000\ud835\udcc1m\u0180;eg\u09b2\u27aa\u27ac;\u6a8d;\u6a8f\u0100bu\u252a\u27b3o\u0100;r\u0e1f\u27b9;\u601arok;\u4142\u8400<;cdhilqr\u082b\u27d2\u2639\u27dc\u27e0\u27e5\u27ea\u27f0\u0100ci\u27d7\u27d9;\u6aa6r;\u6a79re\xe5\u25f2mes;\u62c9arr;\u6976uest;\u6a7b\u0100Pi\u27f5\u27f9ar;\u6996\u0180;ef\u2800\u092d\u181b\u65c3r\u0100du\u2807\u280dshar;\u694ahar;\u6966\u0100en\u2817\u2821rtneqq;\uc000\u2268\ufe00\xc5\u281e\u0700Dacdefhilnopsu\u2840\u2845\u2882\u288e\u2893\u28a0\u28a5\u28a8\u28da\u28e2\u28e4\u0a83\u28f3\u2902Dot;\u623a\u0200clpr\u284e\u2852\u2863\u287dr\u803b\xaf\u40af\u0100et\u2857\u2859;\u6642\u0100;e\u285e\u285f\u6720se\xbb\u285f\u0100;s\u103b\u2868to\u0200;dlu\u103b\u2873\u2877\u287bow\xee\u048cef\xf4\u090f\xf0\u13d1ker;\u65ae\u0100oy\u2887\u288cmma;\u6a29;\u443cash;\u6014asuredangle\xbb\u1626r;\uc000\ud835\udd2ao;\u6127\u0180cdn\u28af\u28b4\u28c9ro\u803b\xb5\u40b5\u0200;acd\u1464\u28bd\u28c0\u28c4s\xf4\u16a7ir;\u6af0ot\u80bb\xb7\u01b5us\u0180;bd\u28d2\u1903\u28d3\u6212\u0100;u\u1d3c\u28d8;\u6a2a\u0163\u28de\u28e1p;\u6adb\xf2\u2212\xf0\u0a81\u0100dp\u28e9\u28eeels;\u62a7f;\uc000\ud835\udd5e\u0100ct\u28f8\u28fdr;\uc000\ud835\udcc2pos\xbb\u159d\u0180;lm\u2909\u290a\u290d\u43bctimap;\u62b8\u0c00GLRVabcdefghijlmoprstuvw\u2942\u2953\u297e\u2989\u2998\u29da\u29e9\u2a15\u2a1a\u2a58\u2a5d\u2a83\u2a95\u2aa4\u2aa8\u2b04\u2b07\u2b44\u2b7f\u2bae\u2c34\u2c67\u2c7c\u2ce9\u0100gt\u2947\u294b;\uc000\u22d9\u0338\u0100;v\u2950\u0bcf\uc000\u226b\u20d2\u0180elt\u295a\u2972\u2976ft\u0100ar\u2961\u2967rrow;\u61cdightarrow;\u61ce;\uc000\u22d8\u0338\u0100;v\u297b\u0c47\uc000\u226a\u20d2ightarrow;\u61cf\u0100Dd\u298e\u2993ash;\u62afash;\u62ae\u0280bcnpt\u29a3\u29a7\u29ac\u29b1\u29ccla\xbb\u02deute;\u4144g;\uc000\u2220\u20d2\u0280;Eiop\u0d84\u29bc\u29c0\u29c5\u29c8;\uc000\u2a70\u0338d;\uc000\u224b\u0338s;\u4149ro\xf8\u0d84ur\u0100;a\u29d3\u29d4\u666el\u0100;s\u29d3\u0b38\u01f3\u29df\0\u29e3p\u80bb\xa0\u0b37mp\u0100;e\u0bf9\u0c00\u0280aeouy\u29f4\u29fe\u2a03\u2a10\u2a13\u01f0\u29f9\0\u29fb;\u6a43on;\u4148dil;\u4146ng\u0100;d\u0d7e\u2a0aot;\uc000\u2a6d\u0338p;\u6a42;\u443dash;\u6013\u0380;Aadqsx\u0b92\u2a29\u2a2d\u2a3b\u2a41\u2a45\u2a50rr;\u61d7r\u0100hr\u2a33\u2a36k;\u6924\u0100;o\u13f2\u13f0ot;\uc000\u2250\u0338ui\xf6\u0b63\u0100ei\u2a4a\u2a4ear;\u6928\xed\u0b98ist\u0100;s\u0ba0\u0b9fr;\uc000\ud835\udd2b\u0200Eest\u0bc5\u2a66\u2a79\u2a7c\u0180;qs\u0bbc\u2a6d\u0be1\u0180;qs\u0bbc\u0bc5\u2a74lan\xf4\u0be2i\xed\u0bea\u0100;r\u0bb6\u2a81\xbb\u0bb7\u0180Aap\u2a8a\u2a8d\u2a91r\xf2\u2971rr;\u61aear;\u6af2\u0180;sv\u0f8d\u2a9c\u0f8c\u0100;d\u2aa1\u2aa2\u62fc;\u62facy;\u445a\u0380AEadest\u2ab7\u2aba\u2abe\u2ac2\u2ac5\u2af6\u2af9r\xf2\u2966;\uc000\u2266\u0338rr;\u619ar;\u6025\u0200;fqs\u0c3b\u2ace\u2ae3\u2aeft\u0100ar\u2ad4\u2ad9rro\xf7\u2ac1ightarro\xf7\u2a90\u0180;qs\u0c3b\u2aba\u2aealan\xf4\u0c55\u0100;s\u0c55\u2af4\xbb\u0c36i\xed\u0c5d\u0100;r\u0c35\u2afei\u0100;e\u0c1a\u0c25i\xe4\u0d90\u0100pt\u2b0c\u2b11f;\uc000\ud835\udd5f\u8180\xac;in\u2b19\u2b1a\u2b36\u40acn\u0200;Edv\u0b89\u2b24\u2b28\u2b2e;\uc000\u22f9\u0338ot;\uc000\u22f5\u0338\u01e1\u0b89\u2b33\u2b35;\u62f7;\u62f6i\u0100;v\u0cb8\u2b3c\u01e1\u0cb8\u2b41\u2b43;\u62fe;\u62fd\u0180aor\u2b4b\u2b63\u2b69r\u0200;ast\u0b7b\u2b55\u2b5a\u2b5flle\xec\u0b7bl;\uc000\u2afd\u20e5;\uc000\u2202\u0338lint;\u6a14\u0180;ce\u0c92\u2b70\u2b73u\xe5\u0ca5\u0100;c\u0c98\u2b78\u0100;e\u0c92\u2b7d\xf1\u0c98\u0200Aait\u2b88\u2b8b\u2b9d\u2ba7r\xf2\u2988rr\u0180;cw\u2b94\u2b95\u2b99\u619b;\uc000\u2933\u0338;\uc000\u219d\u0338ghtarrow\xbb\u2b95ri\u0100;e\u0ccb\u0cd6\u0380chimpqu\u2bbd\u2bcd\u2bd9\u2b04\u0b78\u2be4\u2bef\u0200;cer\u0d32\u2bc6\u0d37\u2bc9u\xe5\u0d45;\uc000\ud835\udcc3ort\u026d\u2b05\0\0\u2bd6ar\xe1\u2b56m\u0100;e\u0d6e\u2bdf\u0100;q\u0d74\u0d73su\u0100bp\u2beb\u2bed\xe5\u0cf8\xe5\u0d0b\u0180bcp\u2bf6\u2c11\u2c19\u0200;Ees\u2bff\u2c00\u0d22\u2c04\u6284;\uc000\u2ac5\u0338et\u0100;e\u0d1b\u2c0bq\u0100;q\u0d23\u2c00c\u0100;e\u0d32\u2c17\xf1\u0d38\u0200;Ees\u2c22\u2c23\u0d5f\u2c27\u6285;\uc000\u2ac6\u0338et\u0100;e\u0d58\u2c2eq\u0100;q\u0d60\u2c23\u0200gilr\u2c3d\u2c3f\u2c45\u2c47\xec\u0bd7lde\u803b\xf1\u40f1\xe7\u0c43iangle\u0100lr\u2c52\u2c5ceft\u0100;e\u0c1a\u2c5a\xf1\u0c26ight\u0100;e\u0ccb\u2c65\xf1\u0cd7\u0100;m\u2c6c\u2c6d\u43bd\u0180;es\u2c74\u2c75\u2c79\u4023ro;\u6116p;\u6007\u0480DHadgilrs\u2c8f\u2c94\u2c99\u2c9e\u2ca3\u2cb0\u2cb6\u2cd3\u2ce3ash;\u62adarr;\u6904p;\uc000\u224d\u20d2ash;\u62ac\u0100et\u2ca8\u2cac;\uc000\u2265\u20d2;\uc000>\u20d2nfin;\u69de\u0180Aet\u2cbd\u2cc1\u2cc5rr;\u6902;\uc000\u2264\u20d2\u0100;r\u2cca\u2ccd\uc000<\u20d2ie;\uc000\u22b4\u20d2\u0100At\u2cd8\u2cdcrr;\u6903rie;\uc000\u22b5\u20d2im;\uc000\u223c\u20d2\u0180Aan\u2cf0\u2cf4\u2d02rr;\u61d6r\u0100hr\u2cfa\u2cfdk;\u6923\u0100;o\u13e7\u13e5ear;\u6927\u1253\u1a95\0\0\0\0\0\0\0\0\0\0\0\0\0\u2d2d\0\u2d38\u2d48\u2d60\u2d65\u2d72\u2d84\u1b07\0\0\u2d8d\u2dab\0\u2dc8\u2dce\0\u2ddc\u2e19\u2e2b\u2e3e\u2e43\u0100cs\u2d31\u1a97ute\u803b\xf3\u40f3\u0100iy\u2d3c\u2d45r\u0100;c\u1a9e\u2d42\u803b\xf4\u40f4;\u443e\u0280abios\u1aa0\u2d52\u2d57\u01c8\u2d5alac;\u4151v;\u6a38old;\u69bclig;\u4153\u0100cr\u2d69\u2d6dir;\u69bf;\uc000\ud835\udd2c\u036f\u2d79\0\0\u2d7c\0\u2d82n;\u42dbave\u803b\xf2\u40f2;\u69c1\u0100bm\u2d88\u0df4ar;\u69b5\u0200acit\u2d95\u2d98\u2da5\u2da8r\xf2\u1a80\u0100ir\u2d9d\u2da0r;\u69beoss;\u69bbn\xe5\u0e52;\u69c0\u0180aei\u2db1\u2db5\u2db9cr;\u414dga;\u43c9\u0180cdn\u2dc0\u2dc5\u01cdron;\u43bf;\u69b6pf;\uc000\ud835\udd60\u0180ael\u2dd4\u2dd7\u01d2r;\u69b7rp;\u69b9\u0380;adiosv\u2dea\u2deb\u2dee\u2e08\u2e0d\u2e10\u2e16\u6228r\xf2\u1a86\u0200;efm\u2df7\u2df8\u2e02\u2e05\u6a5dr\u0100;o\u2dfe\u2dff\u6134f\xbb\u2dff\u803b\xaa\u40aa\u803b\xba\u40bagof;\u62b6r;\u6a56lope;\u6a57;\u6a5b\u0180clo\u2e1f\u2e21\u2e27\xf2\u2e01ash\u803b\xf8\u40f8l;\u6298i\u016c\u2e2f\u2e34de\u803b\xf5\u40f5es\u0100;a\u01db\u2e3as;\u6a36ml\u803b\xf6\u40f6bar;\u633d\u0ae1\u2e5e\0\u2e7d\0\u2e80\u2e9d\0\u2ea2\u2eb9\0\0\u2ecb\u0e9c\0\u2f13\0\0\u2f2b\u2fbc\0\u2fc8r\u0200;ast\u0403\u2e67\u2e72\u0e85\u8100\xb6;l\u2e6d\u2e6e\u40b6le\xec\u0403\u0269\u2e78\0\0\u2e7bm;\u6af3;\u6afdy;\u443fr\u0280cimpt\u2e8b\u2e8f\u2e93\u1865\u2e97nt;\u4025od;\u402eil;\u6030enk;\u6031r;\uc000\ud835\udd2d\u0180imo\u2ea8\u2eb0\u2eb4\u0100;v\u2ead\u2eae\u43c6;\u43d5ma\xf4\u0a76ne;\u660e\u0180;tv\u2ebf\u2ec0\u2ec8\u43c0chfork\xbb\u1ffd;\u43d6\u0100au\u2ecf\u2edfn\u0100ck\u2ed5\u2eddk\u0100;h\u21f4\u2edb;\u610e\xf6\u21f4s\u0480;abcdemst\u2ef3\u2ef4\u1908\u2ef9\u2efd\u2f04\u2f06\u2f0a\u2f0e\u402bcir;\u6a23ir;\u6a22\u0100ou\u1d40\u2f02;\u6a25;\u6a72n\u80bb\xb1\u0e9dim;\u6a26wo;\u6a27\u0180ipu\u2f19\u2f20\u2f25ntint;\u6a15f;\uc000\ud835\udd61nd\u803b\xa3\u40a3\u0500;Eaceinosu\u0ec8\u2f3f\u2f41\u2f44\u2f47\u2f81\u2f89\u2f92\u2f7e\u2fb6;\u6ab3p;\u6ab7u\xe5\u0ed9\u0100;c\u0ece\u2f4c\u0300;acens\u0ec8\u2f59\u2f5f\u2f66\u2f68\u2f7eppro\xf8\u2f43urlye\xf1\u0ed9\xf1\u0ece\u0180aes\u2f6f\u2f76\u2f7approx;\u6ab9qq;\u6ab5im;\u62e8i\xed\u0edfme\u0100;s\u2f88\u0eae\u6032\u0180Eas\u2f78\u2f90\u2f7a\xf0\u2f75\u0180dfp\u0eec\u2f99\u2faf\u0180als\u2fa0\u2fa5\u2faalar;\u632eine;\u6312urf;\u6313\u0100;t\u0efb\u2fb4\xef\u0efbrel;\u62b0\u0100ci\u2fc0\u2fc5r;\uc000\ud835\udcc5;\u43c8ncsp;\u6008\u0300fiopsu\u2fda\u22e2\u2fdf\u2fe5\u2feb\u2ff1r;\uc000\ud835\udd2epf;\uc000\ud835\udd62rime;\u6057cr;\uc000\ud835\udcc6\u0180aeo\u2ff8\u3009\u3013t\u0100ei\u2ffe\u3005rnion\xf3\u06b0nt;\u6a16st\u0100;e\u3010\u3011\u403f\xf1\u1f19\xf4\u0f14\u0a80ABHabcdefhilmnoprstux\u3040\u3051\u3055\u3059\u30e0\u310e\u312b\u3147\u3162\u3172\u318e\u3206\u3215\u3224\u3229\u3258\u326e\u3272\u3290\u32b0\u32b7\u0180art\u3047\u304a\u304cr\xf2\u10b3\xf2\u03ddail;\u691car\xf2\u1c65ar;\u6964\u0380cdenqrt\u3068\u3075\u3078\u307f\u308f\u3094\u30cc\u0100eu\u306d\u3071;\uc000\u223d\u0331te;\u4155i\xe3\u116emptyv;\u69b3g\u0200;del\u0fd1\u3089\u308b\u308d;\u6992;\u69a5\xe5\u0fd1uo\u803b\xbb\u40bbr\u0580;abcfhlpstw\u0fdc\u30ac\u30af\u30b7\u30b9\u30bc\u30be\u30c0\u30c3\u30c7\u30cap;\u6975\u0100;f\u0fe0\u30b4s;\u6920;\u6933s;\u691e\xeb\u225d\xf0\u272el;\u6945im;\u6974l;\u61a3;\u619d\u0100ai\u30d1\u30d5il;\u691ao\u0100;n\u30db\u30dc\u6236al\xf3\u0f1e\u0180abr\u30e7\u30ea\u30eer\xf2\u17e5rk;\u6773\u0100ak\u30f3\u30fdc\u0100ek\u30f9\u30fb;\u407d;\u405d\u0100es\u3102\u3104;\u698cl\u0100du\u310a\u310c;\u698e;\u6990\u0200aeuy\u3117\u311c\u3127\u3129ron;\u4159\u0100di\u3121\u3125il;\u4157\xec\u0ff2\xe2\u30fa;\u4440\u0200clqs\u3134\u3137\u313d\u3144a;\u6937dhar;\u6969uo\u0100;r\u020e\u020dh;\u61b3\u0180acg\u314e\u315f\u0f44l\u0200;ips\u0f78\u3158\u315b\u109cn\xe5\u10bbar\xf4\u0fa9t;\u65ad\u0180ilr\u3169\u1023\u316esht;\u697d;\uc000\ud835\udd2f\u0100ao\u3177\u3186r\u0100du\u317d\u317f\xbb\u047b\u0100;l\u1091\u3184;\u696c\u0100;v\u318b\u318c\u43c1;\u43f1\u0180gns\u3195\u31f9\u31fcht\u0300ahlrst\u31a4\u31b0\u31c2\u31d8\u31e4\u31eerrow\u0100;t\u0fdc\u31ada\xe9\u30c8arpoon\u0100du\u31bb\u31bfow\xee\u317ep\xbb\u1092eft\u0100ah\u31ca\u31d0rrow\xf3\u0feaarpoon\xf3\u0551ightarrows;\u61c9quigarro\xf7\u30cbhreetimes;\u62ccg;\u42daingdotse\xf1\u1f32\u0180ahm\u320d\u3210\u3213r\xf2\u0feaa\xf2\u0551;\u600foust\u0100;a\u321e\u321f\u63b1che\xbb\u321fmid;\u6aee\u0200abpt\u3232\u323d\u3240\u3252\u0100nr\u3237\u323ag;\u67edr;\u61fer\xeb\u1003\u0180afl\u3247\u324a\u324er;\u6986;\uc000\ud835\udd63us;\u6a2eimes;\u6a35\u0100ap\u325d\u3267r\u0100;g\u3263\u3264\u4029t;\u6994olint;\u6a12ar\xf2\u31e3\u0200achq\u327b\u3280\u10bc\u3285quo;\u603ar;\uc000\ud835\udcc7\u0100bu\u30fb\u328ao\u0100;r\u0214\u0213\u0180hir\u3297\u329b\u32a0re\xe5\u31f8mes;\u62cai\u0200;efl\u32aa\u1059\u1821\u32ab\u65b9tri;\u69celuhar;\u6968;\u611e\u0d61\u32d5\u32db\u32df\u332c\u3338\u3371\0\u337a\u33a4\0\0\u33ec\u33f0\0\u3428\u3448\u345a\u34ad\u34b1\u34ca\u34f1\0\u3616\0\0\u3633cute;\u415bqu\xef\u27ba\u0500;Eaceinpsy\u11ed\u32f3\u32f5\u32ff\u3302\u330b\u330f\u331f\u3326\u3329;\u6ab4\u01f0\u32fa\0\u32fc;\u6ab8on;\u4161u\xe5\u11fe\u0100;d\u11f3\u3307il;\u415frc;\u415d\u0180Eas\u3316\u3318\u331b;\u6ab6p;\u6abaim;\u62e9olint;\u6a13i\xed\u1204;\u4441ot\u0180;be\u3334\u1d47\u3335\u62c5;\u6a66\u0380Aacmstx\u3346\u334a\u3357\u335b\u335e\u3363\u336drr;\u61d8r\u0100hr\u3350\u3352\xeb\u2228\u0100;o\u0a36\u0a34t\u803b\xa7\u40a7i;\u403bwar;\u6929m\u0100in\u3369\xf0nu\xf3\xf1t;\u6736r\u0100;o\u3376\u2055\uc000\ud835\udd30\u0200acoy\u3382\u3386\u3391\u33a0rp;\u666f\u0100hy\u338b\u338fcy;\u4449;\u4448rt\u026d\u3399\0\0\u339ci\xe4\u1464ara\xec\u2e6f\u803b\xad\u40ad\u0100gm\u33a8\u33b4ma\u0180;fv\u33b1\u33b2\u33b2\u43c3;\u43c2\u0400;deglnpr\u12ab\u33c5\u33c9\u33ce\u33d6\u33de\u33e1\u33e6ot;\u6a6a\u0100;q\u12b1\u12b0\u0100;E\u33d3\u33d4\u6a9e;\u6aa0\u0100;E\u33db\u33dc\u6a9d;\u6a9fe;\u6246lus;\u6a24arr;\u6972ar\xf2\u113d\u0200aeit\u33f8\u3408\u340f\u3417\u0100ls\u33fd\u3404lsetm\xe9\u336ahp;\u6a33parsl;\u69e4\u0100dl\u1463\u3414e;\u6323\u0100;e\u341c\u341d\u6aaa\u0100;s\u3422\u3423\u6aac;\uc000\u2aac\ufe00\u0180flp\u342e\u3433\u3442tcy;\u444c\u0100;b\u3438\u3439\u402f\u0100;a\u343e\u343f\u69c4r;\u633ff;\uc000\ud835\udd64a\u0100dr\u344d\u0402es\u0100;u\u3454\u3455\u6660it\xbb\u3455\u0180csu\u3460\u3479\u349f\u0100au\u3465\u346fp\u0100;s\u1188\u346b;\uc000\u2293\ufe00p\u0100;s\u11b4\u3475;\uc000\u2294\ufe00u\u0100bp\u347f\u348f\u0180;es\u1197\u119c\u3486et\u0100;e\u1197\u348d\xf1\u119d\u0180;es\u11a8\u11ad\u3496et\u0100;e\u11a8\u349d\xf1\u11ae\u0180;af\u117b\u34a6\u05b0r\u0165\u34ab\u05b1\xbb\u117car\xf2\u1148\u0200cemt\u34b9\u34be\u34c2\u34c5r;\uc000\ud835\udcc8tm\xee\xf1i\xec\u3415ar\xe6\u11be\u0100ar\u34ce\u34d5r\u0100;f\u34d4\u17bf\u6606\u0100an\u34da\u34edight\u0100ep\u34e3\u34eapsilo\xee\u1ee0h\xe9\u2eafs\xbb\u2852\u0280bcmnp\u34fb\u355e\u1209\u358b\u358e\u0480;Edemnprs\u350e\u350f\u3511\u3515\u351e\u3523\u352c\u3531\u3536\u6282;\u6ac5ot;\u6abd\u0100;d\u11da\u351aot;\u6ac3ult;\u6ac1\u0100Ee\u3528\u352a;\u6acb;\u628alus;\u6abfarr;\u6979\u0180eiu\u353d\u3552\u3555t\u0180;en\u350e\u3545\u354bq\u0100;q\u11da\u350feq\u0100;q\u352b\u3528m;\u6ac7\u0100bp\u355a\u355c;\u6ad5;\u6ad3c\u0300;acens\u11ed\u356c\u3572\u3579\u357b\u3326ppro\xf8\u32faurlye\xf1\u11fe\xf1\u11f3\u0180aes\u3582\u3588\u331bppro\xf8\u331aq\xf1\u3317g;\u666a\u0680123;Edehlmnps\u35a9\u35ac\u35af\u121c\u35b2\u35b4\u35c0\u35c9\u35d5\u35da\u35df\u35e8\u35ed\u803b\xb9\u40b9\u803b\xb2\u40b2\u803b\xb3\u40b3;\u6ac6\u0100os\u35b9\u35bct;\u6abeub;\u6ad8\u0100;d\u1222\u35c5ot;\u6ac4s\u0100ou\u35cf\u35d2l;\u67c9b;\u6ad7arr;\u697bult;\u6ac2\u0100Ee\u35e4\u35e6;\u6acc;\u628blus;\u6ac0\u0180eiu\u35f4\u3609\u360ct\u0180;en\u121c\u35fc\u3602q\u0100;q\u1222\u35b2eq\u0100;q\u35e7\u35e4m;\u6ac8\u0100bp\u3611\u3613;\u6ad4;\u6ad6\u0180Aan\u361c\u3620\u362drr;\u61d9r\u0100hr\u3626\u3628\xeb\u222e\u0100;o\u0a2b\u0a29war;\u692alig\u803b\xdf\u40df\u0be1\u3651\u365d\u3660\u12ce\u3673\u3679\0\u367e\u36c2\0\0\0\0\0\u36db\u3703\0\u3709\u376c\0\0\0\u3787\u0272\u3656\0\0\u365bget;\u6316;\u43c4r\xeb\u0e5f\u0180aey\u3666\u366b\u3670ron;\u4165dil;\u4163;\u4442lrec;\u6315r;\uc000\ud835\udd31\u0200eiko\u3686\u369d\u36b5\u36bc\u01f2\u368b\0\u3691e\u01004f\u1284\u1281a\u0180;sv\u3698\u3699\u369b\u43b8ym;\u43d1\u0100cn\u36a2\u36b2k\u0100as\u36a8\u36aeppro\xf8\u12c1im\xbb\u12acs\xf0\u129e\u0100as\u36ba\u36ae\xf0\u12c1rn\u803b\xfe\u40fe\u01ec\u031f\u36c6\u22e7es\u8180\xd7;bd\u36cf\u36d0\u36d8\u40d7\u0100;a\u190f\u36d5r;\u6a31;\u6a30\u0180eps\u36e1\u36e3\u3700\xe1\u2a4d\u0200;bcf\u0486\u36ec\u36f0\u36f4ot;\u6336ir;\u6af1\u0100;o\u36f9\u36fc\uc000\ud835\udd65rk;\u6ada\xe1\u3362rime;\u6034\u0180aip\u370f\u3712\u3764d\xe5\u1248\u0380adempst\u3721\u374d\u3740\u3751\u3757\u375c\u375fngle\u0280;dlqr\u3730\u3731\u3736\u3740\u3742\u65b5own\xbb\u1dbbeft\u0100;e\u2800\u373e\xf1\u092e;\u625cight\u0100;e\u32aa\u374b\xf1\u105aot;\u65ecinus;\u6a3alus;\u6a39b;\u69cdime;\u6a3bezium;\u63e2\u0180cht\u3772\u377d\u3781\u0100ry\u3777\u377b;\uc000\ud835\udcc9;\u4446cy;\u445brok;\u4167\u0100io\u378b\u378ex\xf4\u1777head\u0100lr\u3797\u37a0eftarro\xf7\u084fightarrow\xbb\u0f5d\u0900AHabcdfghlmoprstuw\u37d0\u37d3\u37d7\u37e4\u37f0\u37fc\u380e\u381c\u3823\u3834\u3851\u385d\u386b\u38a9\u38cc\u38d2\u38ea\u38f6r\xf2\u03edar;\u6963\u0100cr\u37dc\u37e2ute\u803b\xfa\u40fa\xf2\u1150r\u01e3\u37ea\0\u37edy;\u445eve;\u416d\u0100iy\u37f5\u37farc\u803b\xfb\u40fb;\u4443\u0180abh\u3803\u3806\u380br\xf2\u13adlac;\u4171a\xf2\u13c3\u0100ir\u3813\u3818sht;\u697e;\uc000\ud835\udd32rave\u803b\xf9\u40f9\u0161\u3827\u3831r\u0100lr\u382c\u382e\xbb\u0957\xbb\u1083lk;\u6580\u0100ct\u3839\u384d\u026f\u383f\0\0\u384arn\u0100;e\u3845\u3846\u631cr\xbb\u3846op;\u630fri;\u65f8\u0100al\u3856\u385acr;\u416b\u80bb\xa8\u0349\u0100gp\u3862\u3866on;\u4173f;\uc000\ud835\udd66\u0300adhlsu\u114b\u3878\u387d\u1372\u3891\u38a0own\xe1\u13b3arpoon\u0100lr\u3888\u388cef\xf4\u382digh\xf4\u382fi\u0180;hl\u3899\u389a\u389c\u43c5\xbb\u13faon\xbb\u389aparrows;\u61c8\u0180cit\u38b0\u38c4\u38c8\u026f\u38b6\0\0\u38c1rn\u0100;e\u38bc\u38bd\u631dr\xbb\u38bdop;\u630eng;\u416fri;\u65f9cr;\uc000\ud835\udcca\u0180dir\u38d9\u38dd\u38e2ot;\u62f0lde;\u4169i\u0100;f\u3730\u38e8\xbb\u1813\u0100am\u38ef\u38f2r\xf2\u38a8l\u803b\xfc\u40fcangle;\u69a7\u0780ABDacdeflnoprsz\u391c\u391f\u3929\u392d\u39b5\u39b8\u39bd\u39df\u39e4\u39e8\u39f3\u39f9\u39fd\u3a01\u3a20r\xf2\u03f7ar\u0100;v\u3926\u3927\u6ae8;\u6ae9as\xe8\u03e1\u0100nr\u3932\u3937grt;\u699c\u0380eknprst\u34e3\u3946\u394b\u3952\u395d\u3964\u3996app\xe1\u2415othin\xe7\u1e96\u0180hir\u34eb\u2ec8\u3959op\xf4\u2fb5\u0100;h\u13b7\u3962\xef\u318d\u0100iu\u3969\u396dgm\xe1\u33b3\u0100bp\u3972\u3984setneq\u0100;q\u397d\u3980\uc000\u228a\ufe00;\uc000\u2acb\ufe00setneq\u0100;q\u398f\u3992\uc000\u228b\ufe00;\uc000\u2acc\ufe00\u0100hr\u399b\u399fet\xe1\u369ciangle\u0100lr\u39aa\u39afeft\xbb\u0925ight\xbb\u1051y;\u4432ash\xbb\u1036\u0180elr\u39c4\u39d2\u39d7\u0180;be\u2dea\u39cb\u39cfar;\u62bbq;\u625alip;\u62ee\u0100bt\u39dc\u1468a\xf2\u1469r;\uc000\ud835\udd33tr\xe9\u39aesu\u0100bp\u39ef\u39f1\xbb\u0d1c\xbb\u0d59pf;\uc000\ud835\udd67ro\xf0\u0efbtr\xe9\u39b4\u0100cu\u3a06\u3a0br;\uc000\ud835\udccb\u0100bp\u3a10\u3a18n\u0100Ee\u3980\u3a16\xbb\u397en\u0100Ee\u3992\u3a1e\xbb\u3990igzag;\u699a\u0380cefoprs\u3a36\u3a3b\u3a56\u3a5b\u3a54\u3a61\u3a6airc;\u4175\u0100di\u3a40\u3a51\u0100bg\u3a45\u3a49ar;\u6a5fe\u0100;q\u15fa\u3a4f;\u6259erp;\u6118r;\uc000\ud835\udd34pf;\uc000\ud835\udd68\u0100;e\u1479\u3a66at\xe8\u1479cr;\uc000\ud835\udccc\u0ae3\u178e\u3a87\0\u3a8b\0\u3a90\u3a9b\0\0\u3a9d\u3aa8\u3aab\u3aaf\0\0\u3ac3\u3ace\0\u3ad8\u17dc\u17dftr\xe9\u17d1r;\uc000\ud835\udd35\u0100Aa\u3a94\u3a97r\xf2\u03c3r\xf2\u09f6;\u43be\u0100Aa\u3aa1\u3aa4r\xf2\u03b8r\xf2\u09eba\xf0\u2713is;\u62fb\u0180dpt\u17a4\u3ab5\u3abe\u0100fl\u3aba\u17a9;\uc000\ud835\udd69im\xe5\u17b2\u0100Aa\u3ac7\u3acar\xf2\u03cer\xf2\u0a01\u0100cq\u3ad2\u17b8r;\uc000\ud835\udccd\u0100pt\u17d6\u3adcr\xe9\u17d4\u0400acefiosu\u3af0\u3afd\u3b08\u3b0c\u3b11\u3b15\u3b1b\u3b21c\u0100uy\u3af6\u3afbte\u803b\xfd\u40fd;\u444f\u0100iy\u3b02\u3b06rc;\u4177;\u444bn\u803b\xa5\u40a5r;\uc000\ud835\udd36cy;\u4457pf;\uc000\ud835\udd6acr;\uc000\ud835\udcce\u0100cm\u3b26\u3b29y;\u444el\u803b\xff\u40ff\u0500acdefhiosw\u3b42\u3b48\u3b54\u3b58\u3b64\u3b69\u3b6d\u3b74\u3b7a\u3b80cute;\u417a\u0100ay\u3b4d\u3b52ron;\u417e;\u4437ot;\u417c\u0100et\u3b5d\u3b61tr\xe6\u155fa;\u43b6r;\uc000\ud835\udd37cy;\u4436grarr;\u61ddpf;\uc000\ud835\udd6bcr;\uc000\ud835\udccf\u0100jn\u3b85\u3b87;\u600dj;\u600c" + .split("") + .map((c) => c.charCodeAt(0))); +//# sourceMappingURL=decode-data-html.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.js.map new file mode 100644 index 0000000..a5280ca --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-html.js.map @@ -0,0 +1 @@ +{"version":3,"file":"decode-data-html.js","sourceRoot":"","sources":["../../../src/generated/decode-data-html.ts"],"names":[],"mappings":";AAAA,8CAA8C;;;AAEjC,QAAA,cAAc,GAAgC,IAAI,WAAW;AACtE,kBAAkB;AAClB,eAAe,CAAC,268CAA268C;KACt78C,KAAK,CAAC,EAAE,CAAC;KACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CACnC,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts new file mode 100644 index 0000000..6467acc --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts @@ -0,0 +1,2 @@ +export declare const xmlDecodeTree: Uint16Array; +//# sourceMappingURL=decode-data-xml.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts.map new file mode 100644 index 0000000..2988509 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"decode-data-xml.d.ts","sourceRoot":"","sources":["../../../src/generated/decode-data-xml.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,EAAE,WAK3B,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.js new file mode 100644 index 0000000..6f64e46 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.js @@ -0,0 +1,10 @@ +"use strict"; +// Generated using scripts/write-decode-map.ts +Object.defineProperty(exports, "__esModule", { value: true }); +exports.xmlDecodeTree = void 0; +exports.xmlDecodeTree = new Uint16Array( +// prettier-ignore +/* #__PURE__ */ "\u0200aglq\t\x15\x18\x1b\u026d\x0f\0\0\x12p;\u4026os;\u4027t;\u403et;\u403cuot;\u4022" + .split("") + .map((c) => c.charCodeAt(0))); +//# sourceMappingURL=decode-data-xml.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.js.map new file mode 100644 index 0000000..e74e3dd --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/decode-data-xml.js.map @@ -0,0 +1 @@ +{"version":3,"file":"decode-data-xml.js","sourceRoot":"","sources":["../../../src/generated/decode-data-xml.ts"],"names":[],"mappings":";AAAA,8CAA8C;;;AAEjC,QAAA,aAAa,GAAgC,IAAI,WAAW;AACrE,kBAAkB;AAClB,eAAe,CAAC,uFAAuF;KAClG,KAAK,CAAC,EAAE,CAAC;KACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CACnC,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.d.ts new file mode 100644 index 0000000..a648e2b --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.d.ts @@ -0,0 +1,8 @@ +type EncodeTrieNode = string | { + v?: string; + n: number | Map; + o?: string; +}; +export declare const htmlTrie: Map; +export {}; +//# sourceMappingURL=encode-html.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.d.ts.map new file mode 100644 index 0000000..e19fef9 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"encode-html.d.ts","sourceRoot":"","sources":["../../../src/generated/encode-html.ts"],"names":[],"mappings":"AAEA,KAAK,cAAc,GACb,MAAM,GACN;IAAE,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAY1E,eAAO,MAAM,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAC,cAAc,CAAwhuB,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.js new file mode 100644 index 0000000..cc2de8a --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.js @@ -0,0 +1,13 @@ +"use strict"; +// Generated using scripts/write-encode-map.ts +Object.defineProperty(exports, "__esModule", { value: true }); +exports.htmlTrie = void 0; +function restoreDiff(array) { + for (let index = 1; index < array.length; index++) { + array[index][0] += array[index - 1][0] + 1; + } + return array; +} +// prettier-ignore +exports.htmlTrie = new Map(/* #__PURE__ */ restoreDiff([[9, " "], [0, " "], [22, "!"], [0, """], [0, "#"], [0, "$"], [0, "%"], [0, "&"], [0, "'"], [0, "("], [0, ")"], [0, "*"], [0, "+"], [0, ","], [1, "."], [0, "/"], [10, ":"], [0, ";"], [0, { v: "<", n: 8402, o: "<⃒" }], [0, { v: "=", n: 8421, o: "=⃥" }], [0, { v: ">", n: 8402, o: ">⃒" }], [0, "?"], [0, "@"], [26, "["], [0, "\"], [0, "]"], [0, "^"], [0, "_"], [0, "`"], [5, { n: 106, o: "fj" }], [20, "{"], [0, "|"], [0, "}"], [34, " "], [0, "¡"], [0, "¢"], [0, "£"], [0, "¤"], [0, "¥"], [0, "¦"], [0, "§"], [0, "¨"], [0, "©"], [0, "ª"], [0, "«"], [0, "¬"], [0, "­"], [0, "®"], [0, "¯"], [0, "°"], [0, "±"], [0, "²"], [0, "³"], [0, "´"], [0, "µ"], [0, "¶"], [0, "·"], [0, "¸"], [0, "¹"], [0, "º"], [0, "»"], [0, "¼"], [0, "½"], [0, "¾"], [0, "¿"], [0, "À"], [0, "Á"], [0, "Â"], [0, "Ã"], [0, "Ä"], [0, "Å"], [0, "Æ"], [0, "Ç"], [0, "È"], [0, "É"], [0, "Ê"], [0, "Ë"], [0, "Ì"], [0, "Í"], [0, "Î"], [0, "Ï"], [0, "Ð"], [0, "Ñ"], [0, "Ò"], [0, "Ó"], [0, "Ô"], [0, "Õ"], [0, "Ö"], [0, "×"], [0, "Ø"], [0, "Ù"], [0, "Ú"], [0, "Û"], [0, "Ü"], [0, "Ý"], [0, "Þ"], [0, "ß"], [0, "à"], [0, "á"], [0, "â"], [0, "ã"], [0, "ä"], [0, "å"], [0, "æ"], [0, "ç"], [0, "è"], [0, "é"], [0, "ê"], [0, "ë"], [0, "ì"], [0, "í"], [0, "î"], [0, "ï"], [0, "ð"], [0, "ñ"], [0, "ò"], [0, "ó"], [0, "ô"], [0, "õ"], [0, "ö"], [0, "÷"], [0, "ø"], [0, "ù"], [0, "ú"], [0, "û"], [0, "ü"], [0, "ý"], [0, "þ"], [0, "ÿ"], [0, "Ā"], [0, "ā"], [0, "Ă"], [0, "ă"], [0, "Ą"], [0, "ą"], [0, "Ć"], [0, "ć"], [0, "Ĉ"], [0, "ĉ"], [0, "Ċ"], [0, "ċ"], [0, "Č"], [0, "č"], [0, "Ď"], [0, "ď"], [0, "Đ"], [0, "đ"], [0, "Ē"], [0, "ē"], [2, "Ė"], [0, "ė"], [0, "Ę"], [0, "ę"], [0, "Ě"], [0, "ě"], [0, "Ĝ"], [0, "ĝ"], [0, "Ğ"], [0, "ğ"], [0, "Ġ"], [0, "ġ"], [0, "Ģ"], [1, "Ĥ"], [0, "ĥ"], [0, "Ħ"], [0, "ħ"], [0, "Ĩ"], [0, "ĩ"], [0, "Ī"], [0, "ī"], [2, "Į"], [0, "į"], [0, "İ"], [0, "ı"], [0, "IJ"], [0, "ij"], [0, "Ĵ"], [0, "ĵ"], [0, "Ķ"], [0, "ķ"], [0, "ĸ"], [0, "Ĺ"], [0, "ĺ"], [0, "Ļ"], [0, "ļ"], [0, "Ľ"], [0, "ľ"], [0, "Ŀ"], [0, "ŀ"], [0, "Ł"], [0, "ł"], [0, "Ń"], [0, "ń"], [0, "Ņ"], [0, "ņ"], [0, "Ň"], [0, "ň"], [0, "ʼn"], [0, "Ŋ"], [0, "ŋ"], [0, "Ō"], [0, "ō"], [2, "Ő"], [0, "ő"], [0, "Œ"], [0, "œ"], [0, "Ŕ"], [0, "ŕ"], [0, "Ŗ"], [0, "ŗ"], [0, "Ř"], [0, "ř"], [0, "Ś"], [0, "ś"], [0, "Ŝ"], [0, "ŝ"], [0, "Ş"], [0, "ş"], [0, "Š"], [0, "š"], [0, "Ţ"], [0, "ţ"], [0, "Ť"], [0, "ť"], [0, "Ŧ"], [0, "ŧ"], [0, "Ũ"], [0, "ũ"], [0, "Ū"], [0, "ū"], [0, "Ŭ"], [0, "ŭ"], [0, "Ů"], [0, "ů"], [0, "Ű"], [0, "ű"], [0, "Ų"], [0, "ų"], [0, "Ŵ"], [0, "ŵ"], [0, "Ŷ"], [0, "ŷ"], [0, "Ÿ"], [0, "Ź"], [0, "ź"], [0, "Ż"], [0, "ż"], [0, "Ž"], [0, "ž"], [19, "ƒ"], [34, "Ƶ"], [63, "ǵ"], [65, "ȷ"], [142, "ˆ"], [0, "ˇ"], [16, "˘"], [0, "˙"], [0, "˚"], [0, "˛"], [0, "˜"], [0, "˝"], [51, "̑"], [127, "Α"], [0, "Β"], [0, "Γ"], [0, "Δ"], [0, "Ε"], [0, "Ζ"], [0, "Η"], [0, "Θ"], [0, "Ι"], [0, "Κ"], [0, "Λ"], [0, "Μ"], [0, "Ν"], [0, "Ξ"], [0, "Ο"], [0, "Π"], [0, "Ρ"], [1, "Σ"], [0, "Τ"], [0, "Υ"], [0, "Φ"], [0, "Χ"], [0, "Ψ"], [0, "Ω"], [7, "α"], [0, "β"], [0, "γ"], [0, "δ"], [0, "ε"], [0, "ζ"], [0, "η"], [0, "θ"], [0, "ι"], [0, "κ"], [0, "λ"], [0, "μ"], [0, "ν"], [0, "ξ"], [0, "ο"], [0, "π"], [0, "ρ"], [0, "ς"], [0, "σ"], [0, "τ"], [0, "υ"], [0, "φ"], [0, "χ"], [0, "ψ"], [0, "ω"], [7, "ϑ"], [0, "ϒ"], [2, "ϕ"], [0, "ϖ"], [5, "Ϝ"], [0, "ϝ"], [18, "ϰ"], [0, "ϱ"], [3, "ϵ"], [0, "϶"], [10, "Ё"], [0, "Ђ"], [0, "Ѓ"], [0, "Є"], [0, "Ѕ"], [0, "І"], [0, "Ї"], [0, "Ј"], [0, "Љ"], [0, "Њ"], [0, "Ћ"], [0, "Ќ"], [1, "Ў"], [0, "Џ"], [0, "А"], [0, "Б"], [0, "В"], [0, "Г"], [0, "Д"], [0, "Е"], [0, "Ж"], [0, "З"], [0, "И"], [0, "Й"], [0, "К"], [0, "Л"], [0, "М"], [0, "Н"], [0, "О"], [0, "П"], [0, "Р"], [0, "С"], [0, "Т"], [0, "У"], [0, "Ф"], [0, "Х"], [0, "Ц"], [0, "Ч"], [0, "Ш"], [0, "Щ"], [0, "Ъ"], [0, "Ы"], [0, "Ь"], [0, "Э"], [0, "Ю"], [0, "Я"], [0, "а"], [0, "б"], [0, "в"], [0, "г"], [0, "д"], [0, "е"], [0, "ж"], [0, "з"], [0, "и"], [0, "й"], [0, "к"], [0, "л"], [0, "м"], [0, "н"], [0, "о"], [0, "п"], [0, "р"], [0, "с"], [0, "т"], [0, "у"], [0, "ф"], [0, "х"], [0, "ц"], [0, "ч"], [0, "ш"], [0, "щ"], [0, "ъ"], [0, "ы"], [0, "ь"], [0, "э"], [0, "ю"], [0, "я"], [1, "ё"], [0, "ђ"], [0, "ѓ"], [0, "є"], [0, "ѕ"], [0, "і"], [0, "ї"], [0, "ј"], [0, "љ"], [0, "њ"], [0, "ћ"], [0, "ќ"], [1, "ў"], [0, "џ"], [7074, " "], [0, " "], [0, " "], [0, " "], [1, " "], [0, " "], [0, " "], [0, " "], [0, "​"], [0, "‌"], [0, "‍"], [0, "‎"], [0, "‏"], [0, "‐"], [2, "–"], [0, "—"], [0, "―"], [0, "‖"], [1, "‘"], [0, "’"], [0, "‚"], [1, "“"], [0, "”"], [0, "„"], [1, "†"], [0, "‡"], [0, "•"], [2, "‥"], [0, "…"], [9, "‰"], [0, "‱"], [0, "′"], [0, "″"], [0, "‴"], [0, "‵"], [3, "‹"], [0, "›"], [3, "‾"], [2, "⁁"], [1, "⁃"], [0, "⁄"], [10, "⁏"], [7, "⁗"], [7, { v: " ", n: 8202, o: "  " }], [0, "⁠"], [0, "⁡"], [0, "⁢"], [0, "⁣"], [72, "€"], [46, "⃛"], [0, "⃜"], [37, "ℂ"], [2, "℅"], [4, "ℊ"], [0, "ℋ"], [0, "ℌ"], [0, "ℍ"], [0, "ℎ"], [0, "ℏ"], [0, "ℐ"], [0, "ℑ"], [0, "ℒ"], [0, "ℓ"], [1, "ℕ"], [0, "№"], [0, "℗"], [0, "℘"], [0, "ℙ"], [0, "ℚ"], [0, "ℛ"], [0, "ℜ"], [0, "ℝ"], [0, "℞"], [3, "™"], [1, "ℤ"], [2, "℧"], [0, "ℨ"], [0, "℩"], [2, "ℬ"], [0, "ℭ"], [1, "ℯ"], [0, "ℰ"], [0, "ℱ"], [1, "ℳ"], [0, "ℴ"], [0, "ℵ"], [0, "ℶ"], [0, "ℷ"], [0, "ℸ"], [12, "ⅅ"], [0, "ⅆ"], [0, "ⅇ"], [0, "ⅈ"], [10, "⅓"], [0, "⅔"], [0, "⅕"], [0, "⅖"], [0, "⅗"], [0, "⅘"], [0, "⅙"], [0, "⅚"], [0, "⅛"], [0, "⅜"], [0, "⅝"], [0, "⅞"], [49, "←"], [0, "↑"], [0, "→"], [0, "↓"], [0, "↔"], [0, "↕"], [0, "↖"], [0, "↗"], [0, "↘"], [0, "↙"], [0, "↚"], [0, "↛"], [1, { v: "↝", n: 824, o: "↝̸" }], [0, "↞"], [0, "↟"], [0, "↠"], [0, "↡"], [0, "↢"], [0, "↣"], [0, "↤"], [0, "↥"], [0, "↦"], [0, "↧"], [1, "↩"], [0, "↪"], [0, "↫"], [0, "↬"], [0, "↭"], [0, "↮"], [1, "↰"], [0, "↱"], [0, "↲"], [0, "↳"], [1, "↵"], [0, "↶"], [0, "↷"], [2, "↺"], [0, "↻"], [0, "↼"], [0, "↽"], [0, "↾"], [0, "↿"], [0, "⇀"], [0, "⇁"], [0, "⇂"], [0, "⇃"], [0, "⇄"], [0, "⇅"], [0, "⇆"], [0, "⇇"], [0, "⇈"], [0, "⇉"], [0, "⇊"], [0, "⇋"], [0, "⇌"], [0, "⇍"], [0, "⇎"], [0, "⇏"], [0, "⇐"], [0, "⇑"], [0, "⇒"], [0, "⇓"], [0, "⇔"], [0, "⇕"], [0, "⇖"], [0, "⇗"], [0, "⇘"], [0, "⇙"], [0, "⇚"], [0, "⇛"], [1, "⇝"], [6, "⇤"], [0, "⇥"], [15, "⇵"], [7, "⇽"], [0, "⇾"], [0, "⇿"], [0, "∀"], [0, "∁"], [0, { v: "∂", n: 824, o: "∂̸" }], [0, "∃"], [0, "∄"], [0, "∅"], [1, "∇"], [0, "∈"], [0, "∉"], [1, "∋"], [0, "∌"], [2, "∏"], [0, "∐"], [0, "∑"], [0, "−"], [0, "∓"], [0, "∔"], [1, "∖"], [0, "∗"], [0, "∘"], [1, "√"], [2, "∝"], [0, "∞"], [0, "∟"], [0, { v: "∠", n: 8402, o: "∠⃒" }], [0, "∡"], [0, "∢"], [0, "∣"], [0, "∤"], [0, "∥"], [0, "∦"], [0, "∧"], [0, "∨"], [0, { v: "∩", n: 65024, o: "∩︀" }], [0, { v: "∪", n: 65024, o: "∪︀" }], [0, "∫"], [0, "∬"], [0, "∭"], [0, "∮"], [0, "∯"], [0, "∰"], [0, "∱"], [0, "∲"], [0, "∳"], [0, "∴"], [0, "∵"], [0, "∶"], [0, "∷"], [0, "∸"], [1, "∺"], [0, "∻"], [0, { v: "∼", n: 8402, o: "∼⃒" }], [0, { v: "∽", n: 817, o: "∽̱" }], [0, { v: "∾", n: 819, o: "∾̳" }], [0, "∿"], [0, "≀"], [0, "≁"], [0, { v: "≂", n: 824, o: "≂̸" }], [0, "≃"], [0, "≄"], [0, "≅"], [0, "≆"], [0, "≇"], [0, "≈"], [0, "≉"], [0, "≊"], [0, { v: "≋", n: 824, o: "≋̸" }], [0, "≌"], [0, { v: "≍", n: 8402, o: "≍⃒" }], [0, { v: "≎", n: 824, o: "≎̸" }], [0, { v: "≏", n: 824, o: "≏̸" }], [0, { v: "≐", n: 824, o: "≐̸" }], [0, "≑"], [0, "≒"], [0, "≓"], [0, "≔"], [0, "≕"], [0, "≖"], [0, "≗"], [1, "≙"], [0, "≚"], [1, "≜"], [2, "≟"], [0, "≠"], [0, { v: "≡", n: 8421, o: "≡⃥" }], [0, "≢"], [1, { v: "≤", n: 8402, o: "≤⃒" }], [0, { v: "≥", n: 8402, o: "≥⃒" }], [0, { v: "≦", n: 824, o: "≦̸" }], [0, { v: "≧", n: 824, o: "≧̸" }], [0, { v: "≨", n: 65024, o: "≨︀" }], [0, { v: "≩", n: 65024, o: "≩︀" }], [0, { v: "≪", n: /* #__PURE__ */ new Map(/* #__PURE__ */ restoreDiff([[824, "≪̸"], [7577, "≪⃒"]])) }], [0, { v: "≫", n: /* #__PURE__ */ new Map(/* #__PURE__ */ restoreDiff([[824, "≫̸"], [7577, "≫⃒"]])) }], [0, "≬"], [0, "≭"], [0, "≮"], [0, "≯"], [0, "≰"], [0, "≱"], [0, "≲"], [0, "≳"], [0, "≴"], [0, "≵"], [0, "≶"], [0, "≷"], [0, "≸"], [0, "≹"], [0, "≺"], [0, "≻"], [0, "≼"], [0, "≽"], [0, "≾"], [0, { v: "≿", n: 824, o: "≿̸" }], [0, "⊀"], [0, "⊁"], [0, { v: "⊂", n: 8402, o: "⊂⃒" }], [0, { v: "⊃", n: 8402, o: "⊃⃒" }], [0, "⊄"], [0, "⊅"], [0, "⊆"], [0, "⊇"], [0, "⊈"], [0, "⊉"], [0, { v: "⊊", n: 65024, o: "⊊︀" }], [0, { v: "⊋", n: 65024, o: "⊋︀" }], [1, "⊍"], [0, "⊎"], [0, { v: "⊏", n: 824, o: "⊏̸" }], [0, { v: "⊐", n: 824, o: "⊐̸" }], [0, "⊑"], [0, "⊒"], [0, { v: "⊓", n: 65024, o: "⊓︀" }], [0, { v: "⊔", n: 65024, o: "⊔︀" }], [0, "⊕"], [0, "⊖"], [0, "⊗"], [0, "⊘"], [0, "⊙"], [0, "⊚"], [0, "⊛"], [1, "⊝"], [0, "⊞"], [0, "⊟"], [0, "⊠"], [0, "⊡"], [0, "⊢"], [0, "⊣"], [0, "⊤"], [0, "⊥"], [1, "⊧"], [0, "⊨"], [0, "⊩"], [0, "⊪"], [0, "⊫"], [0, "⊬"], [0, "⊭"], [0, "⊮"], [0, "⊯"], [0, "⊰"], [1, "⊲"], [0, "⊳"], [0, { v: "⊴", n: 8402, o: "⊴⃒" }], [0, { v: "⊵", n: 8402, o: "⊵⃒" }], [0, "⊶"], [0, "⊷"], [0, "⊸"], [0, "⊹"], [0, "⊺"], [0, "⊻"], [1, "⊽"], [0, "⊾"], [0, "⊿"], [0, "⋀"], [0, "⋁"], [0, "⋂"], [0, "⋃"], [0, "⋄"], [0, "⋅"], [0, "⋆"], [0, "⋇"], [0, "⋈"], [0, "⋉"], [0, "⋊"], [0, "⋋"], [0, "⋌"], [0, "⋍"], [0, "⋎"], [0, "⋏"], [0, "⋐"], [0, "⋑"], [0, "⋒"], [0, "⋓"], [0, "⋔"], [0, "⋕"], [0, "⋖"], [0, "⋗"], [0, { v: "⋘", n: 824, o: "⋘̸" }], [0, { v: "⋙", n: 824, o: "⋙̸" }], [0, { v: "⋚", n: 65024, o: "⋚︀" }], [0, { v: "⋛", n: 65024, o: "⋛︀" }], [2, "⋞"], [0, "⋟"], [0, "⋠"], [0, "⋡"], [0, "⋢"], [0, "⋣"], [2, "⋦"], [0, "⋧"], [0, "⋨"], [0, "⋩"], [0, "⋪"], [0, "⋫"], [0, "⋬"], [0, "⋭"], [0, "⋮"], [0, "⋯"], [0, "⋰"], [0, "⋱"], [0, "⋲"], [0, "⋳"], [0, "⋴"], [0, { v: "⋵", n: 824, o: "⋵̸" }], [0, "⋶"], [0, "⋷"], [1, { v: "⋹", n: 824, o: "⋹̸" }], [0, "⋺"], [0, "⋻"], [0, "⋼"], [0, "⋽"], [0, "⋾"], [6, "⌅"], [0, "⌆"], [1, "⌈"], [0, "⌉"], [0, "⌊"], [0, "⌋"], [0, "⌌"], [0, "⌍"], [0, "⌎"], [0, "⌏"], [0, "⌐"], [1, "⌒"], [0, "⌓"], [1, "⌕"], [0, "⌖"], [5, "⌜"], [0, "⌝"], [0, "⌞"], [0, "⌟"], [2, "⌢"], [0, "⌣"], [9, "⌭"], [0, "⌮"], [7, "⌶"], [6, "⌽"], [1, "⌿"], [60, "⍼"], [51, "⎰"], [0, "⎱"], [2, "⎴"], [0, "⎵"], [0, "⎶"], [37, "⏜"], [0, "⏝"], [0, "⏞"], [0, "⏟"], [2, "⏢"], [4, "⏧"], [59, "␣"], [164, "Ⓢ"], [55, "─"], [1, "│"], [9, "┌"], [3, "┐"], [3, "└"], [3, "┘"], [3, "├"], [7, "┤"], [7, "┬"], [7, "┴"], [7, "┼"], [19, "═"], [0, "║"], [0, "╒"], [0, "╓"], [0, "╔"], [0, "╕"], [0, "╖"], [0, "╗"], [0, "╘"], [0, "╙"], [0, "╚"], [0, "╛"], [0, "╜"], [0, "╝"], [0, "╞"], [0, "╟"], [0, "╠"], [0, "╡"], [0, "╢"], [0, "╣"], [0, "╤"], [0, "╥"], [0, "╦"], [0, "╧"], [0, "╨"], [0, "╩"], [0, "╪"], [0, "╫"], [0, "╬"], [19, "▀"], [3, "▄"], [3, "█"], [8, "░"], [0, "▒"], [0, "▓"], [13, "□"], [8, "▪"], [0, "▫"], [1, "▭"], [0, "▮"], [2, "▱"], [1, "△"], [0, "▴"], [0, "▵"], [2, "▸"], [0, "▹"], [3, "▽"], [0, "▾"], [0, "▿"], [2, "◂"], [0, "◃"], [6, "◊"], [0, "○"], [32, "◬"], [2, "◯"], [8, "◸"], [0, "◹"], [0, "◺"], [0, "◻"], [0, "◼"], [8, "★"], [0, "☆"], [7, "☎"], [49, "♀"], [1, "♂"], [29, "♠"], [2, "♣"], [1, "♥"], [0, "♦"], [3, "♪"], [2, "♭"], [0, "♮"], [0, "♯"], [163, "✓"], [3, "✗"], [8, "✠"], [21, "✶"], [33, "❘"], [25, "❲"], [0, "❳"], [84, "⟈"], [0, "⟉"], [28, "⟦"], [0, "⟧"], [0, "⟨"], [0, "⟩"], [0, "⟪"], [0, "⟫"], [0, "⟬"], [0, "⟭"], [7, "⟵"], [0, "⟶"], [0, "⟷"], [0, "⟸"], [0, "⟹"], [0, "⟺"], [1, "⟼"], [2, "⟿"], [258, "⤂"], [0, "⤃"], [0, "⤄"], [0, "⤅"], [6, "⤌"], [0, "⤍"], [0, "⤎"], [0, "⤏"], [0, "⤐"], [0, "⤑"], [0, "⤒"], [0, "⤓"], [2, "⤖"], [2, "⤙"], [0, "⤚"], [0, "⤛"], [0, "⤜"], [0, "⤝"], [0, "⤞"], [0, "⤟"], [0, "⤠"], [2, "⤣"], [0, "⤤"], [0, "⤥"], [0, "⤦"], [0, "⤧"], [0, "⤨"], [0, "⤩"], [0, "⤪"], [8, { v: "⤳", n: 824, o: "⤳̸" }], [1, "⤵"], [0, "⤶"], [0, "⤷"], [0, "⤸"], [0, "⤹"], [2, "⤼"], [0, "⤽"], [7, "⥅"], [2, "⥈"], [0, "⥉"], [0, "⥊"], [0, "⥋"], [2, "⥎"], [0, "⥏"], [0, "⥐"], [0, "⥑"], [0, "⥒"], [0, "⥓"], [0, "⥔"], [0, "⥕"], [0, "⥖"], [0, "⥗"], [0, "⥘"], [0, "⥙"], [0, "⥚"], [0, "⥛"], [0, "⥜"], [0, "⥝"], [0, "⥞"], [0, "⥟"], [0, "⥠"], [0, "⥡"], [0, "⥢"], [0, "⥣"], [0, "⥤"], [0, "⥥"], [0, "⥦"], [0, "⥧"], [0, "⥨"], [0, "⥩"], [0, "⥪"], [0, "⥫"], [0, "⥬"], [0, "⥭"], [0, "⥮"], [0, "⥯"], [0, "⥰"], [0, "⥱"], [0, "⥲"], [0, "⥳"], [0, "⥴"], [0, "⥵"], [0, "⥶"], [1, "⥸"], [0, "⥹"], [1, "⥻"], [0, "⥼"], [0, "⥽"], [0, "⥾"], [0, "⥿"], [5, "⦅"], [0, "⦆"], [4, "⦋"], [0, "⦌"], [0, "⦍"], [0, "⦎"], [0, "⦏"], [0, "⦐"], [0, "⦑"], [0, "⦒"], [0, "⦓"], [0, "⦔"], [0, "⦕"], [0, "⦖"], [3, "⦚"], [1, "⦜"], [0, "⦝"], [6, "⦤"], [0, "⦥"], [0, "⦦"], [0, "⦧"], [0, "⦨"], [0, "⦩"], [0, "⦪"], [0, "⦫"], [0, "⦬"], [0, "⦭"], [0, "⦮"], [0, "⦯"], [0, "⦰"], [0, "⦱"], [0, "⦲"], [0, "⦳"], [0, "⦴"], [0, "⦵"], [0, "⦶"], [0, "⦷"], [1, "⦹"], [1, "⦻"], [0, "⦼"], [1, "⦾"], [0, "⦿"], [0, "⧀"], [0, "⧁"], [0, "⧂"], [0, "⧃"], [0, "⧄"], [0, "⧅"], [3, "⧉"], [3, "⧍"], [0, "⧎"], [0, { v: "⧏", n: 824, o: "⧏̸" }], [0, { v: "⧐", n: 824, o: "⧐̸" }], [11, "⧜"], [0, "⧝"], [0, "⧞"], [4, "⧣"], [0, "⧤"], [0, "⧥"], [5, "⧫"], [8, "⧴"], [1, "⧶"], [9, "⨀"], [0, "⨁"], [0, "⨂"], [1, "⨄"], [1, "⨆"], [5, "⨌"], [0, "⨍"], [2, "⨐"], [0, "⨑"], [0, "⨒"], [0, "⨓"], [0, "⨔"], [0, "⨕"], [0, "⨖"], [0, "⨗"], [10, "⨢"], [0, "⨣"], [0, "⨤"], [0, "⨥"], [0, "⨦"], [0, "⨧"], [1, "⨩"], [0, "⨪"], [2, "⨭"], [0, "⨮"], [0, "⨯"], [0, "⨰"], [0, "⨱"], [1, "⨳"], [0, "⨴"], [0, "⨵"], [0, "⨶"], [0, "⨷"], [0, "⨸"], [0, "⨹"], [0, "⨺"], [0, "⨻"], [0, "⨼"], [2, "⨿"], [0, "⩀"], [1, "⩂"], [0, "⩃"], [0, "⩄"], [0, "⩅"], [0, "⩆"], [0, "⩇"], [0, "⩈"], [0, "⩉"], [0, "⩊"], [0, "⩋"], [0, "⩌"], [0, "⩍"], [2, "⩐"], [2, "⩓"], [0, "⩔"], [0, "⩕"], [0, "⩖"], [0, "⩗"], [0, "⩘"], [1, "⩚"], [0, "⩛"], [0, "⩜"], [0, "⩝"], [1, "⩟"], [6, "⩦"], [3, "⩪"], [2, { v: "⩭", n: 824, o: "⩭̸" }], [0, "⩮"], [0, "⩯"], [0, { v: "⩰", n: 824, o: "⩰̸" }], [0, "⩱"], [0, "⩲"], [0, "⩳"], [0, "⩴"], [0, "⩵"], [1, "⩷"], [0, "⩸"], [0, "⩹"], [0, "⩺"], [0, "⩻"], [0, "⩼"], [0, { v: "⩽", n: 824, o: "⩽̸" }], [0, { v: "⩾", n: 824, o: "⩾̸" }], [0, "⩿"], [0, "⪀"], [0, "⪁"], [0, "⪂"], [0, "⪃"], [0, "⪄"], [0, "⪅"], [0, "⪆"], [0, "⪇"], [0, "⪈"], [0, "⪉"], [0, "⪊"], [0, "⪋"], [0, "⪌"], [0, "⪍"], [0, "⪎"], [0, "⪏"], [0, "⪐"], [0, "⪑"], [0, "⪒"], [0, "⪓"], [0, "⪔"], [0, "⪕"], [0, "⪖"], [0, "⪗"], [0, "⪘"], [0, "⪙"], [0, "⪚"], [2, "⪝"], [0, "⪞"], [0, "⪟"], [0, "⪠"], [0, { v: "⪡", n: 824, o: "⪡̸" }], [0, { v: "⪢", n: 824, o: "⪢̸" }], [1, "⪤"], [0, "⪥"], [0, "⪦"], [0, "⪧"], [0, "⪨"], [0, "⪩"], [0, "⪪"], [0, "⪫"], [0, { v: "⪬", n: 65024, o: "⪬︀" }], [0, { v: "⪭", n: 65024, o: "⪭︀" }], [0, "⪮"], [0, { v: "⪯", n: 824, o: "⪯̸" }], [0, { v: "⪰", n: 824, o: "⪰̸" }], [2, "⪳"], [0, "⪴"], [0, "⪵"], [0, "⪶"], [0, "⪷"], [0, "⪸"], [0, "⪹"], [0, "⪺"], [0, "⪻"], [0, "⪼"], [0, "⪽"], [0, "⪾"], [0, "⪿"], [0, "⫀"], [0, "⫁"], [0, "⫂"], [0, "⫃"], [0, "⫄"], [0, { v: "⫅", n: 824, o: "⫅̸" }], [0, { v: "⫆", n: 824, o: "⫆̸" }], [0, "⫇"], [0, "⫈"], [2, { v: "⫋", n: 65024, o: "⫋︀" }], [0, { v: "⫌", n: 65024, o: "⫌︀" }], [2, "⫏"], [0, "⫐"], [0, "⫑"], [0, "⫒"], [0, "⫓"], [0, "⫔"], [0, "⫕"], [0, "⫖"], [0, "⫗"], [0, "⫘"], [0, "⫙"], [0, "⫚"], [0, "⫛"], [8, "⫤"], [1, "⫦"], [0, "⫧"], [0, "⫨"], [0, "⫩"], [1, "⫫"], [0, "⫬"], [0, "⫭"], [0, "⫮"], [0, "⫯"], [0, "⫰"], [0, "⫱"], [0, "⫲"], [0, "⫳"], [9, { v: "⫽", n: 8421, o: "⫽⃥" }], [44343, { n: /* #__PURE__ */ new Map(/* #__PURE__ */ restoreDiff([[56476, "𝒜"], [1, "𝒞"], [0, "𝒟"], [2, "𝒢"], [2, "𝒥"], [0, "𝒦"], [2, "𝒩"], [0, "𝒪"], [0, "𝒫"], [0, "𝒬"], [1, "𝒮"], [0, "𝒯"], [0, "𝒰"], [0, "𝒱"], [0, "𝒲"], [0, "𝒳"], [0, "𝒴"], [0, "𝒵"], [0, "𝒶"], [0, "𝒷"], [0, "𝒸"], [0, "𝒹"], [1, "𝒻"], [1, "𝒽"], [0, "𝒾"], [0, "𝒿"], [0, "𝓀"], [0, "𝓁"], [0, "𝓂"], [0, "𝓃"], [1, "𝓅"], [0, "𝓆"], [0, "𝓇"], [0, "𝓈"], [0, "𝓉"], [0, "𝓊"], [0, "𝓋"], [0, "𝓌"], [0, "𝓍"], [0, "𝓎"], [0, "𝓏"], [52, "𝔄"], [0, "𝔅"], [1, "𝔇"], [0, "𝔈"], [0, "𝔉"], [0, "𝔊"], [2, "𝔍"], [0, "𝔎"], [0, "𝔏"], [0, "𝔐"], [0, "𝔑"], [0, "𝔒"], [0, "𝔓"], [0, "𝔔"], [1, "𝔖"], [0, "𝔗"], [0, "𝔘"], [0, "𝔙"], [0, "𝔚"], [0, "𝔛"], [0, "𝔜"], [1, "𝔞"], [0, "𝔟"], [0, "𝔠"], [0, "𝔡"], [0, "𝔢"], [0, "𝔣"], [0, "𝔤"], [0, "𝔥"], [0, "𝔦"], [0, "𝔧"], [0, "𝔨"], [0, "𝔩"], [0, "𝔪"], [0, "𝔫"], [0, "𝔬"], [0, "𝔭"], [0, "𝔮"], [0, "𝔯"], [0, "𝔰"], [0, "𝔱"], [0, "𝔲"], [0, "𝔳"], [0, "𝔴"], [0, "𝔵"], [0, "𝔶"], [0, "𝔷"], [0, "𝔸"], [0, "𝔹"], [1, "𝔻"], [0, "𝔼"], [0, "𝔽"], [0, "𝔾"], [1, "𝕀"], [0, "𝕁"], [0, "𝕂"], [0, "𝕃"], [0, "𝕄"], [1, "𝕆"], [3, "𝕊"], [0, "𝕋"], [0, "𝕌"], [0, "𝕍"], [0, "𝕎"], [0, "𝕏"], [0, "𝕐"], [1, "𝕒"], [0, "𝕓"], [0, "𝕔"], [0, "𝕕"], [0, "𝕖"], [0, "𝕗"], [0, "𝕘"], [0, "𝕙"], [0, "𝕚"], [0, "𝕛"], [0, "𝕜"], [0, "𝕝"], [0, "𝕞"], [0, "𝕟"], [0, "𝕠"], [0, "𝕡"], [0, "𝕢"], [0, "𝕣"], [0, "𝕤"], [0, "𝕥"], [0, "𝕦"], [0, "𝕧"], [0, "𝕨"], [0, "𝕩"], [0, "𝕪"], [0, "𝕫"]])) }], [8906, "ff"], [0, "fi"], [0, "fl"], [0, "ffi"], [0, "ffl"]])); +//# sourceMappingURL=encode-html.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.js.map new file mode 100644 index 0000000..79d6afe --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/generated/encode-html.js.map @@ -0,0 +1 @@ +{"version":3,"file":"encode-html.js","sourceRoot":"","sources":["../../../src/generated/encode-html.ts"],"names":[],"mappings":"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,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,EAAE,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAE,EAAC,SAAS,CAAC,EAAC,CAAC,EAAE,EAAC,UAAU,CAAC,EAAC,CAAC,EAAE,EAAC,SAAS,CAAC,EAAC,CAAC,GAAG,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,EAAE,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,kBAAkB,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,oBAAoB,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,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EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,IAAI,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,aAAa,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,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,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,gBAAgB,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SA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CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAE,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,IAAI,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.d.ts new file mode 100644 index 0000000..bdb9ab7 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.d.ts @@ -0,0 +1,96 @@ +import { DecodingMode } from "./decode.js"; +/** The level of entities to support. */ +export declare enum EntityLevel { + /** Support only XML entities. */ + XML = 0, + /** Support HTML entities, which are a superset of XML entities. */ + HTML = 1 +} +export declare enum EncodingMode { + /** + * The output is UTF-8 encoded. Only characters that need escaping within + * XML will be escaped. + */ + UTF8 = 0, + /** + * The output consists only of ASCII characters. Characters that need + * escaping within HTML, and characters that aren't ASCII characters will + * be escaped. + */ + ASCII = 1, + /** + * Encode all characters that have an equivalent entity, as well as all + * characters that are not ASCII characters. + */ + Extensive = 2, + /** + * Encode all characters that have to be escaped in HTML attributes, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + */ + Attribute = 3, + /** + * Encode all characters that have to be escaped in HTML text, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + */ + Text = 4 +} +export interface DecodingOptions { + /** + * The level of entities to support. + * @default {@link EntityLevel.XML} + */ + level?: EntityLevel; + /** + * Decoding mode. If `Legacy`, will support legacy entities not terminated + * with a semicolon (`;`). + * + * Always `Strict` for XML. For HTML, set this to `true` if you are parsing + * an attribute value. + * + * The deprecated `decodeStrict` function defaults this to `Strict`. + * + * @default {@link DecodingMode.Legacy} + */ + mode?: DecodingMode | undefined; +} +/** + * Decodes a string with entities. + * + * @param input String to decode. + * @param options Decoding options. + */ +export declare function decode(input: string, options?: DecodingOptions | EntityLevel): string; +/** + * Decodes a string with entities. Does not allow missing trailing semicolons for entities. + * + * @param input String to decode. + * @param options Decoding options. + * @deprecated Use `decode` with the `mode` set to `Strict`. + */ +export declare function decodeStrict(input: string, options?: DecodingOptions | EntityLevel): string; +/** + * Options for `encode`. + */ +export interface EncodingOptions { + /** + * The level of entities to support. + * @default {@link EntityLevel.XML} + */ + level?: EntityLevel; + /** + * Output format. + * @default {@link EncodingMode.Extensive} + */ + mode?: EncodingMode; +} +/** + * Encodes a string with entities. + * + * @param input String to encode. + * @param options Encoding options. + */ +export declare function encode(input: string, options?: EncodingOptions | EntityLevel): string; +export { encodeXML, escape, escapeUTF8, escapeAttribute, escapeText, } from "./escape.js"; +export { encodeHTML, encodeNonAsciiHTML, encodeHTML as encodeHTML4, encodeHTML as encodeHTML5, } from "./encode.js"; +export { EntityDecoder, DecodingMode, decodeXML, decodeHTML, decodeHTMLStrict, decodeHTMLAttribute, decodeHTML as decodeHTML4, decodeHTML as decodeHTML5, decodeHTMLStrict as decodeHTML4Strict, decodeHTMLStrict as decodeHTML5Strict, decodeXML as decodeXMLStrict, } from "./decode.js"; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.d.ts.map new file mode 100644 index 0000000..7b9b63f --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,YAAY,EAAE,MAAM,aAAa,CAAC;AASlE,wCAAwC;AACxC,oBAAY,WAAW;IACnB,iCAAiC;IACjC,GAAG,IAAI;IACP,mEAAmE;IACnE,IAAI,IAAI;CACX;AAED,oBAAY,YAAY;IACpB;;;OAGG;IACH,IAAI,IAAA;IACJ;;;;OAIG;IACH,KAAK,IAAA;IACL;;;OAGG;IACH,SAAS,IAAA;IACT;;;OAGG;IACH,SAAS,IAAA;IACT;;;OAGG;IACH,IAAI,IAAA;CACP;AAED,MAAM,WAAW,eAAe;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;CACnC;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,eAAe,GAAG,WAA6B,GACzD,MAAM,CASR;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,eAAe,GAAG,WAA6B,GACzD,MAAM,CAMR;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,eAAe,GAAG,WAA6B,GACzD,MAAM,CA2BR;AAED,OAAO,EACH,SAAS,EACT,MAAM,EACN,UAAU,EACV,eAAe,EACf,UAAU,GACb,MAAM,aAAa,CAAC;AAErB,OAAO,EACH,UAAU,EACV,kBAAkB,EAElB,UAAU,IAAI,WAAW,EACzB,UAAU,IAAI,WAAW,GAC5B,MAAM,aAAa,CAAC;AAErB,OAAO,EACH,aAAa,EACb,YAAY,EACZ,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EAEnB,UAAU,IAAI,WAAW,EACzB,UAAU,IAAI,WAAW,EACzB,gBAAgB,IAAI,iBAAiB,EACrC,gBAAgB,IAAI,iBAAiB,EACrC,SAAS,IAAI,eAAe,GAC/B,MAAM,aAAa,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.js new file mode 100644 index 0000000..8637dcf --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.js @@ -0,0 +1,131 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.decodeXMLStrict = exports.decodeHTML5Strict = exports.decodeHTML4Strict = exports.decodeHTML5 = exports.decodeHTML4 = exports.decodeHTMLAttribute = exports.decodeHTMLStrict = exports.decodeHTML = exports.decodeXML = exports.DecodingMode = exports.EntityDecoder = exports.encodeHTML5 = exports.encodeHTML4 = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.escapeText = exports.escapeAttribute = exports.escapeUTF8 = exports.encodeXML = exports.EncodingMode = exports.EntityLevel = void 0; +exports.decode = decode; +exports.decodeStrict = decodeStrict; +exports.encode = encode; +const decode_js_1 = require("./decode.js"); +const encode_js_1 = require("./encode.js"); +const escape_js_1 = require("./escape.js"); +/** The level of entities to support. */ +var EntityLevel; +(function (EntityLevel) { + /** Support only XML entities. */ + EntityLevel[EntityLevel["XML"] = 0] = "XML"; + /** Support HTML entities, which are a superset of XML entities. */ + EntityLevel[EntityLevel["HTML"] = 1] = "HTML"; +})(EntityLevel || (exports.EntityLevel = EntityLevel = {})); +var EncodingMode; +(function (EncodingMode) { + /** + * The output is UTF-8 encoded. Only characters that need escaping within + * XML will be escaped. + */ + EncodingMode[EncodingMode["UTF8"] = 0] = "UTF8"; + /** + * The output consists only of ASCII characters. Characters that need + * escaping within HTML, and characters that aren't ASCII characters will + * be escaped. + */ + EncodingMode[EncodingMode["ASCII"] = 1] = "ASCII"; + /** + * Encode all characters that have an equivalent entity, as well as all + * characters that are not ASCII characters. + */ + EncodingMode[EncodingMode["Extensive"] = 2] = "Extensive"; + /** + * Encode all characters that have to be escaped in HTML attributes, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + */ + EncodingMode[EncodingMode["Attribute"] = 3] = "Attribute"; + /** + * Encode all characters that have to be escaped in HTML text, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + */ + EncodingMode[EncodingMode["Text"] = 4] = "Text"; +})(EncodingMode || (exports.EncodingMode = EncodingMode = {})); +/** + * Decodes a string with entities. + * + * @param input String to decode. + * @param options Decoding options. + */ +function decode(input, options = EntityLevel.XML) { + const level = typeof options === "number" ? options : options.level; + if (level === EntityLevel.HTML) { + const mode = typeof options === "object" ? options.mode : undefined; + return (0, decode_js_1.decodeHTML)(input, mode); + } + return (0, decode_js_1.decodeXML)(input); +} +/** + * Decodes a string with entities. Does not allow missing trailing semicolons for entities. + * + * @param input String to decode. + * @param options Decoding options. + * @deprecated Use `decode` with the `mode` set to `Strict`. + */ +function decodeStrict(input, options = EntityLevel.XML) { + var _a; + const normalizedOptions = typeof options === "number" ? { level: options } : options; + (_a = normalizedOptions.mode) !== null && _a !== void 0 ? _a : (normalizedOptions.mode = decode_js_1.DecodingMode.Strict); + return decode(input, normalizedOptions); +} +/** + * Encodes a string with entities. + * + * @param input String to encode. + * @param options Encoding options. + */ +function encode(input, options = EntityLevel.XML) { + const { mode = EncodingMode.Extensive, level = EntityLevel.XML } = typeof options === "number" ? { level: options } : options; + switch (mode) { + case EncodingMode.UTF8: { + return (0, escape_js_1.escapeUTF8)(input); + } + case EncodingMode.Attribute: { + return (0, escape_js_1.escapeAttribute)(input); + } + case EncodingMode.Text: { + return (0, escape_js_1.escapeText)(input); + } + case EncodingMode.ASCII: { + return level === EntityLevel.HTML + ? (0, encode_js_1.encodeNonAsciiHTML)(input) + : (0, escape_js_1.encodeXML)(input); + } + // eslint-disable-next-line unicorn/no-useless-switch-case + case EncodingMode.Extensive: + default: { + return level === EntityLevel.HTML + ? (0, encode_js_1.encodeHTML)(input) + : (0, escape_js_1.encodeXML)(input); + } + } +} +var escape_js_2 = require("./escape.js"); +Object.defineProperty(exports, "encodeXML", { enumerable: true, get: function () { return escape_js_2.encodeXML; } }); +Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return escape_js_2.escape; } }); +Object.defineProperty(exports, "escapeUTF8", { enumerable: true, get: function () { return escape_js_2.escapeUTF8; } }); +Object.defineProperty(exports, "escapeAttribute", { enumerable: true, get: function () { return escape_js_2.escapeAttribute; } }); +Object.defineProperty(exports, "escapeText", { enumerable: true, get: function () { return escape_js_2.escapeText; } }); +var encode_js_2 = require("./encode.js"); +Object.defineProperty(exports, "encodeHTML", { enumerable: true, get: function () { return encode_js_2.encodeHTML; } }); +Object.defineProperty(exports, "encodeNonAsciiHTML", { enumerable: true, get: function () { return encode_js_2.encodeNonAsciiHTML; } }); +// Legacy aliases (deprecated) +Object.defineProperty(exports, "encodeHTML4", { enumerable: true, get: function () { return encode_js_2.encodeHTML; } }); +Object.defineProperty(exports, "encodeHTML5", { enumerable: true, get: function () { return encode_js_2.encodeHTML; } }); +var decode_js_2 = require("./decode.js"); +Object.defineProperty(exports, "EntityDecoder", { enumerable: true, get: function () { return decode_js_2.EntityDecoder; } }); +Object.defineProperty(exports, "DecodingMode", { enumerable: true, get: function () { return decode_js_2.DecodingMode; } }); +Object.defineProperty(exports, "decodeXML", { enumerable: true, get: function () { return decode_js_2.decodeXML; } }); +Object.defineProperty(exports, "decodeHTML", { enumerable: true, get: function () { return decode_js_2.decodeHTML; } }); +Object.defineProperty(exports, "decodeHTMLStrict", { enumerable: true, get: function () { return decode_js_2.decodeHTMLStrict; } }); +Object.defineProperty(exports, "decodeHTMLAttribute", { enumerable: true, get: function () { return decode_js_2.decodeHTMLAttribute; } }); +// Legacy aliases (deprecated) +Object.defineProperty(exports, "decodeHTML4", { enumerable: true, get: function () { return decode_js_2.decodeHTML; } }); +Object.defineProperty(exports, "decodeHTML5", { enumerable: true, get: function () { return decode_js_2.decodeHTML; } }); +Object.defineProperty(exports, "decodeHTML4Strict", { enumerable: true, get: function () { return decode_js_2.decodeHTMLStrict; } }); +Object.defineProperty(exports, "decodeHTML5Strict", { enumerable: true, get: function () { return decode_js_2.decodeHTMLStrict; } }); +Object.defineProperty(exports, "decodeXMLStrict", { enumerable: true, get: function () { return decode_js_2.decodeXML; } }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.js.map new file mode 100644 index 0000000..d3b444d --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/package.json b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/package.json new file mode 100644 index 0000000..5bbefff --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/commonjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.d.ts new file mode 100644 index 0000000..32f77c9 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.d.ts @@ -0,0 +1,19 @@ +/** + * Polyfill for `String.fromCodePoint`. It is used to create a string from a Unicode code point. + */ +export declare const fromCodePoint: (...codePoints: number[]) => string; +/** + * Replace the given code point with a replacement character if it is a + * surrogate or is outside the valid range. Otherwise return the code + * point unchanged. + */ +export declare function replaceCodePoint(codePoint: number): number; +/** + * Replace the code point if relevant, then convert it to a string. + * + * @deprecated Use `fromCodePoint(replaceCodePoint(codePoint))` instead. + * @param codePoint The code point to decode. + * @returns The decoded code point. + */ +export declare function decodeCodePoint(codePoint: number): string; +//# sourceMappingURL=decode-codepoint.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.d.ts.map new file mode 100644 index 0000000..3518e57 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"decode-codepoint.d.ts","sourceRoot":"","sources":["../../src/decode-codepoint.ts"],"names":[],"mappings":"AAkCA;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,CAAC,GAAG,UAAU,EAAE,MAAM,EAAE,KAAK,MAgBpD,CAAC;AAEN;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.js new file mode 100644 index 0000000..561233d --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.js @@ -0,0 +1,72 @@ +// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134 +var _a; +const decodeMap = new Map([ + [0, 65533], + // C1 Unicode control character reference replacements + [128, 8364], + [130, 8218], + [131, 402], + [132, 8222], + [133, 8230], + [134, 8224], + [135, 8225], + [136, 710], + [137, 8240], + [138, 352], + [139, 8249], + [140, 338], + [142, 381], + [145, 8216], + [146, 8217], + [147, 8220], + [148, 8221], + [149, 8226], + [150, 8211], + [151, 8212], + [152, 732], + [153, 8482], + [154, 353], + [155, 8250], + [156, 339], + [158, 382], + [159, 376], +]); +/** + * Polyfill for `String.fromCodePoint`. It is used to create a string from a Unicode code point. + */ +export const fromCodePoint = +// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, n/no-unsupported-features/es-builtins +(_a = String.fromCodePoint) !== null && _a !== void 0 ? _a : function (codePoint) { + let output = ""; + if (codePoint > 65535) { + codePoint -= 65536; + output += String.fromCharCode(((codePoint >>> 10) & 1023) | 55296); + codePoint = 56320 | (codePoint & 1023); + } + output += String.fromCharCode(codePoint); + return output; +}; +/** + * Replace the given code point with a replacement character if it is a + * surrogate or is outside the valid range. Otherwise return the code + * point unchanged. + */ +export function replaceCodePoint(codePoint) { + var _a; + if ((codePoint >= 55296 && codePoint <= 57343) || + codePoint > 1114111) { + return 65533; + } + return (_a = decodeMap.get(codePoint)) !== null && _a !== void 0 ? _a : codePoint; +} +/** + * Replace the code point if relevant, then convert it to a string. + * + * @deprecated Use `fromCodePoint(replaceCodePoint(codePoint))` instead. + * @param codePoint The code point to decode. + * @returns The decoded code point. + */ +export function decodeCodePoint(codePoint) { + return fromCodePoint(replaceCodePoint(codePoint)); +} +//# sourceMappingURL=decode-codepoint.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.js.map new file mode 100644 index 0000000..b807f8c --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode-codepoint.js.map @@ -0,0 +1 @@ +{"version":3,"file":"decode-codepoint.js","sourceRoot":"","sources":["../../src/decode-codepoint.ts"],"names":[],"mappings":"AAAA,qHAAqH;;AAErH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACtB,CAAC,CAAC,EAAE,KAAM,CAAC;IACX,sDAAsD;IACtD,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;CACb,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa;AACtB,8GAA8G;AAC9G,MAAA,MAAM,CAAC,aAAa,mCACpB,UAAU,SAAiB;IACvB,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,IAAI,SAAS,GAAG,KAAO,EAAE,CAAC;QACtB,SAAS,IAAI,KAAS,CAAC;QACvB,MAAM,IAAI,MAAM,CAAC,YAAY,CACzB,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,GAAG,IAAM,CAAC,GAAG,KAAO,CAC1C,CAAC;QACF,SAAS,GAAG,KAAO,GAAG,CAAC,SAAS,GAAG,IAAM,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEN;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;;IAC9C,IACI,CAAC,SAAS,IAAI,KAAO,IAAI,SAAS,IAAI,KAAO,CAAC;QAC9C,SAAS,GAAG,OAAU,EACxB,CAAC;QACC,OAAO,KAAO,CAAC;IACnB,CAAC;IAED,OAAO,MAAA,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAI,SAAS,CAAC;AACjD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC7C,OAAO,aAAa,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;AACtD,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.d.ts new file mode 100644 index 0000000..96c160c --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.d.ts @@ -0,0 +1,209 @@ +export declare enum BinTrieFlags { + VALUE_LENGTH = 49152, + BRANCH_LENGTH = 16256, + JUMP_TABLE = 127 +} +export declare enum DecodingMode { + /** Entities in text nodes that can end with any character. */ + Legacy = 0, + /** Only allow entities terminated with a semicolon. */ + Strict = 1, + /** Entities in attributes have limitations on ending characters. */ + Attribute = 2 +} +/** + * Producers for character reference errors as defined in the HTML spec. + */ +export interface EntityErrorProducer { + missingSemicolonAfterCharacterReference(): void; + absenceOfDigitsInNumericCharacterReference(consumedCharacters: number): void; + validateNumericCharacterReference(code: number): void; +} +/** + * Token decoder with support of writing partial entities. + */ +export declare class EntityDecoder { + /** The tree used to decode entities. */ + private readonly decodeTree; + /** + * The function that is called when a codepoint is decoded. + * + * For multi-byte named entities, this will be called multiple times, + * with the second codepoint, and the same `consumed` value. + * + * @param codepoint The decoded codepoint. + * @param consumed The number of bytes consumed by the decoder. + */ + private readonly emitCodePoint; + /** An object that is used to produce errors. */ + private readonly errors?; + constructor( + /** The tree used to decode entities. */ + decodeTree: Uint16Array, + /** + * The function that is called when a codepoint is decoded. + * + * For multi-byte named entities, this will be called multiple times, + * with the second codepoint, and the same `consumed` value. + * + * @param codepoint The decoded codepoint. + * @param consumed The number of bytes consumed by the decoder. + */ + emitCodePoint: (cp: number, consumed: number) => void, + /** An object that is used to produce errors. */ + errors?: EntityErrorProducer | undefined); + /** The current state of the decoder. */ + private state; + /** Characters that were consumed while parsing an entity. */ + private consumed; + /** + * The result of the entity. + * + * Either the result index of a numeric entity, or the codepoint of a + * numeric entity. + */ + private result; + /** The current index in the decode tree. */ + private treeIndex; + /** The number of characters that were consumed in excess. */ + private excess; + /** The mode in which the decoder is operating. */ + private decodeMode; + /** Resets the instance to make it reusable. */ + startEntity(decodeMode: DecodingMode): void; + /** + * Write an entity to the decoder. This can be called multiple times with partial entities. + * If the entity is incomplete, the decoder will return -1. + * + * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the + * entity is incomplete, and resume when the next string is written. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The offset at which the entity begins. Should be 0 if this is not the first call. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + write(input: string, offset: number): number; + /** + * Switches between the numeric decimal and hexadecimal states. + * + * Equivalent to the `Numeric character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + private stateNumericStart; + private addToNumericResult; + /** + * Parses a hexadecimal numeric entity. + * + * Equivalent to the `Hexademical character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + private stateNumericHex; + /** + * Parses a decimal numeric entity. + * + * Equivalent to the `Decimal character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + private stateNumericDecimal; + /** + * Validate and emit a numeric entity. + * + * Implements the logic from the `Hexademical character reference start + * state` and `Numeric character reference end state` in the HTML spec. + * + * @param lastCp The last code point of the entity. Used to see if the + * entity was terminated with a semicolon. + * @param expectedLength The minimum number of characters that should be + * consumed. Used to validate that at least one digit + * was consumed. + * @returns The number of characters that were consumed. + */ + private emitNumericEntity; + /** + * Parses a named entity. + * + * Equivalent to the `Named character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + private stateNamedEntity; + /** + * Emit a named entity that was not terminated with a semicolon. + * + * @returns The number of characters consumed. + */ + private emitNotTerminatedNamedEntity; + /** + * Emit a named entity. + * + * @param result The index of the entity in the decode tree. + * @param valueLength The number of bytes in the entity. + * @param consumed The number of characters consumed. + * + * @returns The number of characters consumed. + */ + private emitNamedEntityData; + /** + * Signal to the parser that the end of the input was reached. + * + * Remaining data will be emitted and relevant errors will be produced. + * + * @returns The number of characters consumed. + */ + end(): number; +} +/** + * Determines the branch of the current node that is taken given the current + * character. This function is used to traverse the trie. + * + * @param decodeTree The trie. + * @param current The current node. + * @param nodeIdx The index right after the current node and its value. + * @param char The current character. + * @returns The index of the next node, or -1 if no branch is taken. + */ +export declare function determineBranch(decodeTree: Uint16Array, current: number, nodeIndex: number, char: number): number; +/** + * Decodes an HTML string. + * + * @param htmlString The string to decode. + * @param mode The decoding mode. + * @returns The decoded string. + */ +export declare function decodeHTML(htmlString: string, mode?: DecodingMode): string; +/** + * Decodes an HTML string in an attribute. + * + * @param htmlAttribute The string to decode. + * @returns The decoded string. + */ +export declare function decodeHTMLAttribute(htmlAttribute: string): string; +/** + * Decodes an HTML string, requiring all entities to be terminated by a semicolon. + * + * @param htmlString The string to decode. + * @returns The decoded string. + */ +export declare function decodeHTMLStrict(htmlString: string): string; +/** + * Decodes an XML string, requiring all entities to be terminated by a semicolon. + * + * @param xmlString The string to decode. + * @returns The decoded string. + */ +export declare function decodeXML(xmlString: string): string; +export { htmlDecodeTree } from "./generated/decode-data-html.js"; +export { xmlDecodeTree } from "./generated/decode-data-xml.js"; +export { decodeCodePoint, replaceCodePoint, fromCodePoint, } from "./decode-codepoint.js"; +//# sourceMappingURL=decode.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.d.ts.map new file mode 100644 index 0000000..fc233f4 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../../src/decode.ts"],"names":[],"mappings":"AAsBA,oBAAY,YAAY;IACpB,YAAY,QAAwB;IACpC,aAAa,QAAwB;IACrC,UAAU,MAAwB;CACrC;AAuCD,oBAAY,YAAY;IACpB,8DAA8D;IAC9D,MAAM,IAAI;IACV,uDAAuD;IACvD,MAAM,IAAI;IACV,oEAAoE;IACpE,SAAS,IAAI;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,uCAAuC,IAAI,IAAI,CAAC;IAChD,0CAA0C,CACtC,kBAAkB,EAAE,MAAM,GAC3B,IAAI,CAAC;IACR,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACzD;AAED;;GAEG;AACH,qBAAa,aAAa;IAElB,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,gDAAgD;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;;IAbxB,wCAAwC;IACvB,UAAU,EAAE,WAAW;IACxC;;;;;;;;OAQG;IACc,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI;IACtE,gDAAgD;IAC/B,MAAM,CAAC,EAAE,mBAAmB,GAAG,SAAS;IAG7D,wCAAwC;IACxC,OAAO,CAAC,KAAK,CAAkC;IAC/C,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAK;IACrB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAK;IAEnB,4CAA4C;IAC5C,OAAO,CAAC,SAAS,CAAK;IACtB,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAK;IACnB,kDAAkD;IAClD,OAAO,CAAC,UAAU,CAAuB;IAEzC,+CAA+C;IAC/C,WAAW,CAAC,UAAU,EAAE,YAAY,GAAG,IAAI;IAS3C;;;;;;;;;;OAUG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IA8B5C;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,kBAAkB;IAe1B;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAkBvB;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAsDxB;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IAYpC;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;;;;;OAMG;IACH,GAAG,IAAI,MAAM;CA6BhB;AAoDD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC3B,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACb,MAAM,CAsCR;AAKD;;;;;;GAMG;AACH,wBAAgB,UAAU,CACtB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,YAAkC,GACzC,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnD;AAGD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EACH,eAAe,EACf,gBAAgB,EAChB,aAAa,GAChB,MAAM,uBAAuB,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.js new file mode 100644 index 0000000..8e0cb0a --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.js @@ -0,0 +1,497 @@ +import { htmlDecodeTree } from "./generated/decode-data-html.js"; +import { xmlDecodeTree } from "./generated/decode-data-xml.js"; +import { replaceCodePoint, fromCodePoint } from "./decode-codepoint.js"; +var CharCodes; +(function (CharCodes) { + CharCodes[CharCodes["NUM"] = 35] = "NUM"; + CharCodes[CharCodes["SEMI"] = 59] = "SEMI"; + CharCodes[CharCodes["EQUALS"] = 61] = "EQUALS"; + CharCodes[CharCodes["ZERO"] = 48] = "ZERO"; + CharCodes[CharCodes["NINE"] = 57] = "NINE"; + CharCodes[CharCodes["LOWER_A"] = 97] = "LOWER_A"; + CharCodes[CharCodes["LOWER_F"] = 102] = "LOWER_F"; + CharCodes[CharCodes["LOWER_X"] = 120] = "LOWER_X"; + CharCodes[CharCodes["LOWER_Z"] = 122] = "LOWER_Z"; + CharCodes[CharCodes["UPPER_A"] = 65] = "UPPER_A"; + CharCodes[CharCodes["UPPER_F"] = 70] = "UPPER_F"; + CharCodes[CharCodes["UPPER_Z"] = 90] = "UPPER_Z"; +})(CharCodes || (CharCodes = {})); +/** Bit that needs to be set to convert an upper case ASCII character to lower case */ +const TO_LOWER_BIT = 32; +export var BinTrieFlags; +(function (BinTrieFlags) { + BinTrieFlags[BinTrieFlags["VALUE_LENGTH"] = 49152] = "VALUE_LENGTH"; + BinTrieFlags[BinTrieFlags["BRANCH_LENGTH"] = 16256] = "BRANCH_LENGTH"; + BinTrieFlags[BinTrieFlags["JUMP_TABLE"] = 127] = "JUMP_TABLE"; +})(BinTrieFlags || (BinTrieFlags = {})); +function isNumber(code) { + return code >= CharCodes.ZERO && code <= CharCodes.NINE; +} +function isHexadecimalCharacter(code) { + return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F) || + (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F)); +} +function isAsciiAlphaNumeric(code) { + return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z) || + (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z) || + isNumber(code)); +} +/** + * Checks if the given character is a valid end character for an entity in an attribute. + * + * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error. + * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state + */ +function isEntityInAttributeInvalidEnd(code) { + return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code); +} +var EntityDecoderState; +(function (EntityDecoderState) { + EntityDecoderState[EntityDecoderState["EntityStart"] = 0] = "EntityStart"; + EntityDecoderState[EntityDecoderState["NumericStart"] = 1] = "NumericStart"; + EntityDecoderState[EntityDecoderState["NumericDecimal"] = 2] = "NumericDecimal"; + EntityDecoderState[EntityDecoderState["NumericHex"] = 3] = "NumericHex"; + EntityDecoderState[EntityDecoderState["NamedEntity"] = 4] = "NamedEntity"; +})(EntityDecoderState || (EntityDecoderState = {})); +export var DecodingMode; +(function (DecodingMode) { + /** Entities in text nodes that can end with any character. */ + DecodingMode[DecodingMode["Legacy"] = 0] = "Legacy"; + /** Only allow entities terminated with a semicolon. */ + DecodingMode[DecodingMode["Strict"] = 1] = "Strict"; + /** Entities in attributes have limitations on ending characters. */ + DecodingMode[DecodingMode["Attribute"] = 2] = "Attribute"; +})(DecodingMode || (DecodingMode = {})); +/** + * Token decoder with support of writing partial entities. + */ +export class EntityDecoder { + constructor( + /** The tree used to decode entities. */ + decodeTree, + /** + * The function that is called when a codepoint is decoded. + * + * For multi-byte named entities, this will be called multiple times, + * with the second codepoint, and the same `consumed` value. + * + * @param codepoint The decoded codepoint. + * @param consumed The number of bytes consumed by the decoder. + */ + emitCodePoint, + /** An object that is used to produce errors. */ + errors) { + this.decodeTree = decodeTree; + this.emitCodePoint = emitCodePoint; + this.errors = errors; + /** The current state of the decoder. */ + this.state = EntityDecoderState.EntityStart; + /** Characters that were consumed while parsing an entity. */ + this.consumed = 1; + /** + * The result of the entity. + * + * Either the result index of a numeric entity, or the codepoint of a + * numeric entity. + */ + this.result = 0; + /** The current index in the decode tree. */ + this.treeIndex = 0; + /** The number of characters that were consumed in excess. */ + this.excess = 1; + /** The mode in which the decoder is operating. */ + this.decodeMode = DecodingMode.Strict; + } + /** Resets the instance to make it reusable. */ + startEntity(decodeMode) { + this.decodeMode = decodeMode; + this.state = EntityDecoderState.EntityStart; + this.result = 0; + this.treeIndex = 0; + this.excess = 1; + this.consumed = 1; + } + /** + * Write an entity to the decoder. This can be called multiple times with partial entities. + * If the entity is incomplete, the decoder will return -1. + * + * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the + * entity is incomplete, and resume when the next string is written. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The offset at which the entity begins. Should be 0 if this is not the first call. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + write(input, offset) { + switch (this.state) { + case EntityDecoderState.EntityStart: { + if (input.charCodeAt(offset) === CharCodes.NUM) { + this.state = EntityDecoderState.NumericStart; + this.consumed += 1; + return this.stateNumericStart(input, offset + 1); + } + this.state = EntityDecoderState.NamedEntity; + return this.stateNamedEntity(input, offset); + } + case EntityDecoderState.NumericStart: { + return this.stateNumericStart(input, offset); + } + case EntityDecoderState.NumericDecimal: { + return this.stateNumericDecimal(input, offset); + } + case EntityDecoderState.NumericHex: { + return this.stateNumericHex(input, offset); + } + case EntityDecoderState.NamedEntity: { + return this.stateNamedEntity(input, offset); + } + } + } + /** + * Switches between the numeric decimal and hexadecimal states. + * + * Equivalent to the `Numeric character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + stateNumericStart(input, offset) { + if (offset >= input.length) { + return -1; + } + if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) { + this.state = EntityDecoderState.NumericHex; + this.consumed += 1; + return this.stateNumericHex(input, offset + 1); + } + this.state = EntityDecoderState.NumericDecimal; + return this.stateNumericDecimal(input, offset); + } + addToNumericResult(input, start, end, base) { + if (start !== end) { + const digitCount = end - start; + this.result = + this.result * Math.pow(base, digitCount) + + Number.parseInt(input.substr(start, digitCount), base); + this.consumed += digitCount; + } + } + /** + * Parses a hexadecimal numeric entity. + * + * Equivalent to the `Hexademical character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + stateNumericHex(input, offset) { + const startIndex = offset; + while (offset < input.length) { + const char = input.charCodeAt(offset); + if (isNumber(char) || isHexadecimalCharacter(char)) { + offset += 1; + } + else { + this.addToNumericResult(input, startIndex, offset, 16); + return this.emitNumericEntity(char, 3); + } + } + this.addToNumericResult(input, startIndex, offset, 16); + return -1; + } + /** + * Parses a decimal numeric entity. + * + * Equivalent to the `Decimal character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + stateNumericDecimal(input, offset) { + const startIndex = offset; + while (offset < input.length) { + const char = input.charCodeAt(offset); + if (isNumber(char)) { + offset += 1; + } + else { + this.addToNumericResult(input, startIndex, offset, 10); + return this.emitNumericEntity(char, 2); + } + } + this.addToNumericResult(input, startIndex, offset, 10); + return -1; + } + /** + * Validate and emit a numeric entity. + * + * Implements the logic from the `Hexademical character reference start + * state` and `Numeric character reference end state` in the HTML spec. + * + * @param lastCp The last code point of the entity. Used to see if the + * entity was terminated with a semicolon. + * @param expectedLength The minimum number of characters that should be + * consumed. Used to validate that at least one digit + * was consumed. + * @returns The number of characters that were consumed. + */ + emitNumericEntity(lastCp, expectedLength) { + var _a; + // Ensure we consumed at least one digit. + if (this.consumed <= expectedLength) { + (_a = this.errors) === null || _a === void 0 ? void 0 : _a.absenceOfDigitsInNumericCharacterReference(this.consumed); + return 0; + } + // Figure out if this is a legit end of the entity + if (lastCp === CharCodes.SEMI) { + this.consumed += 1; + } + else if (this.decodeMode === DecodingMode.Strict) { + return 0; + } + this.emitCodePoint(replaceCodePoint(this.result), this.consumed); + if (this.errors) { + if (lastCp !== CharCodes.SEMI) { + this.errors.missingSemicolonAfterCharacterReference(); + } + this.errors.validateNumericCharacterReference(this.result); + } + return this.consumed; + } + /** + * Parses a named entity. + * + * Equivalent to the `Named character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + stateNamedEntity(input, offset) { + const { decodeTree } = this; + let current = decodeTree[this.treeIndex]; + // The mask is the number of bytes of the value, including the current byte. + let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14; + for (; offset < input.length; offset++, this.excess++) { + const char = input.charCodeAt(offset); + this.treeIndex = determineBranch(decodeTree, current, this.treeIndex + Math.max(1, valueLength), char); + if (this.treeIndex < 0) { + return this.result === 0 || + // If we are parsing an attribute + (this.decodeMode === DecodingMode.Attribute && + // We shouldn't have consumed any characters after the entity, + (valueLength === 0 || + // And there should be no invalid characters. + isEntityInAttributeInvalidEnd(char))) + ? 0 + : this.emitNotTerminatedNamedEntity(); + } + current = decodeTree[this.treeIndex]; + valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14; + // If the branch is a value, store it and continue + if (valueLength !== 0) { + // If the entity is terminated by a semicolon, we are done. + if (char === CharCodes.SEMI) { + return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess); + } + // If we encounter a non-terminated (legacy) entity while parsing strictly, then ignore it. + if (this.decodeMode !== DecodingMode.Strict) { + this.result = this.treeIndex; + this.consumed += this.excess; + this.excess = 0; + } + } + } + return -1; + } + /** + * Emit a named entity that was not terminated with a semicolon. + * + * @returns The number of characters consumed. + */ + emitNotTerminatedNamedEntity() { + var _a; + const { result, decodeTree } = this; + const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14; + this.emitNamedEntityData(result, valueLength, this.consumed); + (_a = this.errors) === null || _a === void 0 ? void 0 : _a.missingSemicolonAfterCharacterReference(); + return this.consumed; + } + /** + * Emit a named entity. + * + * @param result The index of the entity in the decode tree. + * @param valueLength The number of bytes in the entity. + * @param consumed The number of characters consumed. + * + * @returns The number of characters consumed. + */ + emitNamedEntityData(result, valueLength, consumed) { + const { decodeTree } = this; + this.emitCodePoint(valueLength === 1 + ? decodeTree[result] & ~BinTrieFlags.VALUE_LENGTH + : decodeTree[result + 1], consumed); + if (valueLength === 3) { + // For multi-byte values, we need to emit the second byte. + this.emitCodePoint(decodeTree[result + 2], consumed); + } + return consumed; + } + /** + * Signal to the parser that the end of the input was reached. + * + * Remaining data will be emitted and relevant errors will be produced. + * + * @returns The number of characters consumed. + */ + end() { + var _a; + switch (this.state) { + case EntityDecoderState.NamedEntity: { + // Emit a named entity if we have one. + return this.result !== 0 && + (this.decodeMode !== DecodingMode.Attribute || + this.result === this.treeIndex) + ? this.emitNotTerminatedNamedEntity() + : 0; + } + // Otherwise, emit a numeric entity if we have one. + case EntityDecoderState.NumericDecimal: { + return this.emitNumericEntity(0, 2); + } + case EntityDecoderState.NumericHex: { + return this.emitNumericEntity(0, 3); + } + case EntityDecoderState.NumericStart: { + (_a = this.errors) === null || _a === void 0 ? void 0 : _a.absenceOfDigitsInNumericCharacterReference(this.consumed); + return 0; + } + case EntityDecoderState.EntityStart: { + // Return 0 if we have no entity. + return 0; + } + } + } +} +/** + * Creates a function that decodes entities in a string. + * + * @param decodeTree The decode tree. + * @returns A function that decodes entities in a string. + */ +function getDecoder(decodeTree) { + let returnValue = ""; + const decoder = new EntityDecoder(decodeTree, (data) => (returnValue += fromCodePoint(data))); + return function decodeWithTrie(input, decodeMode) { + let lastIndex = 0; + let offset = 0; + while ((offset = input.indexOf("&", offset)) >= 0) { + returnValue += input.slice(lastIndex, offset); + decoder.startEntity(decodeMode); + const length = decoder.write(input, + // Skip the "&" + offset + 1); + if (length < 0) { + lastIndex = offset + decoder.end(); + break; + } + lastIndex = offset + length; + // If `length` is 0, skip the current `&` and continue. + offset = length === 0 ? lastIndex + 1 : lastIndex; + } + const result = returnValue + input.slice(lastIndex); + // Make sure we don't keep a reference to the final string. + returnValue = ""; + return result; + }; +} +/** + * Determines the branch of the current node that is taken given the current + * character. This function is used to traverse the trie. + * + * @param decodeTree The trie. + * @param current The current node. + * @param nodeIdx The index right after the current node and its value. + * @param char The current character. + * @returns The index of the next node, or -1 if no branch is taken. + */ +export function determineBranch(decodeTree, current, nodeIndex, char) { + const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7; + const jumpOffset = current & BinTrieFlags.JUMP_TABLE; + // Case 1: Single branch encoded in jump offset + if (branchCount === 0) { + return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1; + } + // Case 2: Multiple branches encoded in jump table + if (jumpOffset) { + const value = char - jumpOffset; + return value < 0 || value >= branchCount + ? -1 + : decodeTree[nodeIndex + value] - 1; + } + // Case 3: Multiple branches encoded in dictionary + // Binary search for the character. + let lo = nodeIndex; + let hi = lo + branchCount - 1; + while (lo <= hi) { + const mid = (lo + hi) >>> 1; + const midValue = decodeTree[mid]; + if (midValue < char) { + lo = mid + 1; + } + else if (midValue > char) { + hi = mid - 1; + } + else { + return decodeTree[mid + branchCount]; + } + } + return -1; +} +const htmlDecoder = /* #__PURE__ */ getDecoder(htmlDecodeTree); +const xmlDecoder = /* #__PURE__ */ getDecoder(xmlDecodeTree); +/** + * Decodes an HTML string. + * + * @param htmlString The string to decode. + * @param mode The decoding mode. + * @returns The decoded string. + */ +export function decodeHTML(htmlString, mode = DecodingMode.Legacy) { + return htmlDecoder(htmlString, mode); +} +/** + * Decodes an HTML string in an attribute. + * + * @param htmlAttribute The string to decode. + * @returns The decoded string. + */ +export function decodeHTMLAttribute(htmlAttribute) { + return htmlDecoder(htmlAttribute, DecodingMode.Attribute); +} +/** + * Decodes an HTML string, requiring all entities to be terminated by a semicolon. + * + * @param htmlString The string to decode. + * @returns The decoded string. + */ +export function decodeHTMLStrict(htmlString) { + return htmlDecoder(htmlString, DecodingMode.Strict); +} +/** + * Decodes an XML string, requiring all entities to be terminated by a semicolon. + * + * @param xmlString The string to decode. + * @returns The decoded string. + */ +export function decodeXML(xmlString) { + return xmlDecoder(xmlString, DecodingMode.Strict); +} +// Re-export for use by eg. htmlparser2 +export { htmlDecodeTree } from "./generated/decode-data-html.js"; +export { xmlDecodeTree } from "./generated/decode-data-xml.js"; +export { decodeCodePoint, replaceCodePoint, fromCodePoint, } from "./decode-codepoint.js"; +//# sourceMappingURL=decode.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.js.map new file mode 100644 index 0000000..be71236 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/decode.js.map @@ -0,0 +1 @@ +{"version":3,"file":"decode.js","sourceRoot":"","sources":["../../src/decode.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.d.ts new file mode 100644 index 0000000..e110bea --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.d.ts @@ -0,0 +1,22 @@ +/** + * Encodes all characters in the input using HTML entities. This includes + * characters that are valid ASCII characters in HTML documents, such as `#`. + * + * To get a more compact output, consider using the `encodeNonAsciiHTML` + * function, which will only encode characters that are not valid in HTML + * documents, as well as non-ASCII characters. + * + * If a character has no equivalent entity, a numeric hexadecimal reference + * (eg. `ü`) will be used. + */ +export declare function encodeHTML(input: string): string; +/** + * Encodes all non-ASCII characters, as well as characters not valid in HTML + * documents using HTML entities. This function will not encode characters that + * are valid in HTML documents, such as `#`. + * + * If a character has no equivalent entity, a numeric hexadecimal reference + * (eg. `ü`) will be used. + */ +export declare function encodeNonAsciiHTML(input: string): string; +//# sourceMappingURL=encode.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.d.ts.map new file mode 100644 index 0000000..3ef0d10 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AACD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.js new file mode 100644 index 0000000..055c910 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.js @@ -0,0 +1,69 @@ +import { htmlTrie } from "./generated/encode-html.js"; +import { xmlReplacer, getCodePoint } from "./escape.js"; +const htmlReplacer = /[\t\n\f!-,./:-@[-`{-}\u0080-\uFFFF]/g; +/** + * Encodes all characters in the input using HTML entities. This includes + * characters that are valid ASCII characters in HTML documents, such as `#`. + * + * To get a more compact output, consider using the `encodeNonAsciiHTML` + * function, which will only encode characters that are not valid in HTML + * documents, as well as non-ASCII characters. + * + * If a character has no equivalent entity, a numeric hexadecimal reference + * (eg. `ü`) will be used. + */ +export function encodeHTML(input) { + return encodeHTMLTrieRe(htmlReplacer, input); +} +/** + * Encodes all non-ASCII characters, as well as characters not valid in HTML + * documents using HTML entities. This function will not encode characters that + * are valid in HTML documents, such as `#`. + * + * If a character has no equivalent entity, a numeric hexadecimal reference + * (eg. `ü`) will be used. + */ +export function encodeNonAsciiHTML(input) { + return encodeHTMLTrieRe(xmlReplacer, input); +} +function encodeHTMLTrieRe(regExp, input) { + let returnValue = ""; + let lastIndex = 0; + let match; + while ((match = regExp.exec(input)) !== null) { + const { index } = match; + returnValue += input.substring(lastIndex, index); + const char = input.charCodeAt(index); + let next = htmlTrie.get(char); + if (typeof next === "object") { + // We are in a branch. Try to match the next char. + if (index + 1 < input.length) { + const nextChar = input.charCodeAt(index + 1); + const value = typeof next.n === "number" + ? next.n === nextChar + ? next.o + : undefined + : next.n.get(nextChar); + if (value !== undefined) { + returnValue += value; + lastIndex = regExp.lastIndex += 1; + continue; + } + } + next = next.v; + } + // We might have a tree node without a value; skip and use a numeric entity. + if (next === undefined) { + const cp = getCodePoint(input, index); + returnValue += `&#x${cp.toString(16)};`; + // Increase by 1 if we have a surrogate pair + lastIndex = regExp.lastIndex += Number(cp !== char); + } + else { + returnValue += next; + lastIndex = index + 1; + } + } + return returnValue + input.substr(lastIndex); +} +//# sourceMappingURL=encode.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.js.map new file mode 100644 index 0000000..942f614 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/encode.js.map @@ -0,0 +1 @@ +{"version":3,"file":"encode.js","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,YAAY,GAAG,sCAAsC,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACpC,OAAO,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AACD;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC5C,OAAO,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc,EAAE,KAAa;IACnD,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;QACxB,WAAW,IAAI,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,kDAAkD;YAClD,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC7C,MAAM,KAAK,GACP,OAAO,IAAI,CAAC,CAAC,KAAK,QAAQ;oBACtB,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,QAAQ;wBACjB,CAAC,CAAC,IAAI,CAAC,CAAC;wBACR,CAAC,CAAC,SAAS;oBACf,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAE/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACtB,WAAW,IAAI,KAAK,CAAC;oBACrB,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;oBAClC,SAAS;gBACb,CAAC;YACL,CAAC;YAED,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,4EAA4E;QAC5E,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACtC,WAAW,IAAI,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC;YACxC,4CAA4C;YAC5C,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACJ,WAAW,IAAI,IAAI,CAAC;YACpB,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;QAC1B,CAAC;IACL,CAAC;IAED,OAAO,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACjD,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.d.ts new file mode 100644 index 0000000..19bfc87 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.d.ts @@ -0,0 +1,43 @@ +export declare const xmlReplacer: RegExp; +export declare const getCodePoint: (c: string, index: number) => number; +/** + * Encodes all non-ASCII characters, as well as characters not valid in XML + * documents using XML entities. + * + * If a character has no equivalent entity, a + * numeric hexadecimal reference (eg. `ü`) will be used. + */ +export declare function encodeXML(input: string): string; +/** + * Encodes all non-ASCII characters, as well as characters not valid in XML + * documents using numeric hexadecimal reference (eg. `ü`). + * + * Have a look at `escapeUTF8` if you want a more concise output at the expense + * of reduced transportability. + * + * @param data String to escape. + */ +export declare const escape: typeof encodeXML; +/** + * Encodes all characters not valid in XML documents using XML entities. + * + * Note that the output will be character-set dependent. + * + * @param data String to escape. + */ +export declare const escapeUTF8: (data: string) => string; +/** + * Encodes all characters that have to be escaped in HTML attributes, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + * + * @param data String to escape. + */ +export declare const escapeAttribute: (data: string) => string; +/** + * Encodes all characters that have to be escaped in HTML text, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + * + * @param data String to escape. + */ +export declare const escapeText: (data: string) => string; +//# sourceMappingURL=escape.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.d.ts.map new file mode 100644 index 0000000..02a129c --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,EAAE,MAAiC,CAAC;AAW5D,eAAO,MAAM,YAAY,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAWoB,CAAC;AAE9E;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA0B/C;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,EAAE,OAAO,SAAqB,CAAC;AAqClD;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAG1C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAQ3C,CAAC;AAEN;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAQ1C,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.js new file mode 100644 index 0000000..98aaa31 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.js @@ -0,0 +1,117 @@ +export const xmlReplacer = /["$&'<>\u0080-\uFFFF]/g; +const xmlCodeMap = new Map([ + [34, """], + [38, "&"], + [39, "'"], + [60, "<"], + [62, ">"], +]); +// For compatibility with node < 4, we wrap `codePointAt` +export const getCodePoint = +// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition +String.prototype.codePointAt == null + ? (c, index) => (c.charCodeAt(index) & 64512) === 55296 + ? (c.charCodeAt(index) - 55296) * 1024 + + c.charCodeAt(index + 1) - + 56320 + + 65536 + : c.charCodeAt(index) + : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + (input, index) => input.codePointAt(index); +/** + * Encodes all non-ASCII characters, as well as characters not valid in XML + * documents using XML entities. + * + * If a character has no equivalent entity, a + * numeric hexadecimal reference (eg. `ü`) will be used. + */ +export function encodeXML(input) { + let returnValue = ""; + let lastIndex = 0; + let match; + while ((match = xmlReplacer.exec(input)) !== null) { + const { index } = match; + const char = input.charCodeAt(index); + const next = xmlCodeMap.get(char); + if (next === undefined) { + returnValue += `${input.substring(lastIndex, index)}&#x${getCodePoint(input, index).toString(16)};`; + // Increase by 1 if we have a surrogate pair + lastIndex = xmlReplacer.lastIndex += Number((char & 64512) === 55296); + } + else { + returnValue += input.substring(lastIndex, index) + next; + lastIndex = index + 1; + } + } + return returnValue + input.substr(lastIndex); +} +/** + * Encodes all non-ASCII characters, as well as characters not valid in XML + * documents using numeric hexadecimal reference (eg. `ü`). + * + * Have a look at `escapeUTF8` if you want a more concise output at the expense + * of reduced transportability. + * + * @param data String to escape. + */ +export const escape = encodeXML; +/** + * Creates a function that escapes all characters matched by the given regular + * expression using the given map of characters to escape to their entities. + * + * @param regex Regular expression to match characters to escape. + * @param map Map of characters to escape to their entities. + * + * @returns Function that escapes all characters matched by the given regular + * expression using the given map of characters to escape to their entities. + */ +function getEscaper(regex, map) { + return function escape(data) { + let match; + let lastIndex = 0; + let result = ""; + while ((match = regex.exec(data))) { + if (lastIndex !== match.index) { + result += data.substring(lastIndex, match.index); + } + // We know that this character will be in the map. + result += map.get(match[0].charCodeAt(0)); + // Every match will be of length 1 + lastIndex = match.index + 1; + } + return result + data.substring(lastIndex); + }; +} +/** + * Encodes all characters not valid in XML documents using XML entities. + * + * Note that the output will be character-set dependent. + * + * @param data String to escape. + */ +export const escapeUTF8 = /* #__PURE__ */ getEscaper(/["&'<>]/g, xmlCodeMap); +/** + * Encodes all characters that have to be escaped in HTML attributes, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + * + * @param data String to escape. + */ +export const escapeAttribute = +/* #__PURE__ */ getEscaper(/["&\u00A0]/g, new Map([ + [34, """], + [38, "&"], + [160, " "], +])); +/** + * Encodes all characters that have to be escaped in HTML text, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + * + * @param data String to escape. + */ +export const escapeText = /* #__PURE__ */ getEscaper(/[&<>\u00A0]/g, new Map([ + [38, "&"], + [60, "<"], + [62, ">"], + [160, " "], +])); +//# sourceMappingURL=escape.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.js.map new file mode 100644 index 0000000..4349bea --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/escape.js.map @@ -0,0 +1 @@ +{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.d.ts new file mode 100644 index 0000000..cd09535 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.d.ts @@ -0,0 +1,2 @@ +export declare const htmlDecodeTree: Uint16Array; +//# sourceMappingURL=decode-data-html.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.d.ts.map new file mode 100644 index 0000000..6bb1ecf --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"decode-data-html.d.ts","sourceRoot":"","sources":["../../../src/generated/decode-data-html.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,EAAE,WAK5B,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.js new file mode 100644 index 0000000..878d5de --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.js @@ -0,0 +1,7 @@ +// Generated using scripts/write-decode-map.ts +export const htmlDecodeTree = /* #__PURE__ */ new Uint16Array( +// prettier-ignore +/* #__PURE__ */ "\u1d41<\xd5\u0131\u028a\u049d\u057b\u05d0\u0675\u06de\u07a2\u07d6\u080f\u0a4a\u0a91\u0da1\u0e6d\u0f09\u0f26\u10ca\u1228\u12e1\u1415\u149d\u14c3\u14df\u1525\0\0\0\0\0\0\u156b\u16cd\u198d\u1c12\u1ddd\u1f7e\u2060\u21b0\u228d\u23c0\u23fb\u2442\u2824\u2912\u2d08\u2e48\u2fce\u3016\u32ba\u3639\u37ac\u38fe\u3a28\u3a71\u3ae0\u3b2e\u0800EMabcfglmnoprstu\\bfms\x7f\x84\x8b\x90\x95\x98\xa6\xb3\xb9\xc8\xcflig\u803b\xc6\u40c6P\u803b&\u4026cute\u803b\xc1\u40c1reve;\u4102\u0100iyx}rc\u803b\xc2\u40c2;\u4410r;\uc000\ud835\udd04rave\u803b\xc0\u40c0pha;\u4391acr;\u4100d;\u6a53\u0100gp\x9d\xa1on;\u4104f;\uc000\ud835\udd38plyFunction;\u6061ing\u803b\xc5\u40c5\u0100cs\xbe\xc3r;\uc000\ud835\udc9cign;\u6254ilde\u803b\xc3\u40c3ml\u803b\xc4\u40c4\u0400aceforsu\xe5\xfb\xfe\u0117\u011c\u0122\u0127\u012a\u0100cr\xea\xf2kslash;\u6216\u0176\xf6\xf8;\u6ae7ed;\u6306y;\u4411\u0180crt\u0105\u010b\u0114ause;\u6235noullis;\u612ca;\u4392r;\uc000\ud835\udd05pf;\uc000\ud835\udd39eve;\u42d8c\xf2\u0113mpeq;\u624e\u0700HOacdefhilorsu\u014d\u0151\u0156\u0180\u019e\u01a2\u01b5\u01b7\u01ba\u01dc\u0215\u0273\u0278\u027ecy;\u4427PY\u803b\xa9\u40a9\u0180cpy\u015d\u0162\u017aute;\u4106\u0100;i\u0167\u0168\u62d2talDifferentialD;\u6145leys;\u612d\u0200aeio\u0189\u018e\u0194\u0198ron;\u410cdil\u803b\xc7\u40c7rc;\u4108nint;\u6230ot;\u410a\u0100dn\u01a7\u01adilla;\u40b8terDot;\u40b7\xf2\u017fi;\u43a7rcle\u0200DMPT\u01c7\u01cb\u01d1\u01d6ot;\u6299inus;\u6296lus;\u6295imes;\u6297o\u0100cs\u01e2\u01f8kwiseContourIntegral;\u6232eCurly\u0100DQ\u0203\u020foubleQuote;\u601duote;\u6019\u0200lnpu\u021e\u0228\u0247\u0255on\u0100;e\u0225\u0226\u6237;\u6a74\u0180git\u022f\u0236\u023aruent;\u6261nt;\u622fourIntegral;\u622e\u0100fr\u024c\u024e;\u6102oduct;\u6210nterClockwiseContourIntegral;\u6233oss;\u6a2fcr;\uc000\ud835\udc9ep\u0100;C\u0284\u0285\u62d3ap;\u624d\u0580DJSZacefios\u02a0\u02ac\u02b0\u02b4\u02b8\u02cb\u02d7\u02e1\u02e6\u0333\u048d\u0100;o\u0179\u02a5trahd;\u6911cy;\u4402cy;\u4405cy;\u440f\u0180grs\u02bf\u02c4\u02c7ger;\u6021r;\u61a1hv;\u6ae4\u0100ay\u02d0\u02d5ron;\u410e;\u4414l\u0100;t\u02dd\u02de\u6207a;\u4394r;\uc000\ud835\udd07\u0100af\u02eb\u0327\u0100cm\u02f0\u0322ritical\u0200ADGT\u0300\u0306\u0316\u031ccute;\u40b4o\u0174\u030b\u030d;\u42d9bleAcute;\u42ddrave;\u4060ilde;\u42dcond;\u62c4ferentialD;\u6146\u0470\u033d\0\0\0\u0342\u0354\0\u0405f;\uc000\ud835\udd3b\u0180;DE\u0348\u0349\u034d\u40a8ot;\u60dcqual;\u6250ble\u0300CDLRUV\u0363\u0372\u0382\u03cf\u03e2\u03f8ontourIntegra\xec\u0239o\u0274\u0379\0\0\u037b\xbb\u0349nArrow;\u61d3\u0100eo\u0387\u03a4ft\u0180ART\u0390\u0396\u03a1rrow;\u61d0ightArrow;\u61d4e\xe5\u02cang\u0100LR\u03ab\u03c4eft\u0100AR\u03b3\u03b9rrow;\u67f8ightArrow;\u67faightArrow;\u67f9ight\u0100AT\u03d8\u03derrow;\u61d2ee;\u62a8p\u0241\u03e9\0\0\u03efrrow;\u61d1ownArrow;\u61d5erticalBar;\u6225n\u0300ABLRTa\u0412\u042a\u0430\u045e\u047f\u037crrow\u0180;BU\u041d\u041e\u0422\u6193ar;\u6913pArrow;\u61f5reve;\u4311eft\u02d2\u043a\0\u0446\0\u0450ightVector;\u6950eeVector;\u695eector\u0100;B\u0459\u045a\u61bdar;\u6956ight\u01d4\u0467\0\u0471eeVector;\u695fector\u0100;B\u047a\u047b\u61c1ar;\u6957ee\u0100;A\u0486\u0487\u62a4rrow;\u61a7\u0100ct\u0492\u0497r;\uc000\ud835\udc9frok;\u4110\u0800NTacdfglmopqstux\u04bd\u04c0\u04c4\u04cb\u04de\u04e2\u04e7\u04ee\u04f5\u0521\u052f\u0536\u0552\u055d\u0560\u0565G;\u414aH\u803b\xd0\u40d0cute\u803b\xc9\u40c9\u0180aiy\u04d2\u04d7\u04dcron;\u411arc\u803b\xca\u40ca;\u442dot;\u4116r;\uc000\ud835\udd08rave\u803b\xc8\u40c8ement;\u6208\u0100ap\u04fa\u04fecr;\u4112ty\u0253\u0506\0\0\u0512mallSquare;\u65fberySmallSquare;\u65ab\u0100gp\u0526\u052aon;\u4118f;\uc000\ud835\udd3csilon;\u4395u\u0100ai\u053c\u0549l\u0100;T\u0542\u0543\u6a75ilde;\u6242librium;\u61cc\u0100ci\u0557\u055ar;\u6130m;\u6a73a;\u4397ml\u803b\xcb\u40cb\u0100ip\u056a\u056fsts;\u6203onentialE;\u6147\u0280cfios\u0585\u0588\u058d\u05b2\u05ccy;\u4424r;\uc000\ud835\udd09lled\u0253\u0597\0\0\u05a3mallSquare;\u65fcerySmallSquare;\u65aa\u0370\u05ba\0\u05bf\0\0\u05c4f;\uc000\ud835\udd3dAll;\u6200riertrf;\u6131c\xf2\u05cb\u0600JTabcdfgorst\u05e8\u05ec\u05ef\u05fa\u0600\u0612\u0616\u061b\u061d\u0623\u066c\u0672cy;\u4403\u803b>\u403emma\u0100;d\u05f7\u05f8\u4393;\u43dcreve;\u411e\u0180eiy\u0607\u060c\u0610dil;\u4122rc;\u411c;\u4413ot;\u4120r;\uc000\ud835\udd0a;\u62d9pf;\uc000\ud835\udd3eeater\u0300EFGLST\u0635\u0644\u064e\u0656\u065b\u0666qual\u0100;L\u063e\u063f\u6265ess;\u62dbullEqual;\u6267reater;\u6aa2ess;\u6277lantEqual;\u6a7eilde;\u6273cr;\uc000\ud835\udca2;\u626b\u0400Aacfiosu\u0685\u068b\u0696\u069b\u069e\u06aa\u06be\u06caRDcy;\u442a\u0100ct\u0690\u0694ek;\u42c7;\u405eirc;\u4124r;\u610clbertSpace;\u610b\u01f0\u06af\0\u06b2f;\u610dizontalLine;\u6500\u0100ct\u06c3\u06c5\xf2\u06a9rok;\u4126mp\u0144\u06d0\u06d8ownHum\xf0\u012fqual;\u624f\u0700EJOacdfgmnostu\u06fa\u06fe\u0703\u0707\u070e\u071a\u071e\u0721\u0728\u0744\u0778\u078b\u078f\u0795cy;\u4415lig;\u4132cy;\u4401cute\u803b\xcd\u40cd\u0100iy\u0713\u0718rc\u803b\xce\u40ce;\u4418ot;\u4130r;\u6111rave\u803b\xcc\u40cc\u0180;ap\u0720\u072f\u073f\u0100cg\u0734\u0737r;\u412ainaryI;\u6148lie\xf3\u03dd\u01f4\u0749\0\u0762\u0100;e\u074d\u074e\u622c\u0100gr\u0753\u0758ral;\u622bsection;\u62c2isible\u0100CT\u076c\u0772omma;\u6063imes;\u6062\u0180gpt\u077f\u0783\u0788on;\u412ef;\uc000\ud835\udd40a;\u4399cr;\u6110ilde;\u4128\u01eb\u079a\0\u079ecy;\u4406l\u803b\xcf\u40cf\u0280cfosu\u07ac\u07b7\u07bc\u07c2\u07d0\u0100iy\u07b1\u07b5rc;\u4134;\u4419r;\uc000\ud835\udd0dpf;\uc000\ud835\udd41\u01e3\u07c7\0\u07ccr;\uc000\ud835\udca5rcy;\u4408kcy;\u4404\u0380HJacfos\u07e4\u07e8\u07ec\u07f1\u07fd\u0802\u0808cy;\u4425cy;\u440cppa;\u439a\u0100ey\u07f6\u07fbdil;\u4136;\u441ar;\uc000\ud835\udd0epf;\uc000\ud835\udd42cr;\uc000\ud835\udca6\u0580JTaceflmost\u0825\u0829\u082c\u0850\u0863\u09b3\u09b8\u09c7\u09cd\u0a37\u0a47cy;\u4409\u803b<\u403c\u0280cmnpr\u0837\u083c\u0841\u0844\u084dute;\u4139bda;\u439bg;\u67ealacetrf;\u6112r;\u619e\u0180aey\u0857\u085c\u0861ron;\u413ddil;\u413b;\u441b\u0100fs\u0868\u0970t\u0500ACDFRTUVar\u087e\u08a9\u08b1\u08e0\u08e6\u08fc\u092f\u095b\u0390\u096a\u0100nr\u0883\u088fgleBracket;\u67e8row\u0180;BR\u0899\u089a\u089e\u6190ar;\u61e4ightArrow;\u61c6eiling;\u6308o\u01f5\u08b7\0\u08c3bleBracket;\u67e6n\u01d4\u08c8\0\u08d2eeVector;\u6961ector\u0100;B\u08db\u08dc\u61c3ar;\u6959loor;\u630aight\u0100AV\u08ef\u08f5rrow;\u6194ector;\u694e\u0100er\u0901\u0917e\u0180;AV\u0909\u090a\u0910\u62a3rrow;\u61a4ector;\u695aiangle\u0180;BE\u0924\u0925\u0929\u62b2ar;\u69cfqual;\u62b4p\u0180DTV\u0937\u0942\u094cownVector;\u6951eeVector;\u6960ector\u0100;B\u0956\u0957\u61bfar;\u6958ector\u0100;B\u0965\u0966\u61bcar;\u6952ight\xe1\u039cs\u0300EFGLST\u097e\u098b\u0995\u099d\u09a2\u09adqualGreater;\u62daullEqual;\u6266reater;\u6276ess;\u6aa1lantEqual;\u6a7dilde;\u6272r;\uc000\ud835\udd0f\u0100;e\u09bd\u09be\u62d8ftarrow;\u61daidot;\u413f\u0180npw\u09d4\u0a16\u0a1bg\u0200LRlr\u09de\u09f7\u0a02\u0a10eft\u0100AR\u09e6\u09ecrrow;\u67f5ightArrow;\u67f7ightArrow;\u67f6eft\u0100ar\u03b3\u0a0aight\xe1\u03bfight\xe1\u03caf;\uc000\ud835\udd43er\u0100LR\u0a22\u0a2ceftArrow;\u6199ightArrow;\u6198\u0180cht\u0a3e\u0a40\u0a42\xf2\u084c;\u61b0rok;\u4141;\u626a\u0400acefiosu\u0a5a\u0a5d\u0a60\u0a77\u0a7c\u0a85\u0a8b\u0a8ep;\u6905y;\u441c\u0100dl\u0a65\u0a6fiumSpace;\u605flintrf;\u6133r;\uc000\ud835\udd10nusPlus;\u6213pf;\uc000\ud835\udd44c\xf2\u0a76;\u439c\u0480Jacefostu\u0aa3\u0aa7\u0aad\u0ac0\u0b14\u0b19\u0d91\u0d97\u0d9ecy;\u440acute;\u4143\u0180aey\u0ab4\u0ab9\u0aberon;\u4147dil;\u4145;\u441d\u0180gsw\u0ac7\u0af0\u0b0eative\u0180MTV\u0ad3\u0adf\u0ae8ediumSpace;\u600bhi\u0100cn\u0ae6\u0ad8\xeb\u0ad9eryThi\xee\u0ad9ted\u0100GL\u0af8\u0b06reaterGreate\xf2\u0673essLes\xf3\u0a48Line;\u400ar;\uc000\ud835\udd11\u0200Bnpt\u0b22\u0b28\u0b37\u0b3areak;\u6060BreakingSpace;\u40a0f;\u6115\u0680;CDEGHLNPRSTV\u0b55\u0b56\u0b6a\u0b7c\u0ba1\u0beb\u0c04\u0c5e\u0c84\u0ca6\u0cd8\u0d61\u0d85\u6aec\u0100ou\u0b5b\u0b64ngruent;\u6262pCap;\u626doubleVerticalBar;\u6226\u0180lqx\u0b83\u0b8a\u0b9bement;\u6209ual\u0100;T\u0b92\u0b93\u6260ilde;\uc000\u2242\u0338ists;\u6204reater\u0380;EFGLST\u0bb6\u0bb7\u0bbd\u0bc9\u0bd3\u0bd8\u0be5\u626fqual;\u6271ullEqual;\uc000\u2267\u0338reater;\uc000\u226b\u0338ess;\u6279lantEqual;\uc000\u2a7e\u0338ilde;\u6275ump\u0144\u0bf2\u0bfdownHump;\uc000\u224e\u0338qual;\uc000\u224f\u0338e\u0100fs\u0c0a\u0c27tTriangle\u0180;BE\u0c1a\u0c1b\u0c21\u62eaar;\uc000\u29cf\u0338qual;\u62ecs\u0300;EGLST\u0c35\u0c36\u0c3c\u0c44\u0c4b\u0c58\u626equal;\u6270reater;\u6278ess;\uc000\u226a\u0338lantEqual;\uc000\u2a7d\u0338ilde;\u6274ested\u0100GL\u0c68\u0c79reaterGreater;\uc000\u2aa2\u0338essLess;\uc000\u2aa1\u0338recedes\u0180;ES\u0c92\u0c93\u0c9b\u6280qual;\uc000\u2aaf\u0338lantEqual;\u62e0\u0100ei\u0cab\u0cb9verseElement;\u620cghtTriangle\u0180;BE\u0ccb\u0ccc\u0cd2\u62ebar;\uc000\u29d0\u0338qual;\u62ed\u0100qu\u0cdd\u0d0cuareSu\u0100bp\u0ce8\u0cf9set\u0100;E\u0cf0\u0cf3\uc000\u228f\u0338qual;\u62e2erset\u0100;E\u0d03\u0d06\uc000\u2290\u0338qual;\u62e3\u0180bcp\u0d13\u0d24\u0d4eset\u0100;E\u0d1b\u0d1e\uc000\u2282\u20d2qual;\u6288ceeds\u0200;EST\u0d32\u0d33\u0d3b\u0d46\u6281qual;\uc000\u2ab0\u0338lantEqual;\u62e1ilde;\uc000\u227f\u0338erset\u0100;E\u0d58\u0d5b\uc000\u2283\u20d2qual;\u6289ilde\u0200;EFT\u0d6e\u0d6f\u0d75\u0d7f\u6241qual;\u6244ullEqual;\u6247ilde;\u6249erticalBar;\u6224cr;\uc000\ud835\udca9ilde\u803b\xd1\u40d1;\u439d\u0700Eacdfgmoprstuv\u0dbd\u0dc2\u0dc9\u0dd5\u0ddb\u0de0\u0de7\u0dfc\u0e02\u0e20\u0e22\u0e32\u0e3f\u0e44lig;\u4152cute\u803b\xd3\u40d3\u0100iy\u0dce\u0dd3rc\u803b\xd4\u40d4;\u441eblac;\u4150r;\uc000\ud835\udd12rave\u803b\xd2\u40d2\u0180aei\u0dee\u0df2\u0df6cr;\u414cga;\u43a9cron;\u439fpf;\uc000\ud835\udd46enCurly\u0100DQ\u0e0e\u0e1aoubleQuote;\u601cuote;\u6018;\u6a54\u0100cl\u0e27\u0e2cr;\uc000\ud835\udcaaash\u803b\xd8\u40d8i\u016c\u0e37\u0e3cde\u803b\xd5\u40d5es;\u6a37ml\u803b\xd6\u40d6er\u0100BP\u0e4b\u0e60\u0100ar\u0e50\u0e53r;\u603eac\u0100ek\u0e5a\u0e5c;\u63deet;\u63b4arenthesis;\u63dc\u0480acfhilors\u0e7f\u0e87\u0e8a\u0e8f\u0e92\u0e94\u0e9d\u0eb0\u0efcrtialD;\u6202y;\u441fr;\uc000\ud835\udd13i;\u43a6;\u43a0usMinus;\u40b1\u0100ip\u0ea2\u0eadncareplan\xe5\u069df;\u6119\u0200;eio\u0eb9\u0eba\u0ee0\u0ee4\u6abbcedes\u0200;EST\u0ec8\u0ec9\u0ecf\u0eda\u627aqual;\u6aaflantEqual;\u627cilde;\u627eme;\u6033\u0100dp\u0ee9\u0eeeuct;\u620fortion\u0100;a\u0225\u0ef9l;\u621d\u0100ci\u0f01\u0f06r;\uc000\ud835\udcab;\u43a8\u0200Ufos\u0f11\u0f16\u0f1b\u0f1fOT\u803b\"\u4022r;\uc000\ud835\udd14pf;\u611acr;\uc000\ud835\udcac\u0600BEacefhiorsu\u0f3e\u0f43\u0f47\u0f60\u0f73\u0fa7\u0faa\u0fad\u1096\u10a9\u10b4\u10bearr;\u6910G\u803b\xae\u40ae\u0180cnr\u0f4e\u0f53\u0f56ute;\u4154g;\u67ebr\u0100;t\u0f5c\u0f5d\u61a0l;\u6916\u0180aey\u0f67\u0f6c\u0f71ron;\u4158dil;\u4156;\u4420\u0100;v\u0f78\u0f79\u611cerse\u0100EU\u0f82\u0f99\u0100lq\u0f87\u0f8eement;\u620builibrium;\u61cbpEquilibrium;\u696fr\xbb\u0f79o;\u43a1ght\u0400ACDFTUVa\u0fc1\u0feb\u0ff3\u1022\u1028\u105b\u1087\u03d8\u0100nr\u0fc6\u0fd2gleBracket;\u67e9row\u0180;BL\u0fdc\u0fdd\u0fe1\u6192ar;\u61e5eftArrow;\u61c4eiling;\u6309o\u01f5\u0ff9\0\u1005bleBracket;\u67e7n\u01d4\u100a\0\u1014eeVector;\u695dector\u0100;B\u101d\u101e\u61c2ar;\u6955loor;\u630b\u0100er\u102d\u1043e\u0180;AV\u1035\u1036\u103c\u62a2rrow;\u61a6ector;\u695biangle\u0180;BE\u1050\u1051\u1055\u62b3ar;\u69d0qual;\u62b5p\u0180DTV\u1063\u106e\u1078ownVector;\u694feeVector;\u695cector\u0100;B\u1082\u1083\u61bear;\u6954ector\u0100;B\u1091\u1092\u61c0ar;\u6953\u0100pu\u109b\u109ef;\u611dndImplies;\u6970ightarrow;\u61db\u0100ch\u10b9\u10bcr;\u611b;\u61b1leDelayed;\u69f4\u0680HOacfhimoqstu\u10e4\u10f1\u10f7\u10fd\u1119\u111e\u1151\u1156\u1161\u1167\u11b5\u11bb\u11bf\u0100Cc\u10e9\u10eeHcy;\u4429y;\u4428FTcy;\u442ccute;\u415a\u0280;aeiy\u1108\u1109\u110e\u1113\u1117\u6abcron;\u4160dil;\u415erc;\u415c;\u4421r;\uc000\ud835\udd16ort\u0200DLRU\u112a\u1134\u113e\u1149ownArrow\xbb\u041eeftArrow\xbb\u089aightArrow\xbb\u0fddpArrow;\u6191gma;\u43a3allCircle;\u6218pf;\uc000\ud835\udd4a\u0272\u116d\0\0\u1170t;\u621aare\u0200;ISU\u117b\u117c\u1189\u11af\u65a1ntersection;\u6293u\u0100bp\u118f\u119eset\u0100;E\u1197\u1198\u628fqual;\u6291erset\u0100;E\u11a8\u11a9\u6290qual;\u6292nion;\u6294cr;\uc000\ud835\udcaear;\u62c6\u0200bcmp\u11c8\u11db\u1209\u120b\u0100;s\u11cd\u11ce\u62d0et\u0100;E\u11cd\u11d5qual;\u6286\u0100ch\u11e0\u1205eeds\u0200;EST\u11ed\u11ee\u11f4\u11ff\u627bqual;\u6ab0lantEqual;\u627dilde;\u627fTh\xe1\u0f8c;\u6211\u0180;es\u1212\u1213\u1223\u62d1rset\u0100;E\u121c\u121d\u6283qual;\u6287et\xbb\u1213\u0580HRSacfhiors\u123e\u1244\u1249\u1255\u125e\u1271\u1276\u129f\u12c2\u12c8\u12d1ORN\u803b\xde\u40deADE;\u6122\u0100Hc\u124e\u1252cy;\u440by;\u4426\u0100bu\u125a\u125c;\u4009;\u43a4\u0180aey\u1265\u126a\u126fron;\u4164dil;\u4162;\u4422r;\uc000\ud835\udd17\u0100ei\u127b\u1289\u01f2\u1280\0\u1287efore;\u6234a;\u4398\u0100cn\u128e\u1298kSpace;\uc000\u205f\u200aSpace;\u6009lde\u0200;EFT\u12ab\u12ac\u12b2\u12bc\u623cqual;\u6243ullEqual;\u6245ilde;\u6248pf;\uc000\ud835\udd4bipleDot;\u60db\u0100ct\u12d6\u12dbr;\uc000\ud835\udcafrok;\u4166\u0ae1\u12f7\u130e\u131a\u1326\0\u132c\u1331\0\0\0\0\0\u1338\u133d\u1377\u1385\0\u13ff\u1404\u140a\u1410\u0100cr\u12fb\u1301ute\u803b\xda\u40dar\u0100;o\u1307\u1308\u619fcir;\u6949r\u01e3\u1313\0\u1316y;\u440eve;\u416c\u0100iy\u131e\u1323rc\u803b\xdb\u40db;\u4423blac;\u4170r;\uc000\ud835\udd18rave\u803b\xd9\u40d9acr;\u416a\u0100di\u1341\u1369er\u0100BP\u1348\u135d\u0100ar\u134d\u1350r;\u405fac\u0100ek\u1357\u1359;\u63dfet;\u63b5arenthesis;\u63ddon\u0100;P\u1370\u1371\u62c3lus;\u628e\u0100gp\u137b\u137fon;\u4172f;\uc000\ud835\udd4c\u0400ADETadps\u1395\u13ae\u13b8\u13c4\u03e8\u13d2\u13d7\u13f3rrow\u0180;BD\u1150\u13a0\u13a4ar;\u6912ownArrow;\u61c5ownArrow;\u6195quilibrium;\u696eee\u0100;A\u13cb\u13cc\u62a5rrow;\u61a5own\xe1\u03f3er\u0100LR\u13de\u13e8eftArrow;\u6196ightArrow;\u6197i\u0100;l\u13f9\u13fa\u43d2on;\u43a5ing;\u416ecr;\uc000\ud835\udcb0ilde;\u4168ml\u803b\xdc\u40dc\u0480Dbcdefosv\u1427\u142c\u1430\u1433\u143e\u1485\u148a\u1490\u1496ash;\u62abar;\u6aeby;\u4412ash\u0100;l\u143b\u143c\u62a9;\u6ae6\u0100er\u1443\u1445;\u62c1\u0180bty\u144c\u1450\u147aar;\u6016\u0100;i\u144f\u1455cal\u0200BLST\u1461\u1465\u146a\u1474ar;\u6223ine;\u407ceparator;\u6758ilde;\u6240ThinSpace;\u600ar;\uc000\ud835\udd19pf;\uc000\ud835\udd4dcr;\uc000\ud835\udcb1dash;\u62aa\u0280cefos\u14a7\u14ac\u14b1\u14b6\u14bcirc;\u4174dge;\u62c0r;\uc000\ud835\udd1apf;\uc000\ud835\udd4ecr;\uc000\ud835\udcb2\u0200fios\u14cb\u14d0\u14d2\u14d8r;\uc000\ud835\udd1b;\u439epf;\uc000\ud835\udd4fcr;\uc000\ud835\udcb3\u0480AIUacfosu\u14f1\u14f5\u14f9\u14fd\u1504\u150f\u1514\u151a\u1520cy;\u442fcy;\u4407cy;\u442ecute\u803b\xdd\u40dd\u0100iy\u1509\u150drc;\u4176;\u442br;\uc000\ud835\udd1cpf;\uc000\ud835\udd50cr;\uc000\ud835\udcb4ml;\u4178\u0400Hacdefos\u1535\u1539\u153f\u154b\u154f\u155d\u1560\u1564cy;\u4416cute;\u4179\u0100ay\u1544\u1549ron;\u417d;\u4417ot;\u417b\u01f2\u1554\0\u155boWidt\xe8\u0ad9a;\u4396r;\u6128pf;\u6124cr;\uc000\ud835\udcb5\u0be1\u1583\u158a\u1590\0\u15b0\u15b6\u15bf\0\0\0\0\u15c6\u15db\u15eb\u165f\u166d\0\u1695\u169b\u16b2\u16b9\0\u16becute\u803b\xe1\u40e1reve;\u4103\u0300;Ediuy\u159c\u159d\u15a1\u15a3\u15a8\u15ad\u623e;\uc000\u223e\u0333;\u623frc\u803b\xe2\u40e2te\u80bb\xb4\u0306;\u4430lig\u803b\xe6\u40e6\u0100;r\xb2\u15ba;\uc000\ud835\udd1erave\u803b\xe0\u40e0\u0100ep\u15ca\u15d6\u0100fp\u15cf\u15d4sym;\u6135\xe8\u15d3ha;\u43b1\u0100ap\u15dfc\u0100cl\u15e4\u15e7r;\u4101g;\u6a3f\u0264\u15f0\0\0\u160a\u0280;adsv\u15fa\u15fb\u15ff\u1601\u1607\u6227nd;\u6a55;\u6a5clope;\u6a58;\u6a5a\u0380;elmrsz\u1618\u1619\u161b\u161e\u163f\u164f\u1659\u6220;\u69a4e\xbb\u1619sd\u0100;a\u1625\u1626\u6221\u0461\u1630\u1632\u1634\u1636\u1638\u163a\u163c\u163e;\u69a8;\u69a9;\u69aa;\u69ab;\u69ac;\u69ad;\u69ae;\u69aft\u0100;v\u1645\u1646\u621fb\u0100;d\u164c\u164d\u62be;\u699d\u0100pt\u1654\u1657h;\u6222\xbb\xb9arr;\u637c\u0100gp\u1663\u1667on;\u4105f;\uc000\ud835\udd52\u0380;Eaeiop\u12c1\u167b\u167d\u1682\u1684\u1687\u168a;\u6a70cir;\u6a6f;\u624ad;\u624bs;\u4027rox\u0100;e\u12c1\u1692\xf1\u1683ing\u803b\xe5\u40e5\u0180cty\u16a1\u16a6\u16a8r;\uc000\ud835\udcb6;\u402amp\u0100;e\u12c1\u16af\xf1\u0288ilde\u803b\xe3\u40e3ml\u803b\xe4\u40e4\u0100ci\u16c2\u16c8onin\xf4\u0272nt;\u6a11\u0800Nabcdefiklnoprsu\u16ed\u16f1\u1730\u173c\u1743\u1748\u1778\u177d\u17e0\u17e6\u1839\u1850\u170d\u193d\u1948\u1970ot;\u6aed\u0100cr\u16f6\u171ek\u0200ceps\u1700\u1705\u170d\u1713ong;\u624cpsilon;\u43f6rime;\u6035im\u0100;e\u171a\u171b\u623dq;\u62cd\u0176\u1722\u1726ee;\u62bded\u0100;g\u172c\u172d\u6305e\xbb\u172drk\u0100;t\u135c\u1737brk;\u63b6\u0100oy\u1701\u1741;\u4431quo;\u601e\u0280cmprt\u1753\u175b\u1761\u1764\u1768aus\u0100;e\u010a\u0109ptyv;\u69b0s\xe9\u170cno\xf5\u0113\u0180ahw\u176f\u1771\u1773;\u43b2;\u6136een;\u626cr;\uc000\ud835\udd1fg\u0380costuvw\u178d\u179d\u17b3\u17c1\u17d5\u17db\u17de\u0180aiu\u1794\u1796\u179a\xf0\u0760rc;\u65efp\xbb\u1371\u0180dpt\u17a4\u17a8\u17adot;\u6a00lus;\u6a01imes;\u6a02\u0271\u17b9\0\0\u17becup;\u6a06ar;\u6605riangle\u0100du\u17cd\u17d2own;\u65bdp;\u65b3plus;\u6a04e\xe5\u1444\xe5\u14adarow;\u690d\u0180ako\u17ed\u1826\u1835\u0100cn\u17f2\u1823k\u0180lst\u17fa\u05ab\u1802ozenge;\u69ebriangle\u0200;dlr\u1812\u1813\u1818\u181d\u65b4own;\u65beeft;\u65c2ight;\u65b8k;\u6423\u01b1\u182b\0\u1833\u01b2\u182f\0\u1831;\u6592;\u65914;\u6593ck;\u6588\u0100eo\u183e\u184d\u0100;q\u1843\u1846\uc000=\u20e5uiv;\uc000\u2261\u20e5t;\u6310\u0200ptwx\u1859\u185e\u1867\u186cf;\uc000\ud835\udd53\u0100;t\u13cb\u1863om\xbb\u13cctie;\u62c8\u0600DHUVbdhmptuv\u1885\u1896\u18aa\u18bb\u18d7\u18db\u18ec\u18ff\u1905\u190a\u1910\u1921\u0200LRlr\u188e\u1890\u1892\u1894;\u6557;\u6554;\u6556;\u6553\u0280;DUdu\u18a1\u18a2\u18a4\u18a6\u18a8\u6550;\u6566;\u6569;\u6564;\u6567\u0200LRlr\u18b3\u18b5\u18b7\u18b9;\u655d;\u655a;\u655c;\u6559\u0380;HLRhlr\u18ca\u18cb\u18cd\u18cf\u18d1\u18d3\u18d5\u6551;\u656c;\u6563;\u6560;\u656b;\u6562;\u655fox;\u69c9\u0200LRlr\u18e4\u18e6\u18e8\u18ea;\u6555;\u6552;\u6510;\u650c\u0280;DUdu\u06bd\u18f7\u18f9\u18fb\u18fd;\u6565;\u6568;\u652c;\u6534inus;\u629flus;\u629eimes;\u62a0\u0200LRlr\u1919\u191b\u191d\u191f;\u655b;\u6558;\u6518;\u6514\u0380;HLRhlr\u1930\u1931\u1933\u1935\u1937\u1939\u193b\u6502;\u656a;\u6561;\u655e;\u653c;\u6524;\u651c\u0100ev\u0123\u1942bar\u803b\xa6\u40a6\u0200ceio\u1951\u1956\u195a\u1960r;\uc000\ud835\udcb7mi;\u604fm\u0100;e\u171a\u171cl\u0180;bh\u1968\u1969\u196b\u405c;\u69c5sub;\u67c8\u016c\u1974\u197el\u0100;e\u1979\u197a\u6022t\xbb\u197ap\u0180;Ee\u012f\u1985\u1987;\u6aae\u0100;q\u06dc\u06db\u0ce1\u19a7\0\u19e8\u1a11\u1a15\u1a32\0\u1a37\u1a50\0\0\u1ab4\0\0\u1ac1\0\0\u1b21\u1b2e\u1b4d\u1b52\0\u1bfd\0\u1c0c\u0180cpr\u19ad\u19b2\u19ddute;\u4107\u0300;abcds\u19bf\u19c0\u19c4\u19ca\u19d5\u19d9\u6229nd;\u6a44rcup;\u6a49\u0100au\u19cf\u19d2p;\u6a4bp;\u6a47ot;\u6a40;\uc000\u2229\ufe00\u0100eo\u19e2\u19e5t;\u6041\xee\u0693\u0200aeiu\u19f0\u19fb\u1a01\u1a05\u01f0\u19f5\0\u19f8s;\u6a4don;\u410ddil\u803b\xe7\u40e7rc;\u4109ps\u0100;s\u1a0c\u1a0d\u6a4cm;\u6a50ot;\u410b\u0180dmn\u1a1b\u1a20\u1a26il\u80bb\xb8\u01adptyv;\u69b2t\u8100\xa2;e\u1a2d\u1a2e\u40a2r\xe4\u01b2r;\uc000\ud835\udd20\u0180cei\u1a3d\u1a40\u1a4dy;\u4447ck\u0100;m\u1a47\u1a48\u6713ark\xbb\u1a48;\u43c7r\u0380;Ecefms\u1a5f\u1a60\u1a62\u1a6b\u1aa4\u1aaa\u1aae\u65cb;\u69c3\u0180;el\u1a69\u1a6a\u1a6d\u42c6q;\u6257e\u0261\u1a74\0\0\u1a88rrow\u0100lr\u1a7c\u1a81eft;\u61baight;\u61bb\u0280RSacd\u1a92\u1a94\u1a96\u1a9a\u1a9f\xbb\u0f47;\u64c8st;\u629birc;\u629aash;\u629dnint;\u6a10id;\u6aefcir;\u69c2ubs\u0100;u\u1abb\u1abc\u6663it\xbb\u1abc\u02ec\u1ac7\u1ad4\u1afa\0\u1b0aon\u0100;e\u1acd\u1ace\u403a\u0100;q\xc7\xc6\u026d\u1ad9\0\0\u1ae2a\u0100;t\u1ade\u1adf\u402c;\u4040\u0180;fl\u1ae8\u1ae9\u1aeb\u6201\xee\u1160e\u0100mx\u1af1\u1af6ent\xbb\u1ae9e\xf3\u024d\u01e7\u1afe\0\u1b07\u0100;d\u12bb\u1b02ot;\u6a6dn\xf4\u0246\u0180fry\u1b10\u1b14\u1b17;\uc000\ud835\udd54o\xe4\u0254\u8100\xa9;s\u0155\u1b1dr;\u6117\u0100ao\u1b25\u1b29rr;\u61b5ss;\u6717\u0100cu\u1b32\u1b37r;\uc000\ud835\udcb8\u0100bp\u1b3c\u1b44\u0100;e\u1b41\u1b42\u6acf;\u6ad1\u0100;e\u1b49\u1b4a\u6ad0;\u6ad2dot;\u62ef\u0380delprvw\u1b60\u1b6c\u1b77\u1b82\u1bac\u1bd4\u1bf9arr\u0100lr\u1b68\u1b6a;\u6938;\u6935\u0270\u1b72\0\0\u1b75r;\u62dec;\u62dfarr\u0100;p\u1b7f\u1b80\u61b6;\u693d\u0300;bcdos\u1b8f\u1b90\u1b96\u1ba1\u1ba5\u1ba8\u622arcap;\u6a48\u0100au\u1b9b\u1b9ep;\u6a46p;\u6a4aot;\u628dr;\u6a45;\uc000\u222a\ufe00\u0200alrv\u1bb5\u1bbf\u1bde\u1be3rr\u0100;m\u1bbc\u1bbd\u61b7;\u693cy\u0180evw\u1bc7\u1bd4\u1bd8q\u0270\u1bce\0\0\u1bd2re\xe3\u1b73u\xe3\u1b75ee;\u62ceedge;\u62cfen\u803b\xa4\u40a4earrow\u0100lr\u1bee\u1bf3eft\xbb\u1b80ight\xbb\u1bbde\xe4\u1bdd\u0100ci\u1c01\u1c07onin\xf4\u01f7nt;\u6231lcty;\u632d\u0980AHabcdefhijlorstuwz\u1c38\u1c3b\u1c3f\u1c5d\u1c69\u1c75\u1c8a\u1c9e\u1cac\u1cb7\u1cfb\u1cff\u1d0d\u1d7b\u1d91\u1dab\u1dbb\u1dc6\u1dcdr\xf2\u0381ar;\u6965\u0200glrs\u1c48\u1c4d\u1c52\u1c54ger;\u6020eth;\u6138\xf2\u1133h\u0100;v\u1c5a\u1c5b\u6010\xbb\u090a\u016b\u1c61\u1c67arow;\u690fa\xe3\u0315\u0100ay\u1c6e\u1c73ron;\u410f;\u4434\u0180;ao\u0332\u1c7c\u1c84\u0100gr\u02bf\u1c81r;\u61catseq;\u6a77\u0180glm\u1c91\u1c94\u1c98\u803b\xb0\u40b0ta;\u43b4ptyv;\u69b1\u0100ir\u1ca3\u1ca8sht;\u697f;\uc000\ud835\udd21ar\u0100lr\u1cb3\u1cb5\xbb\u08dc\xbb\u101e\u0280aegsv\u1cc2\u0378\u1cd6\u1cdc\u1ce0m\u0180;os\u0326\u1cca\u1cd4nd\u0100;s\u0326\u1cd1uit;\u6666amma;\u43ddin;\u62f2\u0180;io\u1ce7\u1ce8\u1cf8\u40f7de\u8100\xf7;o\u1ce7\u1cf0ntimes;\u62c7n\xf8\u1cf7cy;\u4452c\u026f\u1d06\0\0\u1d0arn;\u631eop;\u630d\u0280lptuw\u1d18\u1d1d\u1d22\u1d49\u1d55lar;\u4024f;\uc000\ud835\udd55\u0280;emps\u030b\u1d2d\u1d37\u1d3d\u1d42q\u0100;d\u0352\u1d33ot;\u6251inus;\u6238lus;\u6214quare;\u62a1blebarwedg\xe5\xfan\u0180adh\u112e\u1d5d\u1d67ownarrow\xf3\u1c83arpoon\u0100lr\u1d72\u1d76ef\xf4\u1cb4igh\xf4\u1cb6\u0162\u1d7f\u1d85karo\xf7\u0f42\u026f\u1d8a\0\0\u1d8ern;\u631fop;\u630c\u0180cot\u1d98\u1da3\u1da6\u0100ry\u1d9d\u1da1;\uc000\ud835\udcb9;\u4455l;\u69f6rok;\u4111\u0100dr\u1db0\u1db4ot;\u62f1i\u0100;f\u1dba\u1816\u65bf\u0100ah\u1dc0\u1dc3r\xf2\u0429a\xf2\u0fa6angle;\u69a6\u0100ci\u1dd2\u1dd5y;\u445fgrarr;\u67ff\u0900Dacdefglmnopqrstux\u1e01\u1e09\u1e19\u1e38\u0578\u1e3c\u1e49\u1e61\u1e7e\u1ea5\u1eaf\u1ebd\u1ee1\u1f2a\u1f37\u1f44\u1f4e\u1f5a\u0100Do\u1e06\u1d34o\xf4\u1c89\u0100cs\u1e0e\u1e14ute\u803b\xe9\u40e9ter;\u6a6e\u0200aioy\u1e22\u1e27\u1e31\u1e36ron;\u411br\u0100;c\u1e2d\u1e2e\u6256\u803b\xea\u40ealon;\u6255;\u444dot;\u4117\u0100Dr\u1e41\u1e45ot;\u6252;\uc000\ud835\udd22\u0180;rs\u1e50\u1e51\u1e57\u6a9aave\u803b\xe8\u40e8\u0100;d\u1e5c\u1e5d\u6a96ot;\u6a98\u0200;ils\u1e6a\u1e6b\u1e72\u1e74\u6a99nters;\u63e7;\u6113\u0100;d\u1e79\u1e7a\u6a95ot;\u6a97\u0180aps\u1e85\u1e89\u1e97cr;\u4113ty\u0180;sv\u1e92\u1e93\u1e95\u6205et\xbb\u1e93p\u01001;\u1e9d\u1ea4\u0133\u1ea1\u1ea3;\u6004;\u6005\u6003\u0100gs\u1eaa\u1eac;\u414bp;\u6002\u0100gp\u1eb4\u1eb8on;\u4119f;\uc000\ud835\udd56\u0180als\u1ec4\u1ece\u1ed2r\u0100;s\u1eca\u1ecb\u62d5l;\u69e3us;\u6a71i\u0180;lv\u1eda\u1edb\u1edf\u43b5on\xbb\u1edb;\u43f5\u0200csuv\u1eea\u1ef3\u1f0b\u1f23\u0100io\u1eef\u1e31rc\xbb\u1e2e\u0269\u1ef9\0\0\u1efb\xed\u0548ant\u0100gl\u1f02\u1f06tr\xbb\u1e5dess\xbb\u1e7a\u0180aei\u1f12\u1f16\u1f1als;\u403dst;\u625fv\u0100;D\u0235\u1f20D;\u6a78parsl;\u69e5\u0100Da\u1f2f\u1f33ot;\u6253rr;\u6971\u0180cdi\u1f3e\u1f41\u1ef8r;\u612fo\xf4\u0352\u0100ah\u1f49\u1f4b;\u43b7\u803b\xf0\u40f0\u0100mr\u1f53\u1f57l\u803b\xeb\u40ebo;\u60ac\u0180cip\u1f61\u1f64\u1f67l;\u4021s\xf4\u056e\u0100eo\u1f6c\u1f74ctatio\xee\u0559nential\xe5\u0579\u09e1\u1f92\0\u1f9e\0\u1fa1\u1fa7\0\0\u1fc6\u1fcc\0\u1fd3\0\u1fe6\u1fea\u2000\0\u2008\u205allingdotse\xf1\u1e44y;\u4444male;\u6640\u0180ilr\u1fad\u1fb3\u1fc1lig;\u8000\ufb03\u0269\u1fb9\0\0\u1fbdg;\u8000\ufb00ig;\u8000\ufb04;\uc000\ud835\udd23lig;\u8000\ufb01lig;\uc000fj\u0180alt\u1fd9\u1fdc\u1fe1t;\u666dig;\u8000\ufb02ns;\u65b1of;\u4192\u01f0\u1fee\0\u1ff3f;\uc000\ud835\udd57\u0100ak\u05bf\u1ff7\u0100;v\u1ffc\u1ffd\u62d4;\u6ad9artint;\u6a0d\u0100ao\u200c\u2055\u0100cs\u2011\u2052\u03b1\u201a\u2030\u2038\u2045\u2048\0\u2050\u03b2\u2022\u2025\u2027\u202a\u202c\0\u202e\u803b\xbd\u40bd;\u6153\u803b\xbc\u40bc;\u6155;\u6159;\u615b\u01b3\u2034\0\u2036;\u6154;\u6156\u02b4\u203e\u2041\0\0\u2043\u803b\xbe\u40be;\u6157;\u615c5;\u6158\u01b6\u204c\0\u204e;\u615a;\u615d8;\u615el;\u6044wn;\u6322cr;\uc000\ud835\udcbb\u0880Eabcdefgijlnorstv\u2082\u2089\u209f\u20a5\u20b0\u20b4\u20f0\u20f5\u20fa\u20ff\u2103\u2112\u2138\u0317\u213e\u2152\u219e\u0100;l\u064d\u2087;\u6a8c\u0180cmp\u2090\u2095\u209dute;\u41f5ma\u0100;d\u209c\u1cda\u43b3;\u6a86reve;\u411f\u0100iy\u20aa\u20aerc;\u411d;\u4433ot;\u4121\u0200;lqs\u063e\u0642\u20bd\u20c9\u0180;qs\u063e\u064c\u20c4lan\xf4\u0665\u0200;cdl\u0665\u20d2\u20d5\u20e5c;\u6aa9ot\u0100;o\u20dc\u20dd\u6a80\u0100;l\u20e2\u20e3\u6a82;\u6a84\u0100;e\u20ea\u20ed\uc000\u22db\ufe00s;\u6a94r;\uc000\ud835\udd24\u0100;g\u0673\u061bmel;\u6137cy;\u4453\u0200;Eaj\u065a\u210c\u210e\u2110;\u6a92;\u6aa5;\u6aa4\u0200Eaes\u211b\u211d\u2129\u2134;\u6269p\u0100;p\u2123\u2124\u6a8arox\xbb\u2124\u0100;q\u212e\u212f\u6a88\u0100;q\u212e\u211bim;\u62e7pf;\uc000\ud835\udd58\u0100ci\u2143\u2146r;\u610am\u0180;el\u066b\u214e\u2150;\u6a8e;\u6a90\u8300>;cdlqr\u05ee\u2160\u216a\u216e\u2173\u2179\u0100ci\u2165\u2167;\u6aa7r;\u6a7aot;\u62d7Par;\u6995uest;\u6a7c\u0280adels\u2184\u216a\u2190\u0656\u219b\u01f0\u2189\0\u218epro\xf8\u209er;\u6978q\u0100lq\u063f\u2196les\xf3\u2088i\xed\u066b\u0100en\u21a3\u21adrtneqq;\uc000\u2269\ufe00\xc5\u21aa\u0500Aabcefkosy\u21c4\u21c7\u21f1\u21f5\u21fa\u2218\u221d\u222f\u2268\u227dr\xf2\u03a0\u0200ilmr\u21d0\u21d4\u21d7\u21dbrs\xf0\u1484f\xbb\u2024il\xf4\u06a9\u0100dr\u21e0\u21e4cy;\u444a\u0180;cw\u08f4\u21eb\u21efir;\u6948;\u61adar;\u610firc;\u4125\u0180alr\u2201\u220e\u2213rts\u0100;u\u2209\u220a\u6665it\xbb\u220alip;\u6026con;\u62b9r;\uc000\ud835\udd25s\u0100ew\u2223\u2229arow;\u6925arow;\u6926\u0280amopr\u223a\u223e\u2243\u225e\u2263rr;\u61fftht;\u623bk\u0100lr\u2249\u2253eftarrow;\u61a9ightarrow;\u61aaf;\uc000\ud835\udd59bar;\u6015\u0180clt\u226f\u2274\u2278r;\uc000\ud835\udcbdas\xe8\u21f4rok;\u4127\u0100bp\u2282\u2287ull;\u6043hen\xbb\u1c5b\u0ae1\u22a3\0\u22aa\0\u22b8\u22c5\u22ce\0\u22d5\u22f3\0\0\u22f8\u2322\u2367\u2362\u237f\0\u2386\u23aa\u23b4cute\u803b\xed\u40ed\u0180;iy\u0771\u22b0\u22b5rc\u803b\xee\u40ee;\u4438\u0100cx\u22bc\u22bfy;\u4435cl\u803b\xa1\u40a1\u0100fr\u039f\u22c9;\uc000\ud835\udd26rave\u803b\xec\u40ec\u0200;ino\u073e\u22dd\u22e9\u22ee\u0100in\u22e2\u22e6nt;\u6a0ct;\u622dfin;\u69dcta;\u6129lig;\u4133\u0180aop\u22fe\u231a\u231d\u0180cgt\u2305\u2308\u2317r;\u412b\u0180elp\u071f\u230f\u2313in\xe5\u078ear\xf4\u0720h;\u4131f;\u62b7ed;\u41b5\u0280;cfot\u04f4\u232c\u2331\u233d\u2341are;\u6105in\u0100;t\u2338\u2339\u621eie;\u69dddo\xf4\u2319\u0280;celp\u0757\u234c\u2350\u235b\u2361al;\u62ba\u0100gr\u2355\u2359er\xf3\u1563\xe3\u234darhk;\u6a17rod;\u6a3c\u0200cgpt\u236f\u2372\u2376\u237by;\u4451on;\u412ff;\uc000\ud835\udd5aa;\u43b9uest\u803b\xbf\u40bf\u0100ci\u238a\u238fr;\uc000\ud835\udcben\u0280;Edsv\u04f4\u239b\u239d\u23a1\u04f3;\u62f9ot;\u62f5\u0100;v\u23a6\u23a7\u62f4;\u62f3\u0100;i\u0777\u23aelde;\u4129\u01eb\u23b8\0\u23bccy;\u4456l\u803b\xef\u40ef\u0300cfmosu\u23cc\u23d7\u23dc\u23e1\u23e7\u23f5\u0100iy\u23d1\u23d5rc;\u4135;\u4439r;\uc000\ud835\udd27ath;\u4237pf;\uc000\ud835\udd5b\u01e3\u23ec\0\u23f1r;\uc000\ud835\udcbfrcy;\u4458kcy;\u4454\u0400acfghjos\u240b\u2416\u2422\u2427\u242d\u2431\u2435\u243bppa\u0100;v\u2413\u2414\u43ba;\u43f0\u0100ey\u241b\u2420dil;\u4137;\u443ar;\uc000\ud835\udd28reen;\u4138cy;\u4445cy;\u445cpf;\uc000\ud835\udd5ccr;\uc000\ud835\udcc0\u0b80ABEHabcdefghjlmnoprstuv\u2470\u2481\u2486\u248d\u2491\u250e\u253d\u255a\u2580\u264e\u265e\u2665\u2679\u267d\u269a\u26b2\u26d8\u275d\u2768\u278b\u27c0\u2801\u2812\u0180art\u2477\u247a\u247cr\xf2\u09c6\xf2\u0395ail;\u691barr;\u690e\u0100;g\u0994\u248b;\u6a8bar;\u6962\u0963\u24a5\0\u24aa\0\u24b1\0\0\0\0\0\u24b5\u24ba\0\u24c6\u24c8\u24cd\0\u24f9ute;\u413amptyv;\u69b4ra\xee\u084cbda;\u43bbg\u0180;dl\u088e\u24c1\u24c3;\u6991\xe5\u088e;\u6a85uo\u803b\xab\u40abr\u0400;bfhlpst\u0899\u24de\u24e6\u24e9\u24eb\u24ee\u24f1\u24f5\u0100;f\u089d\u24e3s;\u691fs;\u691d\xeb\u2252p;\u61abl;\u6939im;\u6973l;\u61a2\u0180;ae\u24ff\u2500\u2504\u6aabil;\u6919\u0100;s\u2509\u250a\u6aad;\uc000\u2aad\ufe00\u0180abr\u2515\u2519\u251drr;\u690crk;\u6772\u0100ak\u2522\u252cc\u0100ek\u2528\u252a;\u407b;\u405b\u0100es\u2531\u2533;\u698bl\u0100du\u2539\u253b;\u698f;\u698d\u0200aeuy\u2546\u254b\u2556\u2558ron;\u413e\u0100di\u2550\u2554il;\u413c\xec\u08b0\xe2\u2529;\u443b\u0200cqrs\u2563\u2566\u256d\u257da;\u6936uo\u0100;r\u0e19\u1746\u0100du\u2572\u2577har;\u6967shar;\u694bh;\u61b2\u0280;fgqs\u258b\u258c\u0989\u25f3\u25ff\u6264t\u0280ahlrt\u2598\u25a4\u25b7\u25c2\u25e8rrow\u0100;t\u0899\u25a1a\xe9\u24f6arpoon\u0100du\u25af\u25b4own\xbb\u045ap\xbb\u0966eftarrows;\u61c7ight\u0180ahs\u25cd\u25d6\u25derrow\u0100;s\u08f4\u08a7arpoon\xf3\u0f98quigarro\xf7\u21f0hreetimes;\u62cb\u0180;qs\u258b\u0993\u25falan\xf4\u09ac\u0280;cdgs\u09ac\u260a\u260d\u261d\u2628c;\u6aa8ot\u0100;o\u2614\u2615\u6a7f\u0100;r\u261a\u261b\u6a81;\u6a83\u0100;e\u2622\u2625\uc000\u22da\ufe00s;\u6a93\u0280adegs\u2633\u2639\u263d\u2649\u264bppro\xf8\u24c6ot;\u62d6q\u0100gq\u2643\u2645\xf4\u0989gt\xf2\u248c\xf4\u099bi\xed\u09b2\u0180ilr\u2655\u08e1\u265asht;\u697c;\uc000\ud835\udd29\u0100;E\u099c\u2663;\u6a91\u0161\u2669\u2676r\u0100du\u25b2\u266e\u0100;l\u0965\u2673;\u696alk;\u6584cy;\u4459\u0280;acht\u0a48\u2688\u268b\u2691\u2696r\xf2\u25c1orne\xf2\u1d08ard;\u696bri;\u65fa\u0100io\u269f\u26a4dot;\u4140ust\u0100;a\u26ac\u26ad\u63b0che\xbb\u26ad\u0200Eaes\u26bb\u26bd\u26c9\u26d4;\u6268p\u0100;p\u26c3\u26c4\u6a89rox\xbb\u26c4\u0100;q\u26ce\u26cf\u6a87\u0100;q\u26ce\u26bbim;\u62e6\u0400abnoptwz\u26e9\u26f4\u26f7\u271a\u272f\u2741\u2747\u2750\u0100nr\u26ee\u26f1g;\u67ecr;\u61fdr\xeb\u08c1g\u0180lmr\u26ff\u270d\u2714eft\u0100ar\u09e6\u2707ight\xe1\u09f2apsto;\u67fcight\xe1\u09fdparrow\u0100lr\u2725\u2729ef\xf4\u24edight;\u61ac\u0180afl\u2736\u2739\u273dr;\u6985;\uc000\ud835\udd5dus;\u6a2dimes;\u6a34\u0161\u274b\u274fst;\u6217\xe1\u134e\u0180;ef\u2757\u2758\u1800\u65cange\xbb\u2758ar\u0100;l\u2764\u2765\u4028t;\u6993\u0280achmt\u2773\u2776\u277c\u2785\u2787r\xf2\u08a8orne\xf2\u1d8car\u0100;d\u0f98\u2783;\u696d;\u600eri;\u62bf\u0300achiqt\u2798\u279d\u0a40\u27a2\u27ae\u27bbquo;\u6039r;\uc000\ud835\udcc1m\u0180;eg\u09b2\u27aa\u27ac;\u6a8d;\u6a8f\u0100bu\u252a\u27b3o\u0100;r\u0e1f\u27b9;\u601arok;\u4142\u8400<;cdhilqr\u082b\u27d2\u2639\u27dc\u27e0\u27e5\u27ea\u27f0\u0100ci\u27d7\u27d9;\u6aa6r;\u6a79re\xe5\u25f2mes;\u62c9arr;\u6976uest;\u6a7b\u0100Pi\u27f5\u27f9ar;\u6996\u0180;ef\u2800\u092d\u181b\u65c3r\u0100du\u2807\u280dshar;\u694ahar;\u6966\u0100en\u2817\u2821rtneqq;\uc000\u2268\ufe00\xc5\u281e\u0700Dacdefhilnopsu\u2840\u2845\u2882\u288e\u2893\u28a0\u28a5\u28a8\u28da\u28e2\u28e4\u0a83\u28f3\u2902Dot;\u623a\u0200clpr\u284e\u2852\u2863\u287dr\u803b\xaf\u40af\u0100et\u2857\u2859;\u6642\u0100;e\u285e\u285f\u6720se\xbb\u285f\u0100;s\u103b\u2868to\u0200;dlu\u103b\u2873\u2877\u287bow\xee\u048cef\xf4\u090f\xf0\u13d1ker;\u65ae\u0100oy\u2887\u288cmma;\u6a29;\u443cash;\u6014asuredangle\xbb\u1626r;\uc000\ud835\udd2ao;\u6127\u0180cdn\u28af\u28b4\u28c9ro\u803b\xb5\u40b5\u0200;acd\u1464\u28bd\u28c0\u28c4s\xf4\u16a7ir;\u6af0ot\u80bb\xb7\u01b5us\u0180;bd\u28d2\u1903\u28d3\u6212\u0100;u\u1d3c\u28d8;\u6a2a\u0163\u28de\u28e1p;\u6adb\xf2\u2212\xf0\u0a81\u0100dp\u28e9\u28eeels;\u62a7f;\uc000\ud835\udd5e\u0100ct\u28f8\u28fdr;\uc000\ud835\udcc2pos\xbb\u159d\u0180;lm\u2909\u290a\u290d\u43bctimap;\u62b8\u0c00GLRVabcdefghijlmoprstuvw\u2942\u2953\u297e\u2989\u2998\u29da\u29e9\u2a15\u2a1a\u2a58\u2a5d\u2a83\u2a95\u2aa4\u2aa8\u2b04\u2b07\u2b44\u2b7f\u2bae\u2c34\u2c67\u2c7c\u2ce9\u0100gt\u2947\u294b;\uc000\u22d9\u0338\u0100;v\u2950\u0bcf\uc000\u226b\u20d2\u0180elt\u295a\u2972\u2976ft\u0100ar\u2961\u2967rrow;\u61cdightarrow;\u61ce;\uc000\u22d8\u0338\u0100;v\u297b\u0c47\uc000\u226a\u20d2ightarrow;\u61cf\u0100Dd\u298e\u2993ash;\u62afash;\u62ae\u0280bcnpt\u29a3\u29a7\u29ac\u29b1\u29ccla\xbb\u02deute;\u4144g;\uc000\u2220\u20d2\u0280;Eiop\u0d84\u29bc\u29c0\u29c5\u29c8;\uc000\u2a70\u0338d;\uc000\u224b\u0338s;\u4149ro\xf8\u0d84ur\u0100;a\u29d3\u29d4\u666el\u0100;s\u29d3\u0b38\u01f3\u29df\0\u29e3p\u80bb\xa0\u0b37mp\u0100;e\u0bf9\u0c00\u0280aeouy\u29f4\u29fe\u2a03\u2a10\u2a13\u01f0\u29f9\0\u29fb;\u6a43on;\u4148dil;\u4146ng\u0100;d\u0d7e\u2a0aot;\uc000\u2a6d\u0338p;\u6a42;\u443dash;\u6013\u0380;Aadqsx\u0b92\u2a29\u2a2d\u2a3b\u2a41\u2a45\u2a50rr;\u61d7r\u0100hr\u2a33\u2a36k;\u6924\u0100;o\u13f2\u13f0ot;\uc000\u2250\u0338ui\xf6\u0b63\u0100ei\u2a4a\u2a4ear;\u6928\xed\u0b98ist\u0100;s\u0ba0\u0b9fr;\uc000\ud835\udd2b\u0200Eest\u0bc5\u2a66\u2a79\u2a7c\u0180;qs\u0bbc\u2a6d\u0be1\u0180;qs\u0bbc\u0bc5\u2a74lan\xf4\u0be2i\xed\u0bea\u0100;r\u0bb6\u2a81\xbb\u0bb7\u0180Aap\u2a8a\u2a8d\u2a91r\xf2\u2971rr;\u61aear;\u6af2\u0180;sv\u0f8d\u2a9c\u0f8c\u0100;d\u2aa1\u2aa2\u62fc;\u62facy;\u445a\u0380AEadest\u2ab7\u2aba\u2abe\u2ac2\u2ac5\u2af6\u2af9r\xf2\u2966;\uc000\u2266\u0338rr;\u619ar;\u6025\u0200;fqs\u0c3b\u2ace\u2ae3\u2aeft\u0100ar\u2ad4\u2ad9rro\xf7\u2ac1ightarro\xf7\u2a90\u0180;qs\u0c3b\u2aba\u2aealan\xf4\u0c55\u0100;s\u0c55\u2af4\xbb\u0c36i\xed\u0c5d\u0100;r\u0c35\u2afei\u0100;e\u0c1a\u0c25i\xe4\u0d90\u0100pt\u2b0c\u2b11f;\uc000\ud835\udd5f\u8180\xac;in\u2b19\u2b1a\u2b36\u40acn\u0200;Edv\u0b89\u2b24\u2b28\u2b2e;\uc000\u22f9\u0338ot;\uc000\u22f5\u0338\u01e1\u0b89\u2b33\u2b35;\u62f7;\u62f6i\u0100;v\u0cb8\u2b3c\u01e1\u0cb8\u2b41\u2b43;\u62fe;\u62fd\u0180aor\u2b4b\u2b63\u2b69r\u0200;ast\u0b7b\u2b55\u2b5a\u2b5flle\xec\u0b7bl;\uc000\u2afd\u20e5;\uc000\u2202\u0338lint;\u6a14\u0180;ce\u0c92\u2b70\u2b73u\xe5\u0ca5\u0100;c\u0c98\u2b78\u0100;e\u0c92\u2b7d\xf1\u0c98\u0200Aait\u2b88\u2b8b\u2b9d\u2ba7r\xf2\u2988rr\u0180;cw\u2b94\u2b95\u2b99\u619b;\uc000\u2933\u0338;\uc000\u219d\u0338ghtarrow\xbb\u2b95ri\u0100;e\u0ccb\u0cd6\u0380chimpqu\u2bbd\u2bcd\u2bd9\u2b04\u0b78\u2be4\u2bef\u0200;cer\u0d32\u2bc6\u0d37\u2bc9u\xe5\u0d45;\uc000\ud835\udcc3ort\u026d\u2b05\0\0\u2bd6ar\xe1\u2b56m\u0100;e\u0d6e\u2bdf\u0100;q\u0d74\u0d73su\u0100bp\u2beb\u2bed\xe5\u0cf8\xe5\u0d0b\u0180bcp\u2bf6\u2c11\u2c19\u0200;Ees\u2bff\u2c00\u0d22\u2c04\u6284;\uc000\u2ac5\u0338et\u0100;e\u0d1b\u2c0bq\u0100;q\u0d23\u2c00c\u0100;e\u0d32\u2c17\xf1\u0d38\u0200;Ees\u2c22\u2c23\u0d5f\u2c27\u6285;\uc000\u2ac6\u0338et\u0100;e\u0d58\u2c2eq\u0100;q\u0d60\u2c23\u0200gilr\u2c3d\u2c3f\u2c45\u2c47\xec\u0bd7lde\u803b\xf1\u40f1\xe7\u0c43iangle\u0100lr\u2c52\u2c5ceft\u0100;e\u0c1a\u2c5a\xf1\u0c26ight\u0100;e\u0ccb\u2c65\xf1\u0cd7\u0100;m\u2c6c\u2c6d\u43bd\u0180;es\u2c74\u2c75\u2c79\u4023ro;\u6116p;\u6007\u0480DHadgilrs\u2c8f\u2c94\u2c99\u2c9e\u2ca3\u2cb0\u2cb6\u2cd3\u2ce3ash;\u62adarr;\u6904p;\uc000\u224d\u20d2ash;\u62ac\u0100et\u2ca8\u2cac;\uc000\u2265\u20d2;\uc000>\u20d2nfin;\u69de\u0180Aet\u2cbd\u2cc1\u2cc5rr;\u6902;\uc000\u2264\u20d2\u0100;r\u2cca\u2ccd\uc000<\u20d2ie;\uc000\u22b4\u20d2\u0100At\u2cd8\u2cdcrr;\u6903rie;\uc000\u22b5\u20d2im;\uc000\u223c\u20d2\u0180Aan\u2cf0\u2cf4\u2d02rr;\u61d6r\u0100hr\u2cfa\u2cfdk;\u6923\u0100;o\u13e7\u13e5ear;\u6927\u1253\u1a95\0\0\0\0\0\0\0\0\0\0\0\0\0\u2d2d\0\u2d38\u2d48\u2d60\u2d65\u2d72\u2d84\u1b07\0\0\u2d8d\u2dab\0\u2dc8\u2dce\0\u2ddc\u2e19\u2e2b\u2e3e\u2e43\u0100cs\u2d31\u1a97ute\u803b\xf3\u40f3\u0100iy\u2d3c\u2d45r\u0100;c\u1a9e\u2d42\u803b\xf4\u40f4;\u443e\u0280abios\u1aa0\u2d52\u2d57\u01c8\u2d5alac;\u4151v;\u6a38old;\u69bclig;\u4153\u0100cr\u2d69\u2d6dir;\u69bf;\uc000\ud835\udd2c\u036f\u2d79\0\0\u2d7c\0\u2d82n;\u42dbave\u803b\xf2\u40f2;\u69c1\u0100bm\u2d88\u0df4ar;\u69b5\u0200acit\u2d95\u2d98\u2da5\u2da8r\xf2\u1a80\u0100ir\u2d9d\u2da0r;\u69beoss;\u69bbn\xe5\u0e52;\u69c0\u0180aei\u2db1\u2db5\u2db9cr;\u414dga;\u43c9\u0180cdn\u2dc0\u2dc5\u01cdron;\u43bf;\u69b6pf;\uc000\ud835\udd60\u0180ael\u2dd4\u2dd7\u01d2r;\u69b7rp;\u69b9\u0380;adiosv\u2dea\u2deb\u2dee\u2e08\u2e0d\u2e10\u2e16\u6228r\xf2\u1a86\u0200;efm\u2df7\u2df8\u2e02\u2e05\u6a5dr\u0100;o\u2dfe\u2dff\u6134f\xbb\u2dff\u803b\xaa\u40aa\u803b\xba\u40bagof;\u62b6r;\u6a56lope;\u6a57;\u6a5b\u0180clo\u2e1f\u2e21\u2e27\xf2\u2e01ash\u803b\xf8\u40f8l;\u6298i\u016c\u2e2f\u2e34de\u803b\xf5\u40f5es\u0100;a\u01db\u2e3as;\u6a36ml\u803b\xf6\u40f6bar;\u633d\u0ae1\u2e5e\0\u2e7d\0\u2e80\u2e9d\0\u2ea2\u2eb9\0\0\u2ecb\u0e9c\0\u2f13\0\0\u2f2b\u2fbc\0\u2fc8r\u0200;ast\u0403\u2e67\u2e72\u0e85\u8100\xb6;l\u2e6d\u2e6e\u40b6le\xec\u0403\u0269\u2e78\0\0\u2e7bm;\u6af3;\u6afdy;\u443fr\u0280cimpt\u2e8b\u2e8f\u2e93\u1865\u2e97nt;\u4025od;\u402eil;\u6030enk;\u6031r;\uc000\ud835\udd2d\u0180imo\u2ea8\u2eb0\u2eb4\u0100;v\u2ead\u2eae\u43c6;\u43d5ma\xf4\u0a76ne;\u660e\u0180;tv\u2ebf\u2ec0\u2ec8\u43c0chfork\xbb\u1ffd;\u43d6\u0100au\u2ecf\u2edfn\u0100ck\u2ed5\u2eddk\u0100;h\u21f4\u2edb;\u610e\xf6\u21f4s\u0480;abcdemst\u2ef3\u2ef4\u1908\u2ef9\u2efd\u2f04\u2f06\u2f0a\u2f0e\u402bcir;\u6a23ir;\u6a22\u0100ou\u1d40\u2f02;\u6a25;\u6a72n\u80bb\xb1\u0e9dim;\u6a26wo;\u6a27\u0180ipu\u2f19\u2f20\u2f25ntint;\u6a15f;\uc000\ud835\udd61nd\u803b\xa3\u40a3\u0500;Eaceinosu\u0ec8\u2f3f\u2f41\u2f44\u2f47\u2f81\u2f89\u2f92\u2f7e\u2fb6;\u6ab3p;\u6ab7u\xe5\u0ed9\u0100;c\u0ece\u2f4c\u0300;acens\u0ec8\u2f59\u2f5f\u2f66\u2f68\u2f7eppro\xf8\u2f43urlye\xf1\u0ed9\xf1\u0ece\u0180aes\u2f6f\u2f76\u2f7approx;\u6ab9qq;\u6ab5im;\u62e8i\xed\u0edfme\u0100;s\u2f88\u0eae\u6032\u0180Eas\u2f78\u2f90\u2f7a\xf0\u2f75\u0180dfp\u0eec\u2f99\u2faf\u0180als\u2fa0\u2fa5\u2faalar;\u632eine;\u6312urf;\u6313\u0100;t\u0efb\u2fb4\xef\u0efbrel;\u62b0\u0100ci\u2fc0\u2fc5r;\uc000\ud835\udcc5;\u43c8ncsp;\u6008\u0300fiopsu\u2fda\u22e2\u2fdf\u2fe5\u2feb\u2ff1r;\uc000\ud835\udd2epf;\uc000\ud835\udd62rime;\u6057cr;\uc000\ud835\udcc6\u0180aeo\u2ff8\u3009\u3013t\u0100ei\u2ffe\u3005rnion\xf3\u06b0nt;\u6a16st\u0100;e\u3010\u3011\u403f\xf1\u1f19\xf4\u0f14\u0a80ABHabcdefhilmnoprstux\u3040\u3051\u3055\u3059\u30e0\u310e\u312b\u3147\u3162\u3172\u318e\u3206\u3215\u3224\u3229\u3258\u326e\u3272\u3290\u32b0\u32b7\u0180art\u3047\u304a\u304cr\xf2\u10b3\xf2\u03ddail;\u691car\xf2\u1c65ar;\u6964\u0380cdenqrt\u3068\u3075\u3078\u307f\u308f\u3094\u30cc\u0100eu\u306d\u3071;\uc000\u223d\u0331te;\u4155i\xe3\u116emptyv;\u69b3g\u0200;del\u0fd1\u3089\u308b\u308d;\u6992;\u69a5\xe5\u0fd1uo\u803b\xbb\u40bbr\u0580;abcfhlpstw\u0fdc\u30ac\u30af\u30b7\u30b9\u30bc\u30be\u30c0\u30c3\u30c7\u30cap;\u6975\u0100;f\u0fe0\u30b4s;\u6920;\u6933s;\u691e\xeb\u225d\xf0\u272el;\u6945im;\u6974l;\u61a3;\u619d\u0100ai\u30d1\u30d5il;\u691ao\u0100;n\u30db\u30dc\u6236al\xf3\u0f1e\u0180abr\u30e7\u30ea\u30eer\xf2\u17e5rk;\u6773\u0100ak\u30f3\u30fdc\u0100ek\u30f9\u30fb;\u407d;\u405d\u0100es\u3102\u3104;\u698cl\u0100du\u310a\u310c;\u698e;\u6990\u0200aeuy\u3117\u311c\u3127\u3129ron;\u4159\u0100di\u3121\u3125il;\u4157\xec\u0ff2\xe2\u30fa;\u4440\u0200clqs\u3134\u3137\u313d\u3144a;\u6937dhar;\u6969uo\u0100;r\u020e\u020dh;\u61b3\u0180acg\u314e\u315f\u0f44l\u0200;ips\u0f78\u3158\u315b\u109cn\xe5\u10bbar\xf4\u0fa9t;\u65ad\u0180ilr\u3169\u1023\u316esht;\u697d;\uc000\ud835\udd2f\u0100ao\u3177\u3186r\u0100du\u317d\u317f\xbb\u047b\u0100;l\u1091\u3184;\u696c\u0100;v\u318b\u318c\u43c1;\u43f1\u0180gns\u3195\u31f9\u31fcht\u0300ahlrst\u31a4\u31b0\u31c2\u31d8\u31e4\u31eerrow\u0100;t\u0fdc\u31ada\xe9\u30c8arpoon\u0100du\u31bb\u31bfow\xee\u317ep\xbb\u1092eft\u0100ah\u31ca\u31d0rrow\xf3\u0feaarpoon\xf3\u0551ightarrows;\u61c9quigarro\xf7\u30cbhreetimes;\u62ccg;\u42daingdotse\xf1\u1f32\u0180ahm\u320d\u3210\u3213r\xf2\u0feaa\xf2\u0551;\u600foust\u0100;a\u321e\u321f\u63b1che\xbb\u321fmid;\u6aee\u0200abpt\u3232\u323d\u3240\u3252\u0100nr\u3237\u323ag;\u67edr;\u61fer\xeb\u1003\u0180afl\u3247\u324a\u324er;\u6986;\uc000\ud835\udd63us;\u6a2eimes;\u6a35\u0100ap\u325d\u3267r\u0100;g\u3263\u3264\u4029t;\u6994olint;\u6a12ar\xf2\u31e3\u0200achq\u327b\u3280\u10bc\u3285quo;\u603ar;\uc000\ud835\udcc7\u0100bu\u30fb\u328ao\u0100;r\u0214\u0213\u0180hir\u3297\u329b\u32a0re\xe5\u31f8mes;\u62cai\u0200;efl\u32aa\u1059\u1821\u32ab\u65b9tri;\u69celuhar;\u6968;\u611e\u0d61\u32d5\u32db\u32df\u332c\u3338\u3371\0\u337a\u33a4\0\0\u33ec\u33f0\0\u3428\u3448\u345a\u34ad\u34b1\u34ca\u34f1\0\u3616\0\0\u3633cute;\u415bqu\xef\u27ba\u0500;Eaceinpsy\u11ed\u32f3\u32f5\u32ff\u3302\u330b\u330f\u331f\u3326\u3329;\u6ab4\u01f0\u32fa\0\u32fc;\u6ab8on;\u4161u\xe5\u11fe\u0100;d\u11f3\u3307il;\u415frc;\u415d\u0180Eas\u3316\u3318\u331b;\u6ab6p;\u6abaim;\u62e9olint;\u6a13i\xed\u1204;\u4441ot\u0180;be\u3334\u1d47\u3335\u62c5;\u6a66\u0380Aacmstx\u3346\u334a\u3357\u335b\u335e\u3363\u336drr;\u61d8r\u0100hr\u3350\u3352\xeb\u2228\u0100;o\u0a36\u0a34t\u803b\xa7\u40a7i;\u403bwar;\u6929m\u0100in\u3369\xf0nu\xf3\xf1t;\u6736r\u0100;o\u3376\u2055\uc000\ud835\udd30\u0200acoy\u3382\u3386\u3391\u33a0rp;\u666f\u0100hy\u338b\u338fcy;\u4449;\u4448rt\u026d\u3399\0\0\u339ci\xe4\u1464ara\xec\u2e6f\u803b\xad\u40ad\u0100gm\u33a8\u33b4ma\u0180;fv\u33b1\u33b2\u33b2\u43c3;\u43c2\u0400;deglnpr\u12ab\u33c5\u33c9\u33ce\u33d6\u33de\u33e1\u33e6ot;\u6a6a\u0100;q\u12b1\u12b0\u0100;E\u33d3\u33d4\u6a9e;\u6aa0\u0100;E\u33db\u33dc\u6a9d;\u6a9fe;\u6246lus;\u6a24arr;\u6972ar\xf2\u113d\u0200aeit\u33f8\u3408\u340f\u3417\u0100ls\u33fd\u3404lsetm\xe9\u336ahp;\u6a33parsl;\u69e4\u0100dl\u1463\u3414e;\u6323\u0100;e\u341c\u341d\u6aaa\u0100;s\u3422\u3423\u6aac;\uc000\u2aac\ufe00\u0180flp\u342e\u3433\u3442tcy;\u444c\u0100;b\u3438\u3439\u402f\u0100;a\u343e\u343f\u69c4r;\u633ff;\uc000\ud835\udd64a\u0100dr\u344d\u0402es\u0100;u\u3454\u3455\u6660it\xbb\u3455\u0180csu\u3460\u3479\u349f\u0100au\u3465\u346fp\u0100;s\u1188\u346b;\uc000\u2293\ufe00p\u0100;s\u11b4\u3475;\uc000\u2294\ufe00u\u0100bp\u347f\u348f\u0180;es\u1197\u119c\u3486et\u0100;e\u1197\u348d\xf1\u119d\u0180;es\u11a8\u11ad\u3496et\u0100;e\u11a8\u349d\xf1\u11ae\u0180;af\u117b\u34a6\u05b0r\u0165\u34ab\u05b1\xbb\u117car\xf2\u1148\u0200cemt\u34b9\u34be\u34c2\u34c5r;\uc000\ud835\udcc8tm\xee\xf1i\xec\u3415ar\xe6\u11be\u0100ar\u34ce\u34d5r\u0100;f\u34d4\u17bf\u6606\u0100an\u34da\u34edight\u0100ep\u34e3\u34eapsilo\xee\u1ee0h\xe9\u2eafs\xbb\u2852\u0280bcmnp\u34fb\u355e\u1209\u358b\u358e\u0480;Edemnprs\u350e\u350f\u3511\u3515\u351e\u3523\u352c\u3531\u3536\u6282;\u6ac5ot;\u6abd\u0100;d\u11da\u351aot;\u6ac3ult;\u6ac1\u0100Ee\u3528\u352a;\u6acb;\u628alus;\u6abfarr;\u6979\u0180eiu\u353d\u3552\u3555t\u0180;en\u350e\u3545\u354bq\u0100;q\u11da\u350feq\u0100;q\u352b\u3528m;\u6ac7\u0100bp\u355a\u355c;\u6ad5;\u6ad3c\u0300;acens\u11ed\u356c\u3572\u3579\u357b\u3326ppro\xf8\u32faurlye\xf1\u11fe\xf1\u11f3\u0180aes\u3582\u3588\u331bppro\xf8\u331aq\xf1\u3317g;\u666a\u0680123;Edehlmnps\u35a9\u35ac\u35af\u121c\u35b2\u35b4\u35c0\u35c9\u35d5\u35da\u35df\u35e8\u35ed\u803b\xb9\u40b9\u803b\xb2\u40b2\u803b\xb3\u40b3;\u6ac6\u0100os\u35b9\u35bct;\u6abeub;\u6ad8\u0100;d\u1222\u35c5ot;\u6ac4s\u0100ou\u35cf\u35d2l;\u67c9b;\u6ad7arr;\u697bult;\u6ac2\u0100Ee\u35e4\u35e6;\u6acc;\u628blus;\u6ac0\u0180eiu\u35f4\u3609\u360ct\u0180;en\u121c\u35fc\u3602q\u0100;q\u1222\u35b2eq\u0100;q\u35e7\u35e4m;\u6ac8\u0100bp\u3611\u3613;\u6ad4;\u6ad6\u0180Aan\u361c\u3620\u362drr;\u61d9r\u0100hr\u3626\u3628\xeb\u222e\u0100;o\u0a2b\u0a29war;\u692alig\u803b\xdf\u40df\u0be1\u3651\u365d\u3660\u12ce\u3673\u3679\0\u367e\u36c2\0\0\0\0\0\u36db\u3703\0\u3709\u376c\0\0\0\u3787\u0272\u3656\0\0\u365bget;\u6316;\u43c4r\xeb\u0e5f\u0180aey\u3666\u366b\u3670ron;\u4165dil;\u4163;\u4442lrec;\u6315r;\uc000\ud835\udd31\u0200eiko\u3686\u369d\u36b5\u36bc\u01f2\u368b\0\u3691e\u01004f\u1284\u1281a\u0180;sv\u3698\u3699\u369b\u43b8ym;\u43d1\u0100cn\u36a2\u36b2k\u0100as\u36a8\u36aeppro\xf8\u12c1im\xbb\u12acs\xf0\u129e\u0100as\u36ba\u36ae\xf0\u12c1rn\u803b\xfe\u40fe\u01ec\u031f\u36c6\u22e7es\u8180\xd7;bd\u36cf\u36d0\u36d8\u40d7\u0100;a\u190f\u36d5r;\u6a31;\u6a30\u0180eps\u36e1\u36e3\u3700\xe1\u2a4d\u0200;bcf\u0486\u36ec\u36f0\u36f4ot;\u6336ir;\u6af1\u0100;o\u36f9\u36fc\uc000\ud835\udd65rk;\u6ada\xe1\u3362rime;\u6034\u0180aip\u370f\u3712\u3764d\xe5\u1248\u0380adempst\u3721\u374d\u3740\u3751\u3757\u375c\u375fngle\u0280;dlqr\u3730\u3731\u3736\u3740\u3742\u65b5own\xbb\u1dbbeft\u0100;e\u2800\u373e\xf1\u092e;\u625cight\u0100;e\u32aa\u374b\xf1\u105aot;\u65ecinus;\u6a3alus;\u6a39b;\u69cdime;\u6a3bezium;\u63e2\u0180cht\u3772\u377d\u3781\u0100ry\u3777\u377b;\uc000\ud835\udcc9;\u4446cy;\u445brok;\u4167\u0100io\u378b\u378ex\xf4\u1777head\u0100lr\u3797\u37a0eftarro\xf7\u084fightarrow\xbb\u0f5d\u0900AHabcdfghlmoprstuw\u37d0\u37d3\u37d7\u37e4\u37f0\u37fc\u380e\u381c\u3823\u3834\u3851\u385d\u386b\u38a9\u38cc\u38d2\u38ea\u38f6r\xf2\u03edar;\u6963\u0100cr\u37dc\u37e2ute\u803b\xfa\u40fa\xf2\u1150r\u01e3\u37ea\0\u37edy;\u445eve;\u416d\u0100iy\u37f5\u37farc\u803b\xfb\u40fb;\u4443\u0180abh\u3803\u3806\u380br\xf2\u13adlac;\u4171a\xf2\u13c3\u0100ir\u3813\u3818sht;\u697e;\uc000\ud835\udd32rave\u803b\xf9\u40f9\u0161\u3827\u3831r\u0100lr\u382c\u382e\xbb\u0957\xbb\u1083lk;\u6580\u0100ct\u3839\u384d\u026f\u383f\0\0\u384arn\u0100;e\u3845\u3846\u631cr\xbb\u3846op;\u630fri;\u65f8\u0100al\u3856\u385acr;\u416b\u80bb\xa8\u0349\u0100gp\u3862\u3866on;\u4173f;\uc000\ud835\udd66\u0300adhlsu\u114b\u3878\u387d\u1372\u3891\u38a0own\xe1\u13b3arpoon\u0100lr\u3888\u388cef\xf4\u382digh\xf4\u382fi\u0180;hl\u3899\u389a\u389c\u43c5\xbb\u13faon\xbb\u389aparrows;\u61c8\u0180cit\u38b0\u38c4\u38c8\u026f\u38b6\0\0\u38c1rn\u0100;e\u38bc\u38bd\u631dr\xbb\u38bdop;\u630eng;\u416fri;\u65f9cr;\uc000\ud835\udcca\u0180dir\u38d9\u38dd\u38e2ot;\u62f0lde;\u4169i\u0100;f\u3730\u38e8\xbb\u1813\u0100am\u38ef\u38f2r\xf2\u38a8l\u803b\xfc\u40fcangle;\u69a7\u0780ABDacdeflnoprsz\u391c\u391f\u3929\u392d\u39b5\u39b8\u39bd\u39df\u39e4\u39e8\u39f3\u39f9\u39fd\u3a01\u3a20r\xf2\u03f7ar\u0100;v\u3926\u3927\u6ae8;\u6ae9as\xe8\u03e1\u0100nr\u3932\u3937grt;\u699c\u0380eknprst\u34e3\u3946\u394b\u3952\u395d\u3964\u3996app\xe1\u2415othin\xe7\u1e96\u0180hir\u34eb\u2ec8\u3959op\xf4\u2fb5\u0100;h\u13b7\u3962\xef\u318d\u0100iu\u3969\u396dgm\xe1\u33b3\u0100bp\u3972\u3984setneq\u0100;q\u397d\u3980\uc000\u228a\ufe00;\uc000\u2acb\ufe00setneq\u0100;q\u398f\u3992\uc000\u228b\ufe00;\uc000\u2acc\ufe00\u0100hr\u399b\u399fet\xe1\u369ciangle\u0100lr\u39aa\u39afeft\xbb\u0925ight\xbb\u1051y;\u4432ash\xbb\u1036\u0180elr\u39c4\u39d2\u39d7\u0180;be\u2dea\u39cb\u39cfar;\u62bbq;\u625alip;\u62ee\u0100bt\u39dc\u1468a\xf2\u1469r;\uc000\ud835\udd33tr\xe9\u39aesu\u0100bp\u39ef\u39f1\xbb\u0d1c\xbb\u0d59pf;\uc000\ud835\udd67ro\xf0\u0efbtr\xe9\u39b4\u0100cu\u3a06\u3a0br;\uc000\ud835\udccb\u0100bp\u3a10\u3a18n\u0100Ee\u3980\u3a16\xbb\u397en\u0100Ee\u3992\u3a1e\xbb\u3990igzag;\u699a\u0380cefoprs\u3a36\u3a3b\u3a56\u3a5b\u3a54\u3a61\u3a6airc;\u4175\u0100di\u3a40\u3a51\u0100bg\u3a45\u3a49ar;\u6a5fe\u0100;q\u15fa\u3a4f;\u6259erp;\u6118r;\uc000\ud835\udd34pf;\uc000\ud835\udd68\u0100;e\u1479\u3a66at\xe8\u1479cr;\uc000\ud835\udccc\u0ae3\u178e\u3a87\0\u3a8b\0\u3a90\u3a9b\0\0\u3a9d\u3aa8\u3aab\u3aaf\0\0\u3ac3\u3ace\0\u3ad8\u17dc\u17dftr\xe9\u17d1r;\uc000\ud835\udd35\u0100Aa\u3a94\u3a97r\xf2\u03c3r\xf2\u09f6;\u43be\u0100Aa\u3aa1\u3aa4r\xf2\u03b8r\xf2\u09eba\xf0\u2713is;\u62fb\u0180dpt\u17a4\u3ab5\u3abe\u0100fl\u3aba\u17a9;\uc000\ud835\udd69im\xe5\u17b2\u0100Aa\u3ac7\u3acar\xf2\u03cer\xf2\u0a01\u0100cq\u3ad2\u17b8r;\uc000\ud835\udccd\u0100pt\u17d6\u3adcr\xe9\u17d4\u0400acefiosu\u3af0\u3afd\u3b08\u3b0c\u3b11\u3b15\u3b1b\u3b21c\u0100uy\u3af6\u3afbte\u803b\xfd\u40fd;\u444f\u0100iy\u3b02\u3b06rc;\u4177;\u444bn\u803b\xa5\u40a5r;\uc000\ud835\udd36cy;\u4457pf;\uc000\ud835\udd6acr;\uc000\ud835\udcce\u0100cm\u3b26\u3b29y;\u444el\u803b\xff\u40ff\u0500acdefhiosw\u3b42\u3b48\u3b54\u3b58\u3b64\u3b69\u3b6d\u3b74\u3b7a\u3b80cute;\u417a\u0100ay\u3b4d\u3b52ron;\u417e;\u4437ot;\u417c\u0100et\u3b5d\u3b61tr\xe6\u155fa;\u43b6r;\uc000\ud835\udd37cy;\u4436grarr;\u61ddpf;\uc000\ud835\udd6bcr;\uc000\ud835\udccf\u0100jn\u3b85\u3b87;\u600dj;\u600c" + .split("") + .map((c) => c.charCodeAt(0))); +//# sourceMappingURL=decode-data-html.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.js.map new file mode 100644 index 0000000..842ffcb --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-html.js.map @@ -0,0 +1 @@ +{"version":3,"file":"decode-data-html.js","sourceRoot":"","sources":["../../../src/generated/decode-data-html.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,MAAM,CAAC,MAAM,cAAc,GAAgB,eAAe,CAAC,IAAI,WAAW;AACtE,kBAAkB;AAClB,eAAe,CAAC,268CAA268C;KACt78C,KAAK,CAAC,EAAE,CAAC;KACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CACnC,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts new file mode 100644 index 0000000..6467acc --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts @@ -0,0 +1,2 @@ +export declare const xmlDecodeTree: Uint16Array; +//# sourceMappingURL=decode-data-xml.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts.map new file mode 100644 index 0000000..2988509 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"decode-data-xml.d.ts","sourceRoot":"","sources":["../../../src/generated/decode-data-xml.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,EAAE,WAK3B,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.js new file mode 100644 index 0000000..e5d2d70 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.js @@ -0,0 +1,7 @@ +// Generated using scripts/write-decode-map.ts +export const xmlDecodeTree = /* #__PURE__ */ new Uint16Array( +// prettier-ignore +/* #__PURE__ */ "\u0200aglq\t\x15\x18\x1b\u026d\x0f\0\0\x12p;\u4026os;\u4027t;\u403et;\u403cuot;\u4022" + .split("") + .map((c) => c.charCodeAt(0))); +//# sourceMappingURL=decode-data-xml.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.js.map new file mode 100644 index 0000000..fe3e571 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/decode-data-xml.js.map @@ -0,0 +1 @@ +{"version":3,"file":"decode-data-xml.js","sourceRoot":"","sources":["../../../src/generated/decode-data-xml.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,MAAM,CAAC,MAAM,aAAa,GAAgB,eAAe,CAAC,IAAI,WAAW;AACrE,kBAAkB;AAClB,eAAe,CAAC,uFAAuF;KAClG,KAAK,CAAC,EAAE,CAAC;KACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CACnC,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.d.ts new file mode 100644 index 0000000..a648e2b --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.d.ts @@ -0,0 +1,8 @@ +type EncodeTrieNode = string | { + v?: string; + n: number | Map; + o?: string; +}; +export declare const htmlTrie: Map; +export {}; +//# sourceMappingURL=encode-html.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.d.ts.map new file mode 100644 index 0000000..e19fef9 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"encode-html.d.ts","sourceRoot":"","sources":["../../../src/generated/encode-html.ts"],"names":[],"mappings":"AAEA,KAAK,cAAc,GACb,MAAM,GACN;IAAE,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAY1E,eAAO,MAAM,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAC,cAAc,CAAwhuB,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.js new file mode 100644 index 0000000..f79ce1d --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.js @@ -0,0 +1,10 @@ +// Generated using scripts/write-encode-map.ts +function restoreDiff(array) { + for (let index = 1; index < array.length; index++) { + array[index][0] += array[index - 1][0] + 1; + } + return array; +} +// prettier-ignore +export const htmlTrie = /* #__PURE__ */ new Map(/* #__PURE__ */ restoreDiff([[9, " "], [0, " "], [22, "!"], [0, """], [0, "#"], [0, "$"], [0, "%"], [0, "&"], [0, "'"], [0, "("], [0, ")"], [0, "*"], [0, "+"], [0, ","], [1, "."], [0, "/"], [10, ":"], [0, ";"], [0, { v: "<", n: 8402, o: "<⃒" }], [0, { v: "=", n: 8421, o: "=⃥" }], [0, { v: ">", n: 8402, o: ">⃒" }], [0, "?"], [0, "@"], [26, "["], [0, "\"], [0, "]"], [0, "^"], [0, "_"], [0, "`"], [5, { n: 106, o: "fj" }], [20, "{"], [0, "|"], [0, "}"], [34, " "], [0, "¡"], [0, "¢"], [0, "£"], [0, "¤"], [0, "¥"], [0, "¦"], [0, "§"], [0, "¨"], [0, "©"], [0, "ª"], [0, "«"], [0, "¬"], [0, "­"], [0, "®"], [0, "¯"], [0, "°"], [0, "±"], [0, "²"], [0, "³"], [0, "´"], [0, "µ"], [0, "¶"], [0, "·"], [0, "¸"], [0, "¹"], [0, "º"], [0, "»"], [0, "¼"], [0, "½"], [0, "¾"], [0, "¿"], [0, "À"], [0, "Á"], [0, "Â"], [0, "Ã"], [0, "Ä"], [0, "Å"], [0, "Æ"], [0, "Ç"], [0, "È"], [0, "É"], [0, "Ê"], [0, "Ë"], [0, "Ì"], [0, "Í"], [0, "Î"], [0, "Ï"], [0, "Ð"], [0, "Ñ"], [0, "Ò"], [0, "Ó"], [0, "Ô"], [0, "Õ"], [0, "Ö"], [0, "×"], [0, "Ø"], [0, "Ù"], [0, "Ú"], [0, "Û"], [0, "Ü"], [0, "Ý"], [0, "Þ"], [0, "ß"], [0, "à"], [0, "á"], [0, "â"], [0, "ã"], [0, "ä"], [0, "å"], [0, "æ"], [0, "ç"], [0, "è"], [0, "é"], [0, "ê"], [0, "ë"], [0, "ì"], [0, "í"], [0, "î"], [0, "ï"], [0, "ð"], [0, "ñ"], [0, "ò"], [0, "ó"], [0, "ô"], [0, "õ"], [0, "ö"], [0, "÷"], [0, "ø"], [0, "ù"], [0, "ú"], [0, "û"], [0, "ü"], [0, "ý"], [0, "þ"], [0, "ÿ"], [0, "Ā"], [0, "ā"], [0, "Ă"], [0, "ă"], [0, "Ą"], [0, "ą"], [0, "Ć"], [0, "ć"], [0, "Ĉ"], [0, "ĉ"], [0, "Ċ"], [0, "ċ"], [0, "Č"], [0, "č"], [0, "Ď"], [0, "ď"], [0, "Đ"], [0, "đ"], [0, "Ē"], [0, "ē"], [2, "Ė"], [0, "ė"], [0, "Ę"], [0, "ę"], [0, "Ě"], [0, "ě"], [0, "Ĝ"], [0, "ĝ"], [0, "Ğ"], [0, "ğ"], [0, "Ġ"], [0, "ġ"], [0, "Ģ"], [1, "Ĥ"], [0, "ĥ"], [0, "Ħ"], [0, "ħ"], [0, "Ĩ"], [0, "ĩ"], [0, "Ī"], [0, "ī"], [2, "Į"], [0, "į"], [0, "İ"], [0, "ı"], [0, "IJ"], [0, "ij"], [0, "Ĵ"], [0, "ĵ"], [0, "Ķ"], [0, "ķ"], [0, "ĸ"], [0, "Ĺ"], [0, "ĺ"], [0, "Ļ"], [0, "ļ"], [0, "Ľ"], [0, "ľ"], [0, "Ŀ"], [0, "ŀ"], [0, "Ł"], [0, "ł"], [0, "Ń"], [0, "ń"], [0, "Ņ"], [0, "ņ"], [0, "Ň"], [0, "ň"], [0, "ʼn"], [0, "Ŋ"], [0, "ŋ"], [0, "Ō"], [0, "ō"], [2, "Ő"], [0, "ő"], [0, "Œ"], [0, "œ"], [0, "Ŕ"], [0, "ŕ"], [0, "Ŗ"], [0, "ŗ"], [0, "Ř"], [0, "ř"], [0, "Ś"], [0, "ś"], [0, "Ŝ"], [0, "ŝ"], [0, "Ş"], [0, "ş"], [0, "Š"], [0, "š"], [0, "Ţ"], [0, "ţ"], [0, "Ť"], [0, "ť"], [0, "Ŧ"], [0, "ŧ"], [0, "Ũ"], [0, "ũ"], [0, "Ū"], [0, "ū"], [0, "Ŭ"], [0, "ŭ"], [0, "Ů"], [0, "ů"], [0, "Ű"], [0, "ű"], [0, "Ų"], [0, "ų"], [0, "Ŵ"], [0, "ŵ"], [0, "Ŷ"], [0, "ŷ"], [0, "Ÿ"], [0, "Ź"], [0, "ź"], [0, "Ż"], [0, "ż"], [0, "Ž"], [0, "ž"], [19, "ƒ"], [34, "Ƶ"], [63, "ǵ"], [65, "ȷ"], [142, "ˆ"], [0, "ˇ"], [16, "˘"], [0, "˙"], [0, "˚"], [0, "˛"], [0, "˜"], [0, "˝"], [51, "̑"], [127, "Α"], [0, "Β"], [0, "Γ"], [0, "Δ"], [0, "Ε"], [0, "Ζ"], [0, "Η"], [0, "Θ"], [0, "Ι"], [0, "Κ"], [0, "Λ"], [0, "Μ"], [0, "Ν"], [0, "Ξ"], [0, "Ο"], [0, "Π"], [0, "Ρ"], [1, "Σ"], [0, "Τ"], [0, "Υ"], [0, "Φ"], [0, "Χ"], [0, "Ψ"], [0, "Ω"], [7, "α"], [0, "β"], [0, "γ"], [0, "δ"], [0, "ε"], [0, "ζ"], [0, "η"], [0, "θ"], [0, "ι"], [0, "κ"], [0, "λ"], [0, "μ"], [0, "ν"], [0, "ξ"], [0, "ο"], [0, "π"], [0, "ρ"], [0, "ς"], [0, "σ"], [0, "τ"], [0, "υ"], [0, "φ"], [0, "χ"], [0, "ψ"], [0, "ω"], [7, "ϑ"], [0, "ϒ"], [2, "ϕ"], [0, "ϖ"], [5, "Ϝ"], [0, "ϝ"], [18, "ϰ"], [0, "ϱ"], [3, "ϵ"], [0, "϶"], [10, "Ё"], [0, "Ђ"], [0, "Ѓ"], [0, "Є"], [0, "Ѕ"], [0, "І"], [0, "Ї"], [0, "Ј"], [0, "Љ"], [0, "Њ"], [0, "Ћ"], [0, "Ќ"], [1, "Ў"], [0, "Џ"], [0, "А"], [0, "Б"], [0, "В"], [0, "Г"], [0, "Д"], [0, "Е"], [0, "Ж"], [0, "З"], [0, "И"], [0, "Й"], [0, "К"], [0, "Л"], [0, "М"], [0, "Н"], [0, "О"], [0, "П"], [0, "Р"], [0, "С"], [0, "Т"], [0, "У"], [0, "Ф"], [0, "Х"], [0, "Ц"], [0, "Ч"], [0, "Ш"], [0, "Щ"], [0, "Ъ"], [0, "Ы"], [0, "Ь"], [0, "Э"], [0, "Ю"], [0, "Я"], [0, "а"], [0, "б"], [0, "в"], [0, "г"], [0, "д"], [0, "е"], [0, "ж"], [0, "з"], [0, "и"], [0, "й"], [0, "к"], [0, "л"], [0, "м"], [0, "н"], [0, "о"], [0, "п"], [0, "р"], [0, "с"], [0, "т"], [0, "у"], [0, "ф"], [0, "х"], [0, "ц"], [0, "ч"], [0, "ш"], [0, "щ"], [0, "ъ"], [0, "ы"], [0, "ь"], [0, "э"], [0, "ю"], [0, "я"], [1, "ё"], [0, "ђ"], [0, "ѓ"], [0, "є"], [0, "ѕ"], [0, "і"], [0, "ї"], [0, "ј"], [0, "љ"], [0, "њ"], [0, "ћ"], [0, "ќ"], [1, "ў"], [0, "џ"], [7074, " "], [0, " "], [0, " "], [0, " "], [1, " "], [0, " "], [0, " "], [0, " "], [0, "​"], [0, "‌"], [0, "‍"], [0, "‎"], [0, "‏"], [0, "‐"], [2, "–"], [0, "—"], [0, "―"], [0, "‖"], [1, "‘"], [0, "’"], [0, "‚"], [1, "“"], [0, "”"], [0, "„"], [1, "†"], [0, "‡"], [0, "•"], [2, "‥"], [0, "…"], [9, "‰"], [0, "‱"], [0, "′"], [0, "″"], [0, "‴"], [0, "‵"], [3, "‹"], [0, "›"], [3, "‾"], [2, "⁁"], [1, "⁃"], [0, "⁄"], [10, "⁏"], [7, "⁗"], [7, { v: " ", n: 8202, o: "  " }], [0, "⁠"], [0, "⁡"], [0, "⁢"], [0, "⁣"], [72, "€"], [46, "⃛"], [0, "⃜"], [37, "ℂ"], [2, "℅"], [4, "ℊ"], [0, "ℋ"], [0, "ℌ"], [0, "ℍ"], [0, "ℎ"], [0, "ℏ"], [0, "ℐ"], [0, "ℑ"], [0, "ℒ"], [0, "ℓ"], [1, "ℕ"], [0, "№"], [0, "℗"], [0, "℘"], [0, "ℙ"], [0, "ℚ"], [0, "ℛ"], [0, "ℜ"], [0, "ℝ"], [0, "℞"], [3, "™"], [1, "ℤ"], [2, "℧"], [0, "ℨ"], [0, "℩"], [2, "ℬ"], [0, "ℭ"], [1, "ℯ"], [0, "ℰ"], [0, "ℱ"], [1, "ℳ"], [0, "ℴ"], [0, "ℵ"], [0, "ℶ"], [0, "ℷ"], [0, "ℸ"], [12, "ⅅ"], [0, "ⅆ"], [0, "ⅇ"], [0, "ⅈ"], [10, "⅓"], [0, "⅔"], [0, "⅕"], [0, "⅖"], [0, "⅗"], [0, "⅘"], [0, "⅙"], [0, "⅚"], [0, "⅛"], [0, "⅜"], [0, "⅝"], [0, "⅞"], [49, "←"], [0, "↑"], [0, "→"], [0, "↓"], [0, "↔"], [0, "↕"], [0, "↖"], [0, "↗"], [0, "↘"], [0, "↙"], [0, "↚"], [0, "↛"], [1, { v: "↝", n: 824, o: "↝̸" }], [0, "↞"], [0, "↟"], [0, "↠"], [0, "↡"], [0, "↢"], [0, "↣"], [0, "↤"], [0, "↥"], [0, "↦"], [0, "↧"], [1, "↩"], [0, "↪"], [0, "↫"], [0, "↬"], [0, "↭"], [0, "↮"], [1, "↰"], [0, "↱"], [0, "↲"], [0, "↳"], [1, "↵"], [0, "↶"], [0, "↷"], [2, "↺"], [0, "↻"], [0, "↼"], [0, "↽"], [0, "↾"], [0, "↿"], [0, "⇀"], [0, "⇁"], [0, "⇂"], [0, "⇃"], [0, "⇄"], [0, "⇅"], [0, "⇆"], [0, "⇇"], [0, "⇈"], [0, "⇉"], [0, "⇊"], [0, "⇋"], [0, "⇌"], [0, "⇍"], [0, "⇎"], [0, "⇏"], [0, "⇐"], [0, "⇑"], [0, "⇒"], [0, "⇓"], [0, "⇔"], [0, "⇕"], [0, "⇖"], [0, "⇗"], [0, "⇘"], [0, "⇙"], [0, "⇚"], [0, "⇛"], [1, "⇝"], [6, "⇤"], [0, "⇥"], [15, "⇵"], [7, "⇽"], [0, "⇾"], [0, "⇿"], [0, "∀"], [0, "∁"], [0, { v: "∂", n: 824, o: "∂̸" }], [0, "∃"], [0, "∄"], [0, "∅"], [1, "∇"], [0, "∈"], [0, "∉"], [1, "∋"], [0, "∌"], [2, "∏"], [0, "∐"], [0, "∑"], [0, "−"], [0, "∓"], [0, "∔"], [1, "∖"], [0, "∗"], [0, "∘"], [1, "√"], [2, "∝"], [0, "∞"], [0, "∟"], [0, { v: "∠", n: 8402, o: "∠⃒" }], [0, "∡"], [0, "∢"], [0, "∣"], [0, "∤"], [0, "∥"], [0, "∦"], [0, "∧"], [0, "∨"], [0, { v: "∩", n: 65024, o: "∩︀" }], [0, { v: "∪", n: 65024, o: "∪︀" }], [0, "∫"], [0, "∬"], [0, "∭"], [0, "∮"], [0, "∯"], [0, "∰"], [0, "∱"], [0, "∲"], [0, "∳"], [0, "∴"], [0, "∵"], [0, "∶"], [0, "∷"], [0, "∸"], [1, "∺"], [0, "∻"], [0, { v: "∼", n: 8402, o: "∼⃒" }], [0, { v: "∽", n: 817, o: "∽̱" }], [0, { v: "∾", n: 819, o: "∾̳" }], [0, "∿"], [0, "≀"], [0, "≁"], [0, { v: "≂", n: 824, o: "≂̸" }], [0, "≃"], [0, "≄"], [0, "≅"], [0, "≆"], [0, "≇"], [0, "≈"], [0, "≉"], [0, "≊"], [0, { v: "≋", n: 824, o: "≋̸" }], [0, "≌"], [0, { v: "≍", n: 8402, o: "≍⃒" }], [0, { v: "≎", n: 824, o: "≎̸" }], [0, { v: "≏", n: 824, o: "≏̸" }], [0, { v: "≐", n: 824, o: "≐̸" }], [0, "≑"], [0, "≒"], [0, "≓"], [0, "≔"], [0, "≕"], [0, "≖"], [0, "≗"], [1, "≙"], [0, "≚"], [1, "≜"], [2, "≟"], [0, "≠"], [0, { v: "≡", n: 8421, o: "≡⃥" }], [0, "≢"], [1, { v: "≤", n: 8402, o: "≤⃒" }], [0, { v: "≥", n: 8402, o: "≥⃒" }], [0, { v: "≦", n: 824, o: "≦̸" }], [0, { v: "≧", n: 824, o: "≧̸" }], [0, { v: "≨", n: 65024, o: "≨︀" }], [0, { v: "≩", n: 65024, o: "≩︀" }], [0, { v: "≪", n: /* #__PURE__ */ new Map(/* #__PURE__ */ restoreDiff([[824, "≪̸"], [7577, "≪⃒"]])) }], [0, { v: "≫", n: /* #__PURE__ */ new Map(/* #__PURE__ */ restoreDiff([[824, "≫̸"], [7577, "≫⃒"]])) }], [0, "≬"], [0, "≭"], [0, "≮"], [0, "≯"], [0, "≰"], [0, "≱"], [0, "≲"], [0, "≳"], [0, "≴"], [0, "≵"], [0, "≶"], [0, "≷"], [0, "≸"], [0, "≹"], [0, "≺"], [0, "≻"], [0, "≼"], [0, "≽"], [0, "≾"], [0, { v: "≿", n: 824, o: "≿̸" }], [0, "⊀"], [0, "⊁"], [0, { v: "⊂", n: 8402, o: "⊂⃒" }], [0, { v: "⊃", n: 8402, o: "⊃⃒" }], [0, "⊄"], [0, "⊅"], [0, "⊆"], [0, "⊇"], [0, "⊈"], [0, "⊉"], [0, { v: "⊊", n: 65024, o: "⊊︀" }], [0, { v: "⊋", n: 65024, o: "⊋︀" }], [1, "⊍"], [0, "⊎"], [0, { v: "⊏", n: 824, o: "⊏̸" }], [0, { v: "⊐", n: 824, o: "⊐̸" }], [0, "⊑"], [0, "⊒"], [0, { v: "⊓", n: 65024, o: "⊓︀" }], [0, { v: "⊔", n: 65024, o: "⊔︀" }], [0, "⊕"], [0, "⊖"], [0, "⊗"], [0, "⊘"], [0, "⊙"], [0, "⊚"], [0, "⊛"], [1, "⊝"], [0, "⊞"], [0, "⊟"], [0, "⊠"], [0, "⊡"], [0, "⊢"], [0, "⊣"], [0, "⊤"], [0, "⊥"], [1, "⊧"], [0, "⊨"], [0, "⊩"], [0, "⊪"], [0, "⊫"], [0, "⊬"], [0, "⊭"], [0, "⊮"], [0, "⊯"], [0, "⊰"], [1, "⊲"], [0, "⊳"], [0, { v: "⊴", n: 8402, o: "⊴⃒" }], [0, { v: "⊵", n: 8402, o: "⊵⃒" }], [0, "⊶"], [0, "⊷"], [0, "⊸"], [0, "⊹"], [0, "⊺"], [0, "⊻"], [1, "⊽"], [0, "⊾"], [0, "⊿"], [0, "⋀"], [0, "⋁"], [0, "⋂"], [0, "⋃"], [0, "⋄"], [0, "⋅"], [0, "⋆"], [0, "⋇"], [0, "⋈"], [0, "⋉"], [0, "⋊"], [0, "⋋"], [0, "⋌"], [0, "⋍"], [0, "⋎"], [0, "⋏"], [0, "⋐"], [0, "⋑"], [0, "⋒"], [0, "⋓"], [0, "⋔"], [0, "⋕"], [0, "⋖"], [0, "⋗"], [0, { v: "⋘", n: 824, o: "⋘̸" }], [0, { v: "⋙", n: 824, o: "⋙̸" }], [0, { v: "⋚", n: 65024, o: "⋚︀" }], [0, { v: "⋛", n: 65024, o: "⋛︀" }], [2, "⋞"], [0, "⋟"], [0, "⋠"], [0, "⋡"], [0, "⋢"], [0, "⋣"], [2, "⋦"], [0, "⋧"], [0, "⋨"], [0, "⋩"], [0, "⋪"], [0, "⋫"], [0, "⋬"], [0, "⋭"], [0, "⋮"], [0, "⋯"], [0, "⋰"], [0, "⋱"], [0, "⋲"], [0, "⋳"], [0, "⋴"], [0, { v: "⋵", n: 824, o: "⋵̸" }], [0, "⋶"], [0, "⋷"], [1, { v: "⋹", n: 824, o: "⋹̸" }], [0, "⋺"], [0, "⋻"], [0, "⋼"], [0, "⋽"], [0, "⋾"], [6, "⌅"], [0, "⌆"], [1, "⌈"], [0, "⌉"], [0, "⌊"], [0, "⌋"], [0, "⌌"], [0, "⌍"], [0, "⌎"], [0, "⌏"], [0, "⌐"], [1, "⌒"], [0, "⌓"], [1, "⌕"], [0, "⌖"], [5, "⌜"], [0, "⌝"], [0, "⌞"], [0, "⌟"], [2, "⌢"], [0, "⌣"], [9, "⌭"], [0, "⌮"], [7, "⌶"], [6, "⌽"], [1, "⌿"], [60, "⍼"], [51, "⎰"], [0, "⎱"], [2, "⎴"], [0, "⎵"], [0, "⎶"], [37, "⏜"], [0, "⏝"], [0, "⏞"], [0, "⏟"], [2, "⏢"], [4, "⏧"], [59, "␣"], [164, "Ⓢ"], [55, "─"], [1, "│"], [9, "┌"], [3, "┐"], [3, "└"], [3, "┘"], [3, "├"], [7, "┤"], [7, "┬"], [7, "┴"], [7, "┼"], [19, "═"], [0, "║"], [0, "╒"], [0, "╓"], [0, "╔"], [0, "╕"], [0, "╖"], [0, "╗"], [0, "╘"], [0, "╙"], [0, "╚"], [0, "╛"], [0, "╜"], [0, "╝"], [0, "╞"], [0, "╟"], [0, "╠"], [0, "╡"], [0, "╢"], [0, "╣"], [0, "╤"], [0, "╥"], [0, "╦"], [0, "╧"], [0, "╨"], [0, "╩"], [0, "╪"], [0, "╫"], [0, "╬"], [19, "▀"], [3, "▄"], [3, "█"], [8, "░"], [0, "▒"], [0, "▓"], [13, "□"], [8, "▪"], [0, "▫"], [1, "▭"], [0, "▮"], [2, "▱"], [1, "△"], [0, "▴"], [0, "▵"], [2, "▸"], [0, "▹"], [3, "▽"], [0, "▾"], [0, "▿"], [2, "◂"], [0, "◃"], [6, "◊"], [0, "○"], [32, "◬"], [2, "◯"], [8, "◸"], [0, "◹"], [0, "◺"], [0, "◻"], [0, "◼"], [8, "★"], [0, "☆"], [7, "☎"], [49, "♀"], [1, "♂"], [29, "♠"], [2, "♣"], [1, "♥"], [0, "♦"], [3, "♪"], [2, "♭"], [0, "♮"], [0, "♯"], [163, "✓"], [3, "✗"], [8, "✠"], [21, "✶"], [33, "❘"], [25, "❲"], [0, "❳"], [84, "⟈"], [0, "⟉"], [28, "⟦"], [0, "⟧"], [0, "⟨"], [0, "⟩"], [0, "⟪"], [0, "⟫"], [0, "⟬"], [0, "⟭"], [7, "⟵"], [0, "⟶"], [0, "⟷"], [0, "⟸"], [0, "⟹"], [0, "⟺"], [1, "⟼"], [2, "⟿"], [258, "⤂"], [0, "⤃"], [0, "⤄"], [0, "⤅"], [6, "⤌"], [0, "⤍"], [0, "⤎"], [0, "⤏"], [0, "⤐"], [0, "⤑"], [0, "⤒"], [0, "⤓"], [2, "⤖"], [2, "⤙"], [0, "⤚"], [0, "⤛"], [0, "⤜"], [0, "⤝"], [0, "⤞"], [0, "⤟"], [0, "⤠"], [2, "⤣"], [0, "⤤"], [0, "⤥"], [0, "⤦"], [0, "⤧"], [0, "⤨"], [0, "⤩"], [0, "⤪"], [8, { v: "⤳", n: 824, o: "⤳̸" }], [1, "⤵"], [0, "⤶"], [0, "⤷"], [0, "⤸"], [0, "⤹"], [2, "⤼"], [0, "⤽"], [7, "⥅"], [2, "⥈"], [0, "⥉"], [0, "⥊"], [0, "⥋"], [2, "⥎"], [0, "⥏"], [0, "⥐"], [0, "⥑"], [0, "⥒"], [0, "⥓"], [0, "⥔"], [0, "⥕"], [0, "⥖"], [0, "⥗"], [0, "⥘"], [0, "⥙"], [0, "⥚"], [0, "⥛"], [0, "⥜"], [0, "⥝"], [0, "⥞"], [0, "⥟"], [0, "⥠"], [0, "⥡"], [0, "⥢"], [0, "⥣"], [0, "⥤"], [0, "⥥"], [0, "⥦"], [0, "⥧"], [0, "⥨"], [0, "⥩"], [0, "⥪"], [0, "⥫"], [0, "⥬"], [0, "⥭"], [0, "⥮"], [0, "⥯"], [0, "⥰"], [0, "⥱"], [0, "⥲"], [0, "⥳"], [0, "⥴"], [0, "⥵"], [0, "⥶"], [1, "⥸"], [0, "⥹"], [1, "⥻"], [0, "⥼"], [0, "⥽"], [0, "⥾"], [0, "⥿"], [5, "⦅"], [0, "⦆"], [4, "⦋"], [0, "⦌"], [0, "⦍"], [0, "⦎"], [0, "⦏"], [0, "⦐"], [0, "⦑"], [0, "⦒"], [0, "⦓"], [0, "⦔"], [0, "⦕"], [0, "⦖"], [3, "⦚"], [1, "⦜"], [0, "⦝"], [6, "⦤"], [0, "⦥"], [0, "⦦"], [0, "⦧"], [0, "⦨"], [0, "⦩"], [0, "⦪"], [0, "⦫"], [0, "⦬"], [0, "⦭"], [0, "⦮"], [0, "⦯"], [0, "⦰"], [0, "⦱"], [0, "⦲"], [0, "⦳"], [0, "⦴"], [0, "⦵"], [0, "⦶"], [0, "⦷"], [1, "⦹"], [1, "⦻"], [0, "⦼"], [1, "⦾"], [0, "⦿"], [0, "⧀"], [0, "⧁"], [0, "⧂"], [0, "⧃"], [0, "⧄"], [0, "⧅"], [3, "⧉"], [3, "⧍"], [0, "⧎"], [0, { v: "⧏", n: 824, o: "⧏̸" }], [0, { v: "⧐", n: 824, o: "⧐̸" }], [11, "⧜"], [0, "⧝"], [0, "⧞"], [4, "⧣"], [0, "⧤"], [0, "⧥"], [5, "⧫"], [8, "⧴"], [1, "⧶"], [9, "⨀"], [0, "⨁"], [0, "⨂"], [1, "⨄"], [1, "⨆"], [5, "⨌"], [0, "⨍"], [2, "⨐"], [0, "⨑"], [0, "⨒"], [0, "⨓"], [0, "⨔"], [0, "⨕"], [0, "⨖"], [0, "⨗"], [10, "⨢"], [0, "⨣"], [0, "⨤"], [0, "⨥"], [0, "⨦"], [0, "⨧"], [1, "⨩"], [0, "⨪"], [2, "⨭"], [0, "⨮"], [0, "⨯"], [0, "⨰"], [0, "⨱"], [1, "⨳"], [0, "⨴"], [0, "⨵"], [0, "⨶"], [0, "⨷"], [0, "⨸"], [0, "⨹"], [0, "⨺"], [0, "⨻"], [0, "⨼"], [2, "⨿"], [0, "⩀"], [1, "⩂"], [0, "⩃"], [0, "⩄"], [0, "⩅"], [0, "⩆"], [0, "⩇"], [0, "⩈"], [0, "⩉"], [0, "⩊"], [0, "⩋"], [0, "⩌"], [0, "⩍"], [2, "⩐"], [2, "⩓"], [0, "⩔"], [0, "⩕"], [0, "⩖"], [0, "⩗"], [0, "⩘"], [1, "⩚"], [0, "⩛"], [0, "⩜"], [0, "⩝"], [1, "⩟"], [6, "⩦"], [3, "⩪"], [2, { v: "⩭", n: 824, o: "⩭̸" }], [0, "⩮"], [0, "⩯"], [0, { v: "⩰", n: 824, o: "⩰̸" }], [0, "⩱"], [0, "⩲"], [0, "⩳"], [0, "⩴"], [0, "⩵"], [1, "⩷"], [0, "⩸"], [0, "⩹"], [0, "⩺"], [0, "⩻"], [0, "⩼"], [0, { v: "⩽", n: 824, o: "⩽̸" }], [0, { v: "⩾", n: 824, o: "⩾̸" }], [0, "⩿"], [0, "⪀"], [0, "⪁"], [0, "⪂"], [0, "⪃"], [0, "⪄"], [0, "⪅"], [0, "⪆"], [0, "⪇"], [0, "⪈"], [0, "⪉"], [0, "⪊"], [0, "⪋"], [0, "⪌"], [0, "⪍"], [0, "⪎"], [0, "⪏"], [0, "⪐"], [0, "⪑"], [0, "⪒"], [0, "⪓"], [0, "⪔"], [0, "⪕"], [0, "⪖"], [0, "⪗"], [0, "⪘"], [0, "⪙"], [0, "⪚"], [2, "⪝"], [0, "⪞"], [0, "⪟"], [0, "⪠"], [0, { v: "⪡", n: 824, o: "⪡̸" }], [0, { v: "⪢", n: 824, o: "⪢̸" }], [1, "⪤"], [0, "⪥"], [0, "⪦"], [0, "⪧"], [0, "⪨"], [0, "⪩"], [0, "⪪"], [0, "⪫"], [0, { v: "⪬", n: 65024, o: "⪬︀" }], [0, { v: "⪭", n: 65024, o: "⪭︀" }], [0, "⪮"], [0, { v: "⪯", n: 824, o: "⪯̸" }], [0, { v: "⪰", n: 824, o: "⪰̸" }], [2, "⪳"], [0, "⪴"], [0, "⪵"], [0, "⪶"], [0, "⪷"], [0, "⪸"], [0, "⪹"], [0, "⪺"], [0, "⪻"], [0, "⪼"], [0, "⪽"], [0, "⪾"], [0, "⪿"], [0, "⫀"], [0, "⫁"], [0, "⫂"], [0, "⫃"], [0, "⫄"], [0, { v: "⫅", n: 824, o: "⫅̸" }], [0, { v: "⫆", n: 824, o: "⫆̸" }], [0, "⫇"], [0, "⫈"], [2, { v: "⫋", n: 65024, o: "⫋︀" }], [0, { v: "⫌", n: 65024, o: "⫌︀" }], [2, "⫏"], [0, "⫐"], [0, "⫑"], [0, "⫒"], [0, "⫓"], [0, "⫔"], [0, "⫕"], [0, "⫖"], [0, "⫗"], [0, "⫘"], [0, "⫙"], [0, "⫚"], [0, "⫛"], [8, "⫤"], [1, "⫦"], [0, "⫧"], [0, "⫨"], [0, "⫩"], [1, "⫫"], [0, "⫬"], [0, "⫭"], [0, "⫮"], [0, "⫯"], [0, "⫰"], [0, "⫱"], [0, "⫲"], [0, "⫳"], [9, { v: "⫽", n: 8421, o: "⫽⃥" }], [44343, { n: /* #__PURE__ */ new Map(/* #__PURE__ */ restoreDiff([[56476, "𝒜"], [1, "𝒞"], [0, "𝒟"], [2, "𝒢"], [2, "𝒥"], [0, "𝒦"], [2, "𝒩"], [0, "𝒪"], [0, "𝒫"], [0, "𝒬"], [1, "𝒮"], [0, "𝒯"], [0, "𝒰"], [0, "𝒱"], [0, "𝒲"], [0, "𝒳"], [0, "𝒴"], [0, "𝒵"], [0, "𝒶"], [0, "𝒷"], [0, "𝒸"], [0, "𝒹"], [1, "𝒻"], [1, "𝒽"], [0, "𝒾"], [0, "𝒿"], [0, "𝓀"], [0, "𝓁"], [0, "𝓂"], [0, "𝓃"], [1, "𝓅"], [0, "𝓆"], [0, "𝓇"], [0, "𝓈"], [0, "𝓉"], [0, "𝓊"], [0, "𝓋"], [0, "𝓌"], [0, "𝓍"], [0, "𝓎"], [0, "𝓏"], [52, "𝔄"], [0, "𝔅"], [1, "𝔇"], [0, "𝔈"], [0, "𝔉"], [0, "𝔊"], [2, "𝔍"], [0, "𝔎"], [0, "𝔏"], [0, "𝔐"], [0, "𝔑"], [0, "𝔒"], [0, "𝔓"], [0, "𝔔"], [1, "𝔖"], [0, "𝔗"], [0, "𝔘"], [0, "𝔙"], [0, "𝔚"], [0, "𝔛"], [0, "𝔜"], [1, "𝔞"], [0, "𝔟"], [0, "𝔠"], [0, "𝔡"], [0, "𝔢"], [0, "𝔣"], [0, "𝔤"], [0, "𝔥"], [0, "𝔦"], [0, "𝔧"], [0, "𝔨"], [0, "𝔩"], [0, "𝔪"], [0, "𝔫"], [0, "𝔬"], [0, "𝔭"], [0, "𝔮"], [0, "𝔯"], [0, "𝔰"], [0, "𝔱"], [0, "𝔲"], [0, "𝔳"], [0, "𝔴"], [0, "𝔵"], [0, "𝔶"], [0, "𝔷"], [0, "𝔸"], [0, "𝔹"], [1, "𝔻"], [0, "𝔼"], [0, "𝔽"], [0, "𝔾"], [1, "𝕀"], [0, "𝕁"], [0, "𝕂"], [0, "𝕃"], [0, "𝕄"], [1, "𝕆"], [3, "𝕊"], [0, "𝕋"], [0, "𝕌"], [0, "𝕍"], [0, "𝕎"], [0, "𝕏"], [0, "𝕐"], [1, "𝕒"], [0, "𝕓"], [0, "𝕔"], [0, "𝕕"], [0, "𝕖"], [0, "𝕗"], [0, "𝕘"], [0, "𝕙"], [0, "𝕚"], [0, "𝕛"], [0, "𝕜"], [0, "𝕝"], [0, "𝕞"], [0, "𝕟"], [0, "𝕠"], [0, "𝕡"], [0, "𝕢"], [0, "𝕣"], [0, "𝕤"], [0, "𝕥"], [0, "𝕦"], [0, "𝕧"], [0, "𝕨"], [0, "𝕩"], [0, "𝕪"], [0, "𝕫"]])) }], [8906, "ff"], [0, "fi"], [0, "fl"], [0, "ffi"], [0, "ffl"]])); +//# sourceMappingURL=encode-html.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.js.map new file mode 100644 index 0000000..7571a8d --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/generated/encode-html.js.map @@ -0,0 +1 @@ +{"version":3,"file":"encode-html.js","sourceRoot":"","sources":["../../../src/generated/encode-html.ts"],"names":[],"mappings":"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AAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,EAAE,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAE,EAAC,SAAS,CAAC,EAAC,CAAC,EAAE,EAAC,UAAU,CAAC,EAAC,CAAC,EAAE,EAAC,SAAS,CAAC,EAAC,CAAC,GAAG,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,EAAE,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,kBAAkB,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,oBAAoB,CAAC,EAAC,CAAC,CA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AC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,IAAI,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,aAAa,CAAC,EAAC,CAAC,CA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AAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,gBAAgB,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,mBAAmB,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,sBAAsB,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,oBAAoB,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,uBAAuB,EAAC,CAAC,EAAC,CAAC,EAAE,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,gBAAgB,CAAC,EAAC,CAAC,CAAC,EAAC,eAAe,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,aAAa,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,EAAE,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,WAAW,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,OAAO,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,QAAQ,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,aAAa,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,aAAa,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,qBAAqB,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,kBAAkB,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,2BAA2B,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,QAAQ,EAAC,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,SAAS,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,QAAQ,EAAC,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,SAAS,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,iBAAiB,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,oBAAoB,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,OAAO,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,oBAAoB,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,eAAe,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,QAAQ,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,SAAS,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,QAAQ,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,SAAS,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,SAAS,EAAC,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,iBAAiB,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,SAAS,EAAC,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,iBAAiB,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,EAAC,SAAS,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,UAAU,EAAC,CAAC,EAAC,CAAC,KAAK,EAAC,EAAC,CAAC,EAAC,eAAe,CAAC,IAAI,GAAG,CAAgB,eAAe,CAAA,WAAW,CAAC,CAAC,CAAC,KAAK,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAE,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,IAAI,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.d.ts new file mode 100644 index 0000000..bdb9ab7 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.d.ts @@ -0,0 +1,96 @@ +import { DecodingMode } from "./decode.js"; +/** The level of entities to support. */ +export declare enum EntityLevel { + /** Support only XML entities. */ + XML = 0, + /** Support HTML entities, which are a superset of XML entities. */ + HTML = 1 +} +export declare enum EncodingMode { + /** + * The output is UTF-8 encoded. Only characters that need escaping within + * XML will be escaped. + */ + UTF8 = 0, + /** + * The output consists only of ASCII characters. Characters that need + * escaping within HTML, and characters that aren't ASCII characters will + * be escaped. + */ + ASCII = 1, + /** + * Encode all characters that have an equivalent entity, as well as all + * characters that are not ASCII characters. + */ + Extensive = 2, + /** + * Encode all characters that have to be escaped in HTML attributes, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + */ + Attribute = 3, + /** + * Encode all characters that have to be escaped in HTML text, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + */ + Text = 4 +} +export interface DecodingOptions { + /** + * The level of entities to support. + * @default {@link EntityLevel.XML} + */ + level?: EntityLevel; + /** + * Decoding mode. If `Legacy`, will support legacy entities not terminated + * with a semicolon (`;`). + * + * Always `Strict` for XML. For HTML, set this to `true` if you are parsing + * an attribute value. + * + * The deprecated `decodeStrict` function defaults this to `Strict`. + * + * @default {@link DecodingMode.Legacy} + */ + mode?: DecodingMode | undefined; +} +/** + * Decodes a string with entities. + * + * @param input String to decode. + * @param options Decoding options. + */ +export declare function decode(input: string, options?: DecodingOptions | EntityLevel): string; +/** + * Decodes a string with entities. Does not allow missing trailing semicolons for entities. + * + * @param input String to decode. + * @param options Decoding options. + * @deprecated Use `decode` with the `mode` set to `Strict`. + */ +export declare function decodeStrict(input: string, options?: DecodingOptions | EntityLevel): string; +/** + * Options for `encode`. + */ +export interface EncodingOptions { + /** + * The level of entities to support. + * @default {@link EntityLevel.XML} + */ + level?: EntityLevel; + /** + * Output format. + * @default {@link EncodingMode.Extensive} + */ + mode?: EncodingMode; +} +/** + * Encodes a string with entities. + * + * @param input String to encode. + * @param options Encoding options. + */ +export declare function encode(input: string, options?: EncodingOptions | EntityLevel): string; +export { encodeXML, escape, escapeUTF8, escapeAttribute, escapeText, } from "./escape.js"; +export { encodeHTML, encodeNonAsciiHTML, encodeHTML as encodeHTML4, encodeHTML as encodeHTML5, } from "./encode.js"; +export { EntityDecoder, DecodingMode, decodeXML, decodeHTML, decodeHTMLStrict, decodeHTMLAttribute, decodeHTML as decodeHTML4, decodeHTML as decodeHTML5, decodeHTMLStrict as decodeHTML4Strict, decodeHTMLStrict as decodeHTML5Strict, decodeXML as decodeXMLStrict, } from "./decode.js"; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.d.ts.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.d.ts.map new file mode 100644 index 0000000..7b9b63f --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,YAAY,EAAE,MAAM,aAAa,CAAC;AASlE,wCAAwC;AACxC,oBAAY,WAAW;IACnB,iCAAiC;IACjC,GAAG,IAAI;IACP,mEAAmE;IACnE,IAAI,IAAI;CACX;AAED,oBAAY,YAAY;IACpB;;;OAGG;IACH,IAAI,IAAA;IACJ;;;;OAIG;IACH,KAAK,IAAA;IACL;;;OAGG;IACH,SAAS,IAAA;IACT;;;OAGG;IACH,SAAS,IAAA;IACT;;;OAGG;IACH,IAAI,IAAA;CACP;AAED,MAAM,WAAW,eAAe;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;CACnC;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,eAAe,GAAG,WAA6B,GACzD,MAAM,CASR;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,eAAe,GAAG,WAA6B,GACzD,MAAM,CAMR;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,eAAe,GAAG,WAA6B,GACzD,MAAM,CA2BR;AAED,OAAO,EACH,SAAS,EACT,MAAM,EACN,UAAU,EACV,eAAe,EACf,UAAU,GACb,MAAM,aAAa,CAAC;AAErB,OAAO,EACH,UAAU,EACV,kBAAkB,EAElB,UAAU,IAAI,WAAW,EACzB,UAAU,IAAI,WAAW,GAC5B,MAAM,aAAa,CAAC;AAErB,OAAO,EACH,aAAa,EACb,YAAY,EACZ,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EAEnB,UAAU,IAAI,WAAW,EACzB,UAAU,IAAI,WAAW,EACzB,gBAAgB,IAAI,iBAAiB,EACrC,gBAAgB,IAAI,iBAAiB,EACrC,SAAS,IAAI,eAAe,GAC/B,MAAM,aAAa,CAAC"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.js b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.js new file mode 100644 index 0000000..17576a8 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.js @@ -0,0 +1,107 @@ +import { decodeXML, decodeHTML, DecodingMode } from "./decode.js"; +import { encodeHTML, encodeNonAsciiHTML } from "./encode.js"; +import { encodeXML, escapeUTF8, escapeAttribute, escapeText, } from "./escape.js"; +/** The level of entities to support. */ +export var EntityLevel; +(function (EntityLevel) { + /** Support only XML entities. */ + EntityLevel[EntityLevel["XML"] = 0] = "XML"; + /** Support HTML entities, which are a superset of XML entities. */ + EntityLevel[EntityLevel["HTML"] = 1] = "HTML"; +})(EntityLevel || (EntityLevel = {})); +export var EncodingMode; +(function (EncodingMode) { + /** + * The output is UTF-8 encoded. Only characters that need escaping within + * XML will be escaped. + */ + EncodingMode[EncodingMode["UTF8"] = 0] = "UTF8"; + /** + * The output consists only of ASCII characters. Characters that need + * escaping within HTML, and characters that aren't ASCII characters will + * be escaped. + */ + EncodingMode[EncodingMode["ASCII"] = 1] = "ASCII"; + /** + * Encode all characters that have an equivalent entity, as well as all + * characters that are not ASCII characters. + */ + EncodingMode[EncodingMode["Extensive"] = 2] = "Extensive"; + /** + * Encode all characters that have to be escaped in HTML attributes, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + */ + EncodingMode[EncodingMode["Attribute"] = 3] = "Attribute"; + /** + * Encode all characters that have to be escaped in HTML text, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + */ + EncodingMode[EncodingMode["Text"] = 4] = "Text"; +})(EncodingMode || (EncodingMode = {})); +/** + * Decodes a string with entities. + * + * @param input String to decode. + * @param options Decoding options. + */ +export function decode(input, options = EntityLevel.XML) { + const level = typeof options === "number" ? options : options.level; + if (level === EntityLevel.HTML) { + const mode = typeof options === "object" ? options.mode : undefined; + return decodeHTML(input, mode); + } + return decodeXML(input); +} +/** + * Decodes a string with entities. Does not allow missing trailing semicolons for entities. + * + * @param input String to decode. + * @param options Decoding options. + * @deprecated Use `decode` with the `mode` set to `Strict`. + */ +export function decodeStrict(input, options = EntityLevel.XML) { + var _a; + const normalizedOptions = typeof options === "number" ? { level: options } : options; + (_a = normalizedOptions.mode) !== null && _a !== void 0 ? _a : (normalizedOptions.mode = DecodingMode.Strict); + return decode(input, normalizedOptions); +} +/** + * Encodes a string with entities. + * + * @param input String to encode. + * @param options Encoding options. + */ +export function encode(input, options = EntityLevel.XML) { + const { mode = EncodingMode.Extensive, level = EntityLevel.XML } = typeof options === "number" ? { level: options } : options; + switch (mode) { + case EncodingMode.UTF8: { + return escapeUTF8(input); + } + case EncodingMode.Attribute: { + return escapeAttribute(input); + } + case EncodingMode.Text: { + return escapeText(input); + } + case EncodingMode.ASCII: { + return level === EntityLevel.HTML + ? encodeNonAsciiHTML(input) + : encodeXML(input); + } + // eslint-disable-next-line unicorn/no-useless-switch-case + case EncodingMode.Extensive: + default: { + return level === EntityLevel.HTML + ? encodeHTML(input) + : encodeXML(input); + } + } +} +export { encodeXML, escape, escapeUTF8, escapeAttribute, escapeText, } from "./escape.js"; +export { encodeHTML, encodeNonAsciiHTML, +// Legacy aliases (deprecated) +encodeHTML as encodeHTML4, encodeHTML as encodeHTML5, } from "./encode.js"; +export { EntityDecoder, DecodingMode, decodeXML, decodeHTML, decodeHTMLStrict, decodeHTMLAttribute, +// Legacy aliases (deprecated) +decodeHTML as decodeHTML4, decodeHTML as decodeHTML5, decodeHTMLStrict as decodeHTML4Strict, decodeHTMLStrict as decodeHTML5Strict, decodeXML as decodeXMLStrict, } from "./decode.js"; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.js.map b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.js.map new file mode 100644 index 0000000..a52a5e3 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/package.json b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/package.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/dist/esm/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/node_modules/@11ty/eleventy/node_modules/entities/escape.d.ts b/node_modules/@11ty/eleventy/node_modules/entities/escape.d.ts new file mode 100644 index 0000000..58013d7 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/escape.d.ts @@ -0,0 +1 @@ +export * from "./dist/commonjs/escape.js"; diff --git a/node_modules/@11ty/eleventy/node_modules/entities/escape.js b/node_modules/@11ty/eleventy/node_modules/entities/escape.js new file mode 100644 index 0000000..5caf41a --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/escape.js @@ -0,0 +1,3 @@ +// Make exports work in Node < 12 +// eslint-disable-next-line no-undef, unicorn/prefer-module +module.exports = require("./dist/commonjs/escape.js"); diff --git a/node_modules/@11ty/eleventy/node_modules/entities/package.json b/node_modules/@11ty/eleventy/node_modules/entities/package.json new file mode 100644 index 0000000..9bc32ff --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/package.json @@ -0,0 +1,118 @@ +{ + "name": "entities", + "version": "6.0.1", + "description": "Encode & decode XML and HTML entities with ease & speed", + "keywords": [ + "html entities", + "entity decoder", + "entity encoding", + "html decoding", + "html encoding", + "xml decoding", + "xml encoding" + ], + "repository": { + "type": "git", + "url": "git://github.com/fb55/entities.git" + }, + "funding": "https://github.com/fb55/entities?sponsor=1", + "license": "BSD-2-Clause", + "author": "Felix Boehm ", + "sideEffects": false, + "type": "module", + "exports": { + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + }, + "./decode": { + "import": { + "types": "./dist/esm/decode.d.ts", + "default": "./dist/esm/decode.js" + }, + "require": { + "types": "./dist/commonjs/decode.d.ts", + "default": "./dist/commonjs/decode.js" + } + }, + "./escape": { + "import": { + "types": "./dist/esm/escape.d.ts", + "default": "./dist/esm/escape.js" + }, + "require": { + "types": "./dist/commonjs/escape.d.ts", + "default": "./dist/commonjs/escape.js" + } + } + }, + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "decode.js", + "decode.d.ts", + "escape.js", + "escape.d.ts", + "dist", + "src" + ], + "scripts": { + "build:docs": "typedoc --hideGenerator src/index.ts", + "build:encode-trie": "node --import=tsx scripts/write-encode-map.ts", + "build:trie": "node --import=tsx scripts/write-decode-map.ts", + "format": "npm run format:es && npm run format:prettier", + "format:es": "npm run lint:es -- --fix", + "format:prettier": "npm run prettier -- --write", + "lint": "npm run lint:es && npm run lint:ts && npm run lint:prettier", + "lint:es": "eslint . --ignore-path .gitignore", + "lint:prettier": "npm run prettier -- --check", + "lint:ts": "tsc --noEmit", + "prepublishOnly": "tshy", + "prettier": "prettier '**/*.{ts,md,json,yml}'", + "test": "npm run test:vi && npm run lint", + "test:vi": "vitest run" + }, + "prettier": { + "proseWrap": "always", + "tabWidth": 4 + }, + "devDependencies": { + "@types/node": "^22.15.30", + "@typescript-eslint/eslint-plugin": "^8.33.1", + "@typescript-eslint/parser": "^8.33.1", + "@vitest/coverage-v8": "^2.1.8", + "eslint": "^8.57.1", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-n": "^17.19.0", + "eslint-plugin-unicorn": "^56.0.1", + "prettier": "^3.5.3", + "tshy": "^3.0.2", + "tsx": "^4.19.4", + "typedoc": "^0.28.5", + "typescript": "^5.8.3", + "vitest": "^2.0.2" + }, + "engines": { + "node": ">=0.12" + }, + "tshy": { + "exclude": [ + "**/*.spec.ts", + "**/__fixtures__/*", + "**/__tests__/*", + "**/__snapshots__/*" + ], + "exports": { + ".": "./src/index.ts", + "./decode": "./src/decode.ts", + "./escape": "./src/escape.ts" + } + } +} diff --git a/node_modules/@11ty/eleventy/node_modules/entities/readme.md b/node_modules/@11ty/eleventy/node_modules/entities/readme.md new file mode 100644 index 0000000..20c88b5 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/readme.md @@ -0,0 +1,122 @@ +# entities [![NPM version](https://img.shields.io/npm/v/entities.svg)](https://npmjs.org/package/entities) [![Downloads](https://img.shields.io/npm/dm/entities.svg)](https://npmjs.org/package/entities) [![Node.js CI](https://github.com/fb55/entities/actions/workflows/nodejs-test.yml/badge.svg)](https://github.com/fb55/entities/actions/workflows/nodejs-test.yml) + +Encode & decode HTML & XML entities with ease & speed. + +## Features + +- 😇 Tried and true: `entities` is used by many popular libraries; eg. + [`htmlparser2`](https://github.com/fb55/htmlparser2), the official + [AWS SDK](https://github.com/aws/aws-sdk-js-v3) and + [`commonmark`](https://github.com/commonmark/commonmark.js) use it to process + HTML entities. +- ⚡️ Fast: `entities` is the fastest library for decoding HTML entities (as of + April 2022); see [performance](#performance). +- 🎛 Configurable: Get an output tailored for your needs. You are fine with + UTF8? That'll save you some bytes. Prefer to only have ASCII characters? We + can do that as well! + +## How to… + +### …install `entities` + + npm install entities + +### …use `entities` + +```javascript +const entities = require("entities"); + +// Encoding +entities.escapeUTF8("& ü"); // "&#38; ü" +entities.encodeXML("& ü"); // "&#38; ü" +entities.encodeHTML("& ü"); // "&#38; ü" + +// Decoding +entities.decodeXML("asdf & ÿ ü '"); // "asdf & ÿ ü '" +entities.decodeHTML("asdf & ÿ ü '"); // "asdf & ÿ ü '" +``` + +## Performance + +This is how `entities` compares to other libraries on a very basic benchmark +(see `scripts/benchmark.ts`, for 10,000,000 iterations; **lower is better**): + +| Library | Version | `decode` perf | `encode` perf | `escape` perf | +| -------------- | ------- | ------------- | ------------- | ------------- | +| entities | `3.0.1` | 1.418s | 6.786s | 2.196s | +| html-entities | `2.3.2` | 2.530s | 6.829s | 2.415s | +| he | `1.2.0` | 5.800s | 24.237s | 3.624s | +| parse-entities | `3.0.0` | 9.660s | N/A | N/A | + +--- + +## FAQ + +> What methods should I actually use to encode my documents? + +If your target supports UTF-8, the `escapeUTF8` method is going to be your best +choice. Otherwise, use either `encodeHTML` or `encodeXML` based on whether +you're dealing with an HTML or an XML document. + +You can have a look at the options for the `encode` and `decode` methods to see +everything you can configure. + +> When should I use strict decoding? + +When strict decoding, entities not terminated with a semicolon will be ignored. +This is helpful for decoding entities in legacy environments. + +> Why should I use `entities` instead of alternative modules? + +As of April 2022, `entities` is a bit faster than other modules. Still, this is +not a very differentiated space and other modules can catch up. + +**More importantly**, you might already have `entities` in your dependency graph +(as a dependency of eg. `cheerio`, or `htmlparser2`), and including it directly +might not even increase your bundle size. The same is true for other entity +libraries, so have a look through your `node_modules` directory! + +> Does `entities` support tree shaking? + +Yes! `entities` ships as both a CommonJS and a ES module. Note that for best +results, you should not use the `encode` and `decode` functions, as they wrap +around a number of other functions, all of which will remain in the bundle. +Instead, use the functions that you need directly. + +--- + +## Acknowledgements + +This library wouldn't be possible without the work of these individuals. Thanks +to + +- [@mathiasbynens](https://github.com/mathiasbynens) for his explanations about + character encodings, and his library `he`, which was one of the inspirations + for `entities` +- [@inikulin](https://github.com/inikulin) for his work on optimized tries for + decoding HTML entities for the `parse5` project +- [@mdevils](https://github.com/mdevils) for taking on the challenge of + producing a quick entity library with his `html-entities` library. `entities` + would be quite a bit slower if there wasn't any competition. Right now + `entities` is on top, but we'll see how long that lasts! + +--- + +License: BSD-2-Clause + +## Security contact information + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). Tidelift will +coordinate the fix and disclosure. + +## `entities` for enterprise + +Available as part of the Tidelift Subscription + +The maintainers of `entities` and thousands of other packages are working with +Tidelift to deliver commercial support and maintenance for the open source +dependencies you use to build your applications. Save time, reduce risk, and +improve code health, while paying the maintainers of the exact dependencies you +use. +[Learn more.](https://tidelift.com/subscription/pkg/npm-entities?utm_source=npm-entities&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/node_modules/@11ty/eleventy/node_modules/entities/src/decode-codepoint.ts b/node_modules/@11ty/eleventy/node_modules/entities/src/decode-codepoint.ts new file mode 100644 index 0000000..d21de7b --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/src/decode-codepoint.ts @@ -0,0 +1,81 @@ +// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134 + +const decodeMap = new Map([ + [0, 65_533], + // C1 Unicode control character reference replacements + [128, 8364], + [130, 8218], + [131, 402], + [132, 8222], + [133, 8230], + [134, 8224], + [135, 8225], + [136, 710], + [137, 8240], + [138, 352], + [139, 8249], + [140, 338], + [142, 381], + [145, 8216], + [146, 8217], + [147, 8220], + [148, 8221], + [149, 8226], + [150, 8211], + [151, 8212], + [152, 732], + [153, 8482], + [154, 353], + [155, 8250], + [156, 339], + [158, 382], + [159, 376], +]); + +/** + * Polyfill for `String.fromCodePoint`. It is used to create a string from a Unicode code point. + */ +export const fromCodePoint: (...codePoints: number[]) => string = + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, n/no-unsupported-features/es-builtins + String.fromCodePoint ?? + function (codePoint: number): string { + let output = ""; + + if (codePoint > 0xff_ff) { + codePoint -= 0x1_00_00; + output += String.fromCharCode( + ((codePoint >>> 10) & 0x3_ff) | 0xd8_00, + ); + codePoint = 0xdc_00 | (codePoint & 0x3_ff); + } + + output += String.fromCharCode(codePoint); + return output; + }; + +/** + * Replace the given code point with a replacement character if it is a + * surrogate or is outside the valid range. Otherwise return the code + * point unchanged. + */ +export function replaceCodePoint(codePoint: number): number { + if ( + (codePoint >= 0xd8_00 && codePoint <= 0xdf_ff) || + codePoint > 0x10_ff_ff + ) { + return 0xff_fd; + } + + return decodeMap.get(codePoint) ?? codePoint; +} + +/** + * Replace the code point if relevant, then convert it to a string. + * + * @deprecated Use `fromCodePoint(replaceCodePoint(codePoint))` instead. + * @param codePoint The code point to decode. + * @returns The decoded code point. + */ +export function decodeCodePoint(codePoint: number): string { + return fromCodePoint(replaceCodePoint(codePoint)); +} diff --git a/node_modules/@11ty/eleventy/node_modules/entities/src/decode.spec.ts b/node_modules/@11ty/eleventy/node_modules/entities/src/decode.spec.ts new file mode 100644 index 0000000..6ab37d4 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/src/decode.spec.ts @@ -0,0 +1,320 @@ +import { describe, it, expect, vitest } from "vitest"; +import * as entities from "./decode.js"; + +describe("Decode test", () => { + const testcases = [ + { input: "&amp;", output: "&" }, + { input: "&#38;", output: "&" }, + { input: "&#x26;", output: "&" }, + { input: "&#X26;", output: "&" }, + { input: "&#38;", output: "&" }, + { input: "&#38;", output: "&" }, + { input: "&#38;", output: "&" }, + { input: ":", output: ":" }, + { input: ":", output: ":" }, + { input: ":", output: ":" }, + { input: ":", output: ":" }, + { input: "&#", output: "&#" }, + { input: "&>", output: "&>" }, + { input: "id=770&#anchor", output: "id=770&#anchor" }, + ]; + + for (const { input, output } of testcases) { + it(`should XML decode ${input}`, () => + expect(entities.decodeXML(input)).toBe(output)); + it(`should HTML decode ${input}`, () => + expect(entities.decodeHTML(input)).toBe(output)); + } + + it("should HTML decode partial legacy entity", () => { + expect(entities.decodeHTMLStrict("×bar")).toBe("×bar"); + expect(entities.decodeHTML("×bar")).toBe("×bar"); + }); + + it("should HTML decode legacy entities according to spec", () => + expect(entities.decodeHTML("?&image_uri=1&ℑ=2&image=3")).toBe( + "?&image_uri=1&ℑ=2&image=3", + )); + + it("should back out of legacy entities", () => + expect(entities.decodeHTML("&a")).toBe("&a")); + + it("should not parse numeric entities in strict mode", () => + expect(entities.decodeHTMLStrict("7")).toBe("7")); + + it("should parse   followed by < (#852)", () => + expect(entities.decodeHTML(" <")).toBe("\u00A0<")); + + it("should decode trailing legacy entities", () => { + expect(entities.decodeHTML("⨱×bar")).toBe("⨱×bar"); + }); + + it("should decode multi-byte entities", () => { + expect(entities.decodeHTML("≧̸")).toBe("≧̸"); + }); + + it("should not decode legacy entities followed by text in attribute mode", () => { + expect( + entities.decodeHTML("¬", entities.DecodingMode.Attribute), + ).toBe("¬"); + + expect( + entities.decodeHTML("¬i", entities.DecodingMode.Attribute), + ).toBe("¬i"); + + expect( + entities.decodeHTML("¬=", entities.DecodingMode.Attribute), + ).toBe("¬="); + + expect(entities.decodeHTMLAttribute("¬p")).toBe("¬p"); + expect(entities.decodeHTMLAttribute("¬P")).toBe("¬P"); + expect(entities.decodeHTMLAttribute("¬3")).toBe("¬3"); + }); +}); + +describe("EntityDecoder", () => { + it("should decode decimal entities", () => { + const callback = vitest.fn(); + const decoder = new entities.EntityDecoder( + entities.htmlDecodeTree, + callback, + ); + + expect(decoder.write("", 1)).toBe(-1); + expect(decoder.write("8;", 0)).toBe(5); + + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith(":".charCodeAt(0), 5); + }); + + it("should decode hex entities", () => { + const callback = vitest.fn(); + const decoder = new entities.EntityDecoder( + entities.htmlDecodeTree, + callback, + ); + + expect(decoder.write(":", 1)).toBe(6); + + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith(":".charCodeAt(0), 6); + }); + + it("should decode named entities", () => { + const callback = vitest.fn(); + const decoder = new entities.EntityDecoder( + entities.htmlDecodeTree, + callback, + ); + + expect(decoder.write("&", 1)).toBe(5); + + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith("&".charCodeAt(0), 5); + }); + + it("should decode legacy entities", () => { + const callback = vitest.fn(); + const decoder = new entities.EntityDecoder( + entities.htmlDecodeTree, + callback, + ); + decoder.startEntity(entities.DecodingMode.Legacy); + + expect(decoder.write("&", 1)).toBe(-1); + + expect(callback).toHaveBeenCalledTimes(0); + + expect(decoder.end()).toBe(4); + + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith("&".charCodeAt(0), 4); + }); + + it("should decode named entity written character by character", () => { + const callback = vitest.fn(); + const decoder = new entities.EntityDecoder( + entities.htmlDecodeTree, + callback, + ); + + for (const c of "amp") { + expect(decoder.write(c, 0)).toBe(-1); + } + expect(decoder.write(";", 0)).toBe(5); + + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith("&".charCodeAt(0), 5); + }); + + it("should decode numeric entity written character by character", () => { + const callback = vitest.fn(); + const decoder = new entities.EntityDecoder( + entities.htmlDecodeTree, + callback, + ); + + for (const c of "#x3a") { + expect(decoder.write(c, 0)).toBe(-1); + } + expect(decoder.write(";", 0)).toBe(6); + + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith(":".charCodeAt(0), 6); + }); + + it("should decode hex entities across several chunks", () => { + const callback = vitest.fn(); + const decoder = new entities.EntityDecoder( + entities.htmlDecodeTree, + callback, + ); + + for (const chunk of ["#x", "cf", "ff", "d"]) { + expect(decoder.write(chunk, 0)).toBe(-1); + } + + expect(decoder.write(";", 0)).toBe(9); + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith(0xc_ff_fd, 9); + }); + + it("should not fail if nothing is written", () => { + const callback = vitest.fn(); + const decoder = new entities.EntityDecoder( + entities.htmlDecodeTree, + callback, + ); + + expect(decoder.end()).toBe(0); + expect(callback).toHaveBeenCalledTimes(0); + }); + + describe("errors", () => { + it("should produce an error for a named entity without a semicolon", () => { + const errorHandlers = { + missingSemicolonAfterCharacterReference: vitest.fn(), + absenceOfDigitsInNumericCharacterReference: vitest.fn(), + validateNumericCharacterReference: vitest.fn(), + }; + const callback = vitest.fn(); + const decoder = new entities.EntityDecoder( + entities.htmlDecodeTree, + callback, + errorHandlers, + ); + + decoder.startEntity(entities.DecodingMode.Legacy); + expect(decoder.write("&", 1)).toBe(5); + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith("&".charCodeAt(0), 5); + expect( + errorHandlers.missingSemicolonAfterCharacterReference, + ).toHaveBeenCalledTimes(0); + + decoder.startEntity(entities.DecodingMode.Legacy); + expect(decoder.write("&", 1)).toBe(-1); + expect(decoder.end()).toBe(4); + + expect(callback).toHaveBeenCalledTimes(2); + expect(callback).toHaveBeenLastCalledWith("&".charCodeAt(0), 4); + expect( + errorHandlers.missingSemicolonAfterCharacterReference, + ).toHaveBeenCalledTimes(1); + }); + + it("should produce an error for a numeric entity without a semicolon", () => { + const errorHandlers = { + missingSemicolonAfterCharacterReference: vitest.fn(), + absenceOfDigitsInNumericCharacterReference: vitest.fn(), + validateNumericCharacterReference: vitest.fn(), + }; + const callback = vitest.fn(); + const decoder = new entities.EntityDecoder( + entities.htmlDecodeTree, + callback, + errorHandlers, + ); + + decoder.startEntity(entities.DecodingMode.Legacy); + expect(decoder.write(":", 1)).toBe(-1); + expect(decoder.end()).toBe(5); + + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith(0x3a, 5); + expect( + errorHandlers.missingSemicolonAfterCharacterReference, + ).toHaveBeenCalledTimes(1); + expect( + errorHandlers.absenceOfDigitsInNumericCharacterReference, + ).toHaveBeenCalledTimes(0); + expect( + errorHandlers.validateNumericCharacterReference, + ).toHaveBeenCalledTimes(1); + expect( + errorHandlers.validateNumericCharacterReference, + ).toHaveBeenCalledWith(0x3a); + }); + + it("should produce an error for numeric entities without digits", () => { + const errorHandlers = { + missingSemicolonAfterCharacterReference: vitest.fn(), + absenceOfDigitsInNumericCharacterReference: vitest.fn(), + validateNumericCharacterReference: vitest.fn(), + }; + const callback = vitest.fn(); + const decoder = new entities.EntityDecoder( + entities.htmlDecodeTree, + callback, + errorHandlers, + ); + + decoder.startEntity(entities.DecodingMode.Legacy); + expect(decoder.write("&#", 1)).toBe(-1); + expect(decoder.end()).toBe(0); + + expect(callback).toHaveBeenCalledTimes(0); + expect( + errorHandlers.missingSemicolonAfterCharacterReference, + ).toHaveBeenCalledTimes(0); + expect( + errorHandlers.absenceOfDigitsInNumericCharacterReference, + ).toHaveBeenCalledTimes(1); + expect( + errorHandlers.absenceOfDigitsInNumericCharacterReference, + ).toHaveBeenCalledWith(2); + expect( + errorHandlers.validateNumericCharacterReference, + ).toHaveBeenCalledTimes(0); + }); + + it("should produce an error for hex entities without digits", () => { + const errorHandlers = { + missingSemicolonAfterCharacterReference: vitest.fn(), + absenceOfDigitsInNumericCharacterReference: vitest.fn(), + validateNumericCharacterReference: vitest.fn(), + }; + const callback = vitest.fn(); + const decoder = new entities.EntityDecoder( + entities.htmlDecodeTree, + callback, + errorHandlers, + ); + + decoder.startEntity(entities.DecodingMode.Legacy); + expect(decoder.write("&#x", 1)).toBe(-1); + expect(decoder.end()).toBe(0); + + expect(callback).toHaveBeenCalledTimes(0); + expect( + errorHandlers.missingSemicolonAfterCharacterReference, + ).toHaveBeenCalledTimes(0); + expect( + errorHandlers.absenceOfDigitsInNumericCharacterReference, + ).toHaveBeenCalledTimes(1); + expect( + errorHandlers.validateNumericCharacterReference, + ).toHaveBeenCalledTimes(0); + }); + }); +}); diff --git a/node_modules/@11ty/eleventy/node_modules/entities/src/decode.ts b/node_modules/@11ty/eleventy/node_modules/entities/src/decode.ts new file mode 100644 index 0000000..99f775c --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/src/decode.ts @@ -0,0 +1,620 @@ +import { htmlDecodeTree } from "./generated/decode-data-html.js"; +import { xmlDecodeTree } from "./generated/decode-data-xml.js"; +import { replaceCodePoint, fromCodePoint } from "./decode-codepoint.js"; + +const enum CharCodes { + NUM = 35, // "#" + SEMI = 59, // ";" + EQUALS = 61, // "=" + ZERO = 48, // "0" + NINE = 57, // "9" + LOWER_A = 97, // "a" + LOWER_F = 102, // "f" + LOWER_X = 120, // "x" + LOWER_Z = 122, // "z" + UPPER_A = 65, // "A" + UPPER_F = 70, // "F" + UPPER_Z = 90, // "Z" +} + +/** Bit that needs to be set to convert an upper case ASCII character to lower case */ +const TO_LOWER_BIT = 0b10_0000; + +export enum BinTrieFlags { + VALUE_LENGTH = 0b1100_0000_0000_0000, + BRANCH_LENGTH = 0b0011_1111_1000_0000, + JUMP_TABLE = 0b0000_0000_0111_1111, +} + +function isNumber(code: number): boolean { + return code >= CharCodes.ZERO && code <= CharCodes.NINE; +} + +function isHexadecimalCharacter(code: number): boolean { + return ( + (code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F) || + (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F) + ); +} + +function isAsciiAlphaNumeric(code: number): boolean { + return ( + (code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z) || + (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z) || + isNumber(code) + ); +} + +/** + * Checks if the given character is a valid end character for an entity in an attribute. + * + * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error. + * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state + */ +function isEntityInAttributeInvalidEnd(code: number): boolean { + return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code); +} + +const enum EntityDecoderState { + EntityStart, + NumericStart, + NumericDecimal, + NumericHex, + NamedEntity, +} + +export enum DecodingMode { + /** Entities in text nodes that can end with any character. */ + Legacy = 0, + /** Only allow entities terminated with a semicolon. */ + Strict = 1, + /** Entities in attributes have limitations on ending characters. */ + Attribute = 2, +} + +/** + * Producers for character reference errors as defined in the HTML spec. + */ +export interface EntityErrorProducer { + missingSemicolonAfterCharacterReference(): void; + absenceOfDigitsInNumericCharacterReference( + consumedCharacters: number, + ): void; + validateNumericCharacterReference(code: number): void; +} + +/** + * Token decoder with support of writing partial entities. + */ +export class EntityDecoder { + constructor( + /** The tree used to decode entities. */ + private readonly decodeTree: Uint16Array, + /** + * The function that is called when a codepoint is decoded. + * + * For multi-byte named entities, this will be called multiple times, + * with the second codepoint, and the same `consumed` value. + * + * @param codepoint The decoded codepoint. + * @param consumed The number of bytes consumed by the decoder. + */ + private readonly emitCodePoint: (cp: number, consumed: number) => void, + /** An object that is used to produce errors. */ + private readonly errors?: EntityErrorProducer | undefined, + ) {} + + /** The current state of the decoder. */ + private state = EntityDecoderState.EntityStart; + /** Characters that were consumed while parsing an entity. */ + private consumed = 1; + /** + * The result of the entity. + * + * Either the result index of a numeric entity, or the codepoint of a + * numeric entity. + */ + private result = 0; + + /** The current index in the decode tree. */ + private treeIndex = 0; + /** The number of characters that were consumed in excess. */ + private excess = 1; + /** The mode in which the decoder is operating. */ + private decodeMode = DecodingMode.Strict; + + /** Resets the instance to make it reusable. */ + startEntity(decodeMode: DecodingMode): void { + this.decodeMode = decodeMode; + this.state = EntityDecoderState.EntityStart; + this.result = 0; + this.treeIndex = 0; + this.excess = 1; + this.consumed = 1; + } + + /** + * Write an entity to the decoder. This can be called multiple times with partial entities. + * If the entity is incomplete, the decoder will return -1. + * + * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the + * entity is incomplete, and resume when the next string is written. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The offset at which the entity begins. Should be 0 if this is not the first call. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + write(input: string, offset: number): number { + switch (this.state) { + case EntityDecoderState.EntityStart: { + if (input.charCodeAt(offset) === CharCodes.NUM) { + this.state = EntityDecoderState.NumericStart; + this.consumed += 1; + return this.stateNumericStart(input, offset + 1); + } + this.state = EntityDecoderState.NamedEntity; + return this.stateNamedEntity(input, offset); + } + + case EntityDecoderState.NumericStart: { + return this.stateNumericStart(input, offset); + } + + case EntityDecoderState.NumericDecimal: { + return this.stateNumericDecimal(input, offset); + } + + case EntityDecoderState.NumericHex: { + return this.stateNumericHex(input, offset); + } + + case EntityDecoderState.NamedEntity: { + return this.stateNamedEntity(input, offset); + } + } + } + + /** + * Switches between the numeric decimal and hexadecimal states. + * + * Equivalent to the `Numeric character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + private stateNumericStart(input: string, offset: number): number { + if (offset >= input.length) { + return -1; + } + + if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) { + this.state = EntityDecoderState.NumericHex; + this.consumed += 1; + return this.stateNumericHex(input, offset + 1); + } + + this.state = EntityDecoderState.NumericDecimal; + return this.stateNumericDecimal(input, offset); + } + + private addToNumericResult( + input: string, + start: number, + end: number, + base: number, + ): void { + if (start !== end) { + const digitCount = end - start; + this.result = + this.result * Math.pow(base, digitCount) + + Number.parseInt(input.substr(start, digitCount), base); + this.consumed += digitCount; + } + } + + /** + * Parses a hexadecimal numeric entity. + * + * Equivalent to the `Hexademical character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + private stateNumericHex(input: string, offset: number): number { + const startIndex = offset; + + while (offset < input.length) { + const char = input.charCodeAt(offset); + if (isNumber(char) || isHexadecimalCharacter(char)) { + offset += 1; + } else { + this.addToNumericResult(input, startIndex, offset, 16); + return this.emitNumericEntity(char, 3); + } + } + + this.addToNumericResult(input, startIndex, offset, 16); + + return -1; + } + + /** + * Parses a decimal numeric entity. + * + * Equivalent to the `Decimal character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + private stateNumericDecimal(input: string, offset: number): number { + const startIndex = offset; + + while (offset < input.length) { + const char = input.charCodeAt(offset); + if (isNumber(char)) { + offset += 1; + } else { + this.addToNumericResult(input, startIndex, offset, 10); + return this.emitNumericEntity(char, 2); + } + } + + this.addToNumericResult(input, startIndex, offset, 10); + + return -1; + } + + /** + * Validate and emit a numeric entity. + * + * Implements the logic from the `Hexademical character reference start + * state` and `Numeric character reference end state` in the HTML spec. + * + * @param lastCp The last code point of the entity. Used to see if the + * entity was terminated with a semicolon. + * @param expectedLength The minimum number of characters that should be + * consumed. Used to validate that at least one digit + * was consumed. + * @returns The number of characters that were consumed. + */ + private emitNumericEntity(lastCp: number, expectedLength: number): number { + // Ensure we consumed at least one digit. + if (this.consumed <= expectedLength) { + this.errors?.absenceOfDigitsInNumericCharacterReference( + this.consumed, + ); + return 0; + } + + // Figure out if this is a legit end of the entity + if (lastCp === CharCodes.SEMI) { + this.consumed += 1; + } else if (this.decodeMode === DecodingMode.Strict) { + return 0; + } + + this.emitCodePoint(replaceCodePoint(this.result), this.consumed); + + if (this.errors) { + if (lastCp !== CharCodes.SEMI) { + this.errors.missingSemicolonAfterCharacterReference(); + } + + this.errors.validateNumericCharacterReference(this.result); + } + + return this.consumed; + } + + /** + * Parses a named entity. + * + * Equivalent to the `Named character reference state` in the HTML spec. + * + * @param input The string containing the entity (or a continuation of the entity). + * @param offset The current offset. + * @returns The number of characters that were consumed, or -1 if the entity is incomplete. + */ + private stateNamedEntity(input: string, offset: number): number { + const { decodeTree } = this; + let current = decodeTree[this.treeIndex]; + // The mask is the number of bytes of the value, including the current byte. + let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14; + + for (; offset < input.length; offset++, this.excess++) { + const char = input.charCodeAt(offset); + + this.treeIndex = determineBranch( + decodeTree, + current, + this.treeIndex + Math.max(1, valueLength), + char, + ); + + if (this.treeIndex < 0) { + return this.result === 0 || + // If we are parsing an attribute + (this.decodeMode === DecodingMode.Attribute && + // We shouldn't have consumed any characters after the entity, + (valueLength === 0 || + // And there should be no invalid characters. + isEntityInAttributeInvalidEnd(char))) + ? 0 + : this.emitNotTerminatedNamedEntity(); + } + + current = decodeTree[this.treeIndex]; + valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14; + + // If the branch is a value, store it and continue + if (valueLength !== 0) { + // If the entity is terminated by a semicolon, we are done. + if (char === CharCodes.SEMI) { + return this.emitNamedEntityData( + this.treeIndex, + valueLength, + this.consumed + this.excess, + ); + } + + // If we encounter a non-terminated (legacy) entity while parsing strictly, then ignore it. + if (this.decodeMode !== DecodingMode.Strict) { + this.result = this.treeIndex; + this.consumed += this.excess; + this.excess = 0; + } + } + } + + return -1; + } + + /** + * Emit a named entity that was not terminated with a semicolon. + * + * @returns The number of characters consumed. + */ + private emitNotTerminatedNamedEntity(): number { + const { result, decodeTree } = this; + + const valueLength = + (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14; + + this.emitNamedEntityData(result, valueLength, this.consumed); + this.errors?.missingSemicolonAfterCharacterReference(); + + return this.consumed; + } + + /** + * Emit a named entity. + * + * @param result The index of the entity in the decode tree. + * @param valueLength The number of bytes in the entity. + * @param consumed The number of characters consumed. + * + * @returns The number of characters consumed. + */ + private emitNamedEntityData( + result: number, + valueLength: number, + consumed: number, + ): number { + const { decodeTree } = this; + + this.emitCodePoint( + valueLength === 1 + ? decodeTree[result] & ~BinTrieFlags.VALUE_LENGTH + : decodeTree[result + 1], + consumed, + ); + if (valueLength === 3) { + // For multi-byte values, we need to emit the second byte. + this.emitCodePoint(decodeTree[result + 2], consumed); + } + + return consumed; + } + + /** + * Signal to the parser that the end of the input was reached. + * + * Remaining data will be emitted and relevant errors will be produced. + * + * @returns The number of characters consumed. + */ + end(): number { + switch (this.state) { + case EntityDecoderState.NamedEntity: { + // Emit a named entity if we have one. + return this.result !== 0 && + (this.decodeMode !== DecodingMode.Attribute || + this.result === this.treeIndex) + ? this.emitNotTerminatedNamedEntity() + : 0; + } + // Otherwise, emit a numeric entity if we have one. + case EntityDecoderState.NumericDecimal: { + return this.emitNumericEntity(0, 2); + } + case EntityDecoderState.NumericHex: { + return this.emitNumericEntity(0, 3); + } + case EntityDecoderState.NumericStart: { + this.errors?.absenceOfDigitsInNumericCharacterReference( + this.consumed, + ); + return 0; + } + case EntityDecoderState.EntityStart: { + // Return 0 if we have no entity. + return 0; + } + } + } +} + +/** + * Creates a function that decodes entities in a string. + * + * @param decodeTree The decode tree. + * @returns A function that decodes entities in a string. + */ +function getDecoder(decodeTree: Uint16Array) { + let returnValue = ""; + const decoder = new EntityDecoder( + decodeTree, + (data) => (returnValue += fromCodePoint(data)), + ); + + return function decodeWithTrie( + input: string, + decodeMode: DecodingMode, + ): string { + let lastIndex = 0; + let offset = 0; + + while ((offset = input.indexOf("&", offset)) >= 0) { + returnValue += input.slice(lastIndex, offset); + + decoder.startEntity(decodeMode); + + const length = decoder.write( + input, + // Skip the "&" + offset + 1, + ); + + if (length < 0) { + lastIndex = offset + decoder.end(); + break; + } + + lastIndex = offset + length; + // If `length` is 0, skip the current `&` and continue. + offset = length === 0 ? lastIndex + 1 : lastIndex; + } + + const result = returnValue + input.slice(lastIndex); + + // Make sure we don't keep a reference to the final string. + returnValue = ""; + + return result; + }; +} + +/** + * Determines the branch of the current node that is taken given the current + * character. This function is used to traverse the trie. + * + * @param decodeTree The trie. + * @param current The current node. + * @param nodeIdx The index right after the current node and its value. + * @param char The current character. + * @returns The index of the next node, or -1 if no branch is taken. + */ +export function determineBranch( + decodeTree: Uint16Array, + current: number, + nodeIndex: number, + char: number, +): number { + const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7; + const jumpOffset = current & BinTrieFlags.JUMP_TABLE; + + // Case 1: Single branch encoded in jump offset + if (branchCount === 0) { + return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1; + } + + // Case 2: Multiple branches encoded in jump table + if (jumpOffset) { + const value = char - jumpOffset; + + return value < 0 || value >= branchCount + ? -1 + : decodeTree[nodeIndex + value] - 1; + } + + // Case 3: Multiple branches encoded in dictionary + + // Binary search for the character. + let lo = nodeIndex; + let hi = lo + branchCount - 1; + + while (lo <= hi) { + const mid = (lo + hi) >>> 1; + const midValue = decodeTree[mid]; + + if (midValue < char) { + lo = mid + 1; + } else if (midValue > char) { + hi = mid - 1; + } else { + return decodeTree[mid + branchCount]; + } + } + + return -1; +} + +const htmlDecoder = /* #__PURE__ */ getDecoder(htmlDecodeTree); +const xmlDecoder = /* #__PURE__ */ getDecoder(xmlDecodeTree); + +/** + * Decodes an HTML string. + * + * @param htmlString The string to decode. + * @param mode The decoding mode. + * @returns The decoded string. + */ +export function decodeHTML( + htmlString: string, + mode: DecodingMode = DecodingMode.Legacy, +): string { + return htmlDecoder(htmlString, mode); +} + +/** + * Decodes an HTML string in an attribute. + * + * @param htmlAttribute The string to decode. + * @returns The decoded string. + */ +export function decodeHTMLAttribute(htmlAttribute: string): string { + return htmlDecoder(htmlAttribute, DecodingMode.Attribute); +} + +/** + * Decodes an HTML string, requiring all entities to be terminated by a semicolon. + * + * @param htmlString The string to decode. + * @returns The decoded string. + */ +export function decodeHTMLStrict(htmlString: string): string { + return htmlDecoder(htmlString, DecodingMode.Strict); +} + +/** + * Decodes an XML string, requiring all entities to be terminated by a semicolon. + * + * @param xmlString The string to decode. + * @returns The decoded string. + */ +export function decodeXML(xmlString: string): string { + return xmlDecoder(xmlString, DecodingMode.Strict); +} + +// Re-export for use by eg. htmlparser2 +export { htmlDecodeTree } from "./generated/decode-data-html.js"; +export { xmlDecodeTree } from "./generated/decode-data-xml.js"; + +export { + decodeCodePoint, + replaceCodePoint, + fromCodePoint, +} from "./decode-codepoint.js"; diff --git a/node_modules/@11ty/eleventy/node_modules/entities/src/encode.spec.ts b/node_modules/@11ty/eleventy/node_modules/entities/src/encode.spec.ts new file mode 100644 index 0000000..10ff5de --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/src/encode.spec.ts @@ -0,0 +1,78 @@ +import { describe, it, expect } from "vitest"; +import * as entities from "./index.js"; + +describe("Encode->decode test", () => { + const testcases = [ + { + input: "asdf & ÿ ü '", + xml: "asdf & ÿ ü '", + html: "asdf & ÿ ü '", + }, + { + input: "&", + xml: "&#38;", + html: "&#38;", + }, + ]; + + for (const { input, xml, html } of testcases) { + const encodedXML = entities.encodeXML(input); + it(`should XML encode ${input}`, () => expect(encodedXML).toBe(xml)); + it(`should default to XML encode ${input}`, () => + expect(entities.encode(input)).toBe(xml)); + it(`should XML decode ${encodedXML}`, () => + expect(entities.decodeXML(encodedXML)).toBe(input)); + it(`should default to XML encode ${encodedXML}`, () => + expect(entities.decode(encodedXML)).toBe(input)); + it(`should default strict to XML encode ${encodedXML}`, () => + expect(entities.decodeStrict(encodedXML)).toBe(input)); + + const encodedHTML5 = entities.encodeHTML5(input); + it(`should HTML5 encode ${input}`, () => + expect(encodedHTML5).toBe(html)); + it(`should HTML5 decode ${encodedHTML5}`, () => + expect(entities.decodeHTML(encodedHTML5)).toBe(input)); + it("should encode emojis", () => + expect(entities.encodeHTML5("😄🍾🥳💥😇")).toBe( + "😄🍾🥳💥😇", + )); + } + + it("should encode data URIs (issue #16)", () => { + const data = + "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAALAAABAAEAAAIBRAA7"; + expect(entities.decode(entities.encode(data))).toBe(data); + }); + + it("should HTML encode all ASCII characters", () => { + for (let index = 0; index < 128; index++) { + const char = String.fromCharCode(index); + const encoded = entities.encodeHTML(char); + const decoded = entities.decodeHTML(encoded); + expect(decoded).toBe(char); + } + }); + + it("should encode trailing parts of entities", () => + expect(entities.encodeHTML("\uD835")).toBe("�")); + + it("should encode surrogate pair with first surrogate equivalent of entity, without corresponding entity", () => + expect(entities.encodeHTML("\u{1D4A4}")).toBe("𝒤")); +}); + +describe("encodeNonAsciiHTML", () => { + it("should encode all non-ASCII characters", () => + expect(entities.encodeNonAsciiHTML(" #123! übermaßen")).toBe( + "<test> #123! übermaßen", + )); + + it("should encode emojis", () => + expect(entities.encodeNonAsciiHTML("😄🍾🥳💥😇")).toBe( + "😄🍾🥳💥😇", + )); + + it("should encode chars above surrogates", () => + expect(entities.encodeNonAsciiHTML("♒️♓️♈️♉️♊️♋️♌️♍️♎️♏️♐️♑️")).toBe( + "♒️♓️♈️♉️♊️♋️♌️♍️♎️♏️♐️♑️", + )); +}); diff --git a/node_modules/@11ty/eleventy/node_modules/entities/src/encode.ts b/node_modules/@11ty/eleventy/node_modules/entities/src/encode.ts new file mode 100644 index 0000000..5bb40a6 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/src/encode.ts @@ -0,0 +1,77 @@ +import { htmlTrie } from "./generated/encode-html.js"; +import { xmlReplacer, getCodePoint } from "./escape.js"; + +const htmlReplacer = /[\t\n\f!-,./:-@[-`{-}\u0080-\uFFFF]/g; + +/** + * Encodes all characters in the input using HTML entities. This includes + * characters that are valid ASCII characters in HTML documents, such as `#`. + * + * To get a more compact output, consider using the `encodeNonAsciiHTML` + * function, which will only encode characters that are not valid in HTML + * documents, as well as non-ASCII characters. + * + * If a character has no equivalent entity, a numeric hexadecimal reference + * (eg. `ü`) will be used. + */ +export function encodeHTML(input: string): string { + return encodeHTMLTrieRe(htmlReplacer, input); +} +/** + * Encodes all non-ASCII characters, as well as characters not valid in HTML + * documents using HTML entities. This function will not encode characters that + * are valid in HTML documents, such as `#`. + * + * If a character has no equivalent entity, a numeric hexadecimal reference + * (eg. `ü`) will be used. + */ +export function encodeNonAsciiHTML(input: string): string { + return encodeHTMLTrieRe(xmlReplacer, input); +} + +function encodeHTMLTrieRe(regExp: RegExp, input: string): string { + let returnValue = ""; + let lastIndex = 0; + let match; + + while ((match = regExp.exec(input)) !== null) { + const { index } = match; + returnValue += input.substring(lastIndex, index); + const char = input.charCodeAt(index); + let next = htmlTrie.get(char); + + if (typeof next === "object") { + // We are in a branch. Try to match the next char. + if (index + 1 < input.length) { + const nextChar = input.charCodeAt(index + 1); + const value = + typeof next.n === "number" + ? next.n === nextChar + ? next.o + : undefined + : next.n.get(nextChar); + + if (value !== undefined) { + returnValue += value; + lastIndex = regExp.lastIndex += 1; + continue; + } + } + + next = next.v; + } + + // We might have a tree node without a value; skip and use a numeric entity. + if (next === undefined) { + const cp = getCodePoint(input, index); + returnValue += `&#x${cp.toString(16)};`; + // Increase by 1 if we have a surrogate pair + lastIndex = regExp.lastIndex += Number(cp !== char); + } else { + returnValue += next; + lastIndex = index + 1; + } + } + + return returnValue + input.substr(lastIndex); +} diff --git a/node_modules/@11ty/eleventy/node_modules/entities/src/escape.spec.ts b/node_modules/@11ty/eleventy/node_modules/entities/src/escape.spec.ts new file mode 100644 index 0000000..582af1a --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/src/escape.spec.ts @@ -0,0 +1,14 @@ +import { describe, it, expect } from "vitest"; +import * as entities from "./index.js"; + +describe("escape HTML", () => { + it("should escape HTML attribute values", () => + expect(entities.escapeAttribute(' & value \u00A0!')).toBe( + " & value  !", + )); + + it("should escape HTML text", () => + expect(entities.escapeText(' & value \u00A0!')).toBe( + '<a " text > & value  !', + )); +}); diff --git a/node_modules/@11ty/eleventy/node_modules/entities/src/escape.ts b/node_modules/@11ty/eleventy/node_modules/entities/src/escape.ts new file mode 100644 index 0000000..350c57b --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/src/escape.ts @@ -0,0 +1,148 @@ +export const xmlReplacer: RegExp = /["$&'<>\u0080-\uFFFF]/g; + +const xmlCodeMap = new Map([ + [34, """], + [38, "&"], + [39, "'"], + [60, "<"], + [62, ">"], +]); + +// For compatibility with node < 4, we wrap `codePointAt` +export const getCodePoint: (c: string, index: number) => number = + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + String.prototype.codePointAt == null + ? (c: string, index: number): number => + (c.charCodeAt(index) & 0xfc_00) === 0xd8_00 + ? (c.charCodeAt(index) - 0xd8_00) * 0x4_00 + + c.charCodeAt(index + 1) - + 0xdc_00 + + 0x1_00_00 + : c.charCodeAt(index) + : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + (input: string, index: number): number => input.codePointAt(index)!; + +/** + * Encodes all non-ASCII characters, as well as characters not valid in XML + * documents using XML entities. + * + * If a character has no equivalent entity, a + * numeric hexadecimal reference (eg. `ü`) will be used. + */ +export function encodeXML(input: string): string { + let returnValue = ""; + let lastIndex = 0; + let match; + + while ((match = xmlReplacer.exec(input)) !== null) { + const { index } = match; + const char = input.charCodeAt(index); + const next = xmlCodeMap.get(char); + + if (next === undefined) { + returnValue += `${input.substring(lastIndex, index)}&#x${getCodePoint( + input, + index, + ).toString(16)};`; + // Increase by 1 if we have a surrogate pair + lastIndex = xmlReplacer.lastIndex += Number( + (char & 0xfc_00) === 0xd8_00, + ); + } else { + returnValue += input.substring(lastIndex, index) + next; + lastIndex = index + 1; + } + } + + return returnValue + input.substr(lastIndex); +} + +/** + * Encodes all non-ASCII characters, as well as characters not valid in XML + * documents using numeric hexadecimal reference (eg. `ü`). + * + * Have a look at `escapeUTF8` if you want a more concise output at the expense + * of reduced transportability. + * + * @param data String to escape. + */ +export const escape: typeof encodeXML = encodeXML; + +/** + * Creates a function that escapes all characters matched by the given regular + * expression using the given map of characters to escape to their entities. + * + * @param regex Regular expression to match characters to escape. + * @param map Map of characters to escape to their entities. + * + * @returns Function that escapes all characters matched by the given regular + * expression using the given map of characters to escape to their entities. + */ +function getEscaper( + regex: RegExp, + map: Map, +): (data: string) => string { + return function escape(data: string): string { + let match; + let lastIndex = 0; + let result = ""; + + while ((match = regex.exec(data))) { + if (lastIndex !== match.index) { + result += data.substring(lastIndex, match.index); + } + + // We know that this character will be in the map. + result += map.get(match[0].charCodeAt(0))!; + + // Every match will be of length 1 + lastIndex = match.index + 1; + } + + return result + data.substring(lastIndex); + }; +} + +/** + * Encodes all characters not valid in XML documents using XML entities. + * + * Note that the output will be character-set dependent. + * + * @param data String to escape. + */ +export const escapeUTF8: (data: string) => string = /* #__PURE__ */ getEscaper( + /["&'<>]/g, + xmlCodeMap, +); + +/** + * Encodes all characters that have to be escaped in HTML attributes, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + * + * @param data String to escape. + */ +export const escapeAttribute: (data: string) => string = + /* #__PURE__ */ getEscaper( + /["&\u00A0]/g, + new Map([ + [34, """], + [38, "&"], + [160, " "], + ]), + ); + +/** + * Encodes all characters that have to be escaped in HTML text, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + * + * @param data String to escape. + */ +export const escapeText: (data: string) => string = /* #__PURE__ */ getEscaper( + /[&<>\u00A0]/g, + new Map([ + [38, "&"], + [60, "<"], + [62, ">"], + [160, " "], + ]), +); diff --git a/node_modules/@11ty/eleventy/node_modules/entities/src/generated/.eslintrc.json b/node_modules/@11ty/eleventy/node_modules/entities/src/generated/.eslintrc.json new file mode 100644 index 0000000..141a1c5 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/src/generated/.eslintrc.json @@ -0,0 +1,10 @@ +{ + "rules": { + "multiline-comment-style": 0, + "capitalized-comments": 0, + "unicorn/escape-case": 0, + "unicorn/no-hex-escape": 0, + "unicorn/numeric-separators-style": 0, + "unicorn/prefer-spread": 0 + } +} diff --git a/node_modules/@11ty/eleventy/node_modules/entities/src/generated/decode-data-html.ts b/node_modules/@11ty/eleventy/node_modules/entities/src/generated/decode-data-html.ts new file mode 100644 index 0000000..5c1d6c7 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/src/generated/decode-data-html.ts @@ -0,0 +1,8 @@ +// Generated using scripts/write-decode-map.ts + +export const htmlDecodeTree: Uint16Array = /* #__PURE__ */ new Uint16Array( + // prettier-ignore + /* #__PURE__ */ "\u1d41<\xd5\u0131\u028a\u049d\u057b\u05d0\u0675\u06de\u07a2\u07d6\u080f\u0a4a\u0a91\u0da1\u0e6d\u0f09\u0f26\u10ca\u1228\u12e1\u1415\u149d\u14c3\u14df\u1525\0\0\0\0\0\0\u156b\u16cd\u198d\u1c12\u1ddd\u1f7e\u2060\u21b0\u228d\u23c0\u23fb\u2442\u2824\u2912\u2d08\u2e48\u2fce\u3016\u32ba\u3639\u37ac\u38fe\u3a28\u3a71\u3ae0\u3b2e\u0800EMabcfglmnoprstu\\bfms\x7f\x84\x8b\x90\x95\x98\xa6\xb3\xb9\xc8\xcflig\u803b\xc6\u40c6P\u803b&\u4026cute\u803b\xc1\u40c1reve;\u4102\u0100iyx}rc\u803b\xc2\u40c2;\u4410r;\uc000\ud835\udd04rave\u803b\xc0\u40c0pha;\u4391acr;\u4100d;\u6a53\u0100gp\x9d\xa1on;\u4104f;\uc000\ud835\udd38plyFunction;\u6061ing\u803b\xc5\u40c5\u0100cs\xbe\xc3r;\uc000\ud835\udc9cign;\u6254ilde\u803b\xc3\u40c3ml\u803b\xc4\u40c4\u0400aceforsu\xe5\xfb\xfe\u0117\u011c\u0122\u0127\u012a\u0100cr\xea\xf2kslash;\u6216\u0176\xf6\xf8;\u6ae7ed;\u6306y;\u4411\u0180crt\u0105\u010b\u0114ause;\u6235noullis;\u612ca;\u4392r;\uc000\ud835\udd05pf;\uc000\ud835\udd39eve;\u42d8c\xf2\u0113mpeq;\u624e\u0700HOacdefhilorsu\u014d\u0151\u0156\u0180\u019e\u01a2\u01b5\u01b7\u01ba\u01dc\u0215\u0273\u0278\u027ecy;\u4427PY\u803b\xa9\u40a9\u0180cpy\u015d\u0162\u017aute;\u4106\u0100;i\u0167\u0168\u62d2talDifferentialD;\u6145leys;\u612d\u0200aeio\u0189\u018e\u0194\u0198ron;\u410cdil\u803b\xc7\u40c7rc;\u4108nint;\u6230ot;\u410a\u0100dn\u01a7\u01adilla;\u40b8terDot;\u40b7\xf2\u017fi;\u43a7rcle\u0200DMPT\u01c7\u01cb\u01d1\u01d6ot;\u6299inus;\u6296lus;\u6295imes;\u6297o\u0100cs\u01e2\u01f8kwiseContourIntegral;\u6232eCurly\u0100DQ\u0203\u020foubleQuote;\u601duote;\u6019\u0200lnpu\u021e\u0228\u0247\u0255on\u0100;e\u0225\u0226\u6237;\u6a74\u0180git\u022f\u0236\u023aruent;\u6261nt;\u622fourIntegral;\u622e\u0100fr\u024c\u024e;\u6102oduct;\u6210nterClockwiseContourIntegral;\u6233oss;\u6a2fcr;\uc000\ud835\udc9ep\u0100;C\u0284\u0285\u62d3ap;\u624d\u0580DJSZacefios\u02a0\u02ac\u02b0\u02b4\u02b8\u02cb\u02d7\u02e1\u02e6\u0333\u048d\u0100;o\u0179\u02a5trahd;\u6911cy;\u4402cy;\u4405cy;\u440f\u0180grs\u02bf\u02c4\u02c7ger;\u6021r;\u61a1hv;\u6ae4\u0100ay\u02d0\u02d5ron;\u410e;\u4414l\u0100;t\u02dd\u02de\u6207a;\u4394r;\uc000\ud835\udd07\u0100af\u02eb\u0327\u0100cm\u02f0\u0322ritical\u0200ADGT\u0300\u0306\u0316\u031ccute;\u40b4o\u0174\u030b\u030d;\u42d9bleAcute;\u42ddrave;\u4060ilde;\u42dcond;\u62c4ferentialD;\u6146\u0470\u033d\0\0\0\u0342\u0354\0\u0405f;\uc000\ud835\udd3b\u0180;DE\u0348\u0349\u034d\u40a8ot;\u60dcqual;\u6250ble\u0300CDLRUV\u0363\u0372\u0382\u03cf\u03e2\u03f8ontourIntegra\xec\u0239o\u0274\u0379\0\0\u037b\xbb\u0349nArrow;\u61d3\u0100eo\u0387\u03a4ft\u0180ART\u0390\u0396\u03a1rrow;\u61d0ightArrow;\u61d4e\xe5\u02cang\u0100LR\u03ab\u03c4eft\u0100AR\u03b3\u03b9rrow;\u67f8ightArrow;\u67faightArrow;\u67f9ight\u0100AT\u03d8\u03derrow;\u61d2ee;\u62a8p\u0241\u03e9\0\0\u03efrrow;\u61d1ownArrow;\u61d5erticalBar;\u6225n\u0300ABLRTa\u0412\u042a\u0430\u045e\u047f\u037crrow\u0180;BU\u041d\u041e\u0422\u6193ar;\u6913pArrow;\u61f5reve;\u4311eft\u02d2\u043a\0\u0446\0\u0450ightVector;\u6950eeVector;\u695eector\u0100;B\u0459\u045a\u61bdar;\u6956ight\u01d4\u0467\0\u0471eeVector;\u695fector\u0100;B\u047a\u047b\u61c1ar;\u6957ee\u0100;A\u0486\u0487\u62a4rrow;\u61a7\u0100ct\u0492\u0497r;\uc000\ud835\udc9frok;\u4110\u0800NTacdfglmopqstux\u04bd\u04c0\u04c4\u04cb\u04de\u04e2\u04e7\u04ee\u04f5\u0521\u052f\u0536\u0552\u055d\u0560\u0565G;\u414aH\u803b\xd0\u40d0cute\u803b\xc9\u40c9\u0180aiy\u04d2\u04d7\u04dcron;\u411arc\u803b\xca\u40ca;\u442dot;\u4116r;\uc000\ud835\udd08rave\u803b\xc8\u40c8ement;\u6208\u0100ap\u04fa\u04fecr;\u4112ty\u0253\u0506\0\0\u0512mallSquare;\u65fberySmallSquare;\u65ab\u0100gp\u0526\u052aon;\u4118f;\uc000\ud835\udd3csilon;\u4395u\u0100ai\u053c\u0549l\u0100;T\u0542\u0543\u6a75ilde;\u6242librium;\u61cc\u0100ci\u0557\u055ar;\u6130m;\u6a73a;\u4397ml\u803b\xcb\u40cb\u0100ip\u056a\u056fsts;\u6203onentialE;\u6147\u0280cfios\u0585\u0588\u058d\u05b2\u05ccy;\u4424r;\uc000\ud835\udd09lled\u0253\u0597\0\0\u05a3mallSquare;\u65fcerySmallSquare;\u65aa\u0370\u05ba\0\u05bf\0\0\u05c4f;\uc000\ud835\udd3dAll;\u6200riertrf;\u6131c\xf2\u05cb\u0600JTabcdfgorst\u05e8\u05ec\u05ef\u05fa\u0600\u0612\u0616\u061b\u061d\u0623\u066c\u0672cy;\u4403\u803b>\u403emma\u0100;d\u05f7\u05f8\u4393;\u43dcreve;\u411e\u0180eiy\u0607\u060c\u0610dil;\u4122rc;\u411c;\u4413ot;\u4120r;\uc000\ud835\udd0a;\u62d9pf;\uc000\ud835\udd3eeater\u0300EFGLST\u0635\u0644\u064e\u0656\u065b\u0666qual\u0100;L\u063e\u063f\u6265ess;\u62dbullEqual;\u6267reater;\u6aa2ess;\u6277lantEqual;\u6a7eilde;\u6273cr;\uc000\ud835\udca2;\u626b\u0400Aacfiosu\u0685\u068b\u0696\u069b\u069e\u06aa\u06be\u06caRDcy;\u442a\u0100ct\u0690\u0694ek;\u42c7;\u405eirc;\u4124r;\u610clbertSpace;\u610b\u01f0\u06af\0\u06b2f;\u610dizontalLine;\u6500\u0100ct\u06c3\u06c5\xf2\u06a9rok;\u4126mp\u0144\u06d0\u06d8ownHum\xf0\u012fqual;\u624f\u0700EJOacdfgmnostu\u06fa\u06fe\u0703\u0707\u070e\u071a\u071e\u0721\u0728\u0744\u0778\u078b\u078f\u0795cy;\u4415lig;\u4132cy;\u4401cute\u803b\xcd\u40cd\u0100iy\u0713\u0718rc\u803b\xce\u40ce;\u4418ot;\u4130r;\u6111rave\u803b\xcc\u40cc\u0180;ap\u0720\u072f\u073f\u0100cg\u0734\u0737r;\u412ainaryI;\u6148lie\xf3\u03dd\u01f4\u0749\0\u0762\u0100;e\u074d\u074e\u622c\u0100gr\u0753\u0758ral;\u622bsection;\u62c2isible\u0100CT\u076c\u0772omma;\u6063imes;\u6062\u0180gpt\u077f\u0783\u0788on;\u412ef;\uc000\ud835\udd40a;\u4399cr;\u6110ilde;\u4128\u01eb\u079a\0\u079ecy;\u4406l\u803b\xcf\u40cf\u0280cfosu\u07ac\u07b7\u07bc\u07c2\u07d0\u0100iy\u07b1\u07b5rc;\u4134;\u4419r;\uc000\ud835\udd0dpf;\uc000\ud835\udd41\u01e3\u07c7\0\u07ccr;\uc000\ud835\udca5rcy;\u4408kcy;\u4404\u0380HJacfos\u07e4\u07e8\u07ec\u07f1\u07fd\u0802\u0808cy;\u4425cy;\u440cppa;\u439a\u0100ey\u07f6\u07fbdil;\u4136;\u441ar;\uc000\ud835\udd0epf;\uc000\ud835\udd42cr;\uc000\ud835\udca6\u0580JTaceflmost\u0825\u0829\u082c\u0850\u0863\u09b3\u09b8\u09c7\u09cd\u0a37\u0a47cy;\u4409\u803b<\u403c\u0280cmnpr\u0837\u083c\u0841\u0844\u084dute;\u4139bda;\u439bg;\u67ealacetrf;\u6112r;\u619e\u0180aey\u0857\u085c\u0861ron;\u413ddil;\u413b;\u441b\u0100fs\u0868\u0970t\u0500ACDFRTUVar\u087e\u08a9\u08b1\u08e0\u08e6\u08fc\u092f\u095b\u0390\u096a\u0100nr\u0883\u088fgleBracket;\u67e8row\u0180;BR\u0899\u089a\u089e\u6190ar;\u61e4ightArrow;\u61c6eiling;\u6308o\u01f5\u08b7\0\u08c3bleBracket;\u67e6n\u01d4\u08c8\0\u08d2eeVector;\u6961ector\u0100;B\u08db\u08dc\u61c3ar;\u6959loor;\u630aight\u0100AV\u08ef\u08f5rrow;\u6194ector;\u694e\u0100er\u0901\u0917e\u0180;AV\u0909\u090a\u0910\u62a3rrow;\u61a4ector;\u695aiangle\u0180;BE\u0924\u0925\u0929\u62b2ar;\u69cfqual;\u62b4p\u0180DTV\u0937\u0942\u094cownVector;\u6951eeVector;\u6960ector\u0100;B\u0956\u0957\u61bfar;\u6958ector\u0100;B\u0965\u0966\u61bcar;\u6952ight\xe1\u039cs\u0300EFGLST\u097e\u098b\u0995\u099d\u09a2\u09adqualGreater;\u62daullEqual;\u6266reater;\u6276ess;\u6aa1lantEqual;\u6a7dilde;\u6272r;\uc000\ud835\udd0f\u0100;e\u09bd\u09be\u62d8ftarrow;\u61daidot;\u413f\u0180npw\u09d4\u0a16\u0a1bg\u0200LRlr\u09de\u09f7\u0a02\u0a10eft\u0100AR\u09e6\u09ecrrow;\u67f5ightArrow;\u67f7ightArrow;\u67f6eft\u0100ar\u03b3\u0a0aight\xe1\u03bfight\xe1\u03caf;\uc000\ud835\udd43er\u0100LR\u0a22\u0a2ceftArrow;\u6199ightArrow;\u6198\u0180cht\u0a3e\u0a40\u0a42\xf2\u084c;\u61b0rok;\u4141;\u626a\u0400acefiosu\u0a5a\u0a5d\u0a60\u0a77\u0a7c\u0a85\u0a8b\u0a8ep;\u6905y;\u441c\u0100dl\u0a65\u0a6fiumSpace;\u605flintrf;\u6133r;\uc000\ud835\udd10nusPlus;\u6213pf;\uc000\ud835\udd44c\xf2\u0a76;\u439c\u0480Jacefostu\u0aa3\u0aa7\u0aad\u0ac0\u0b14\u0b19\u0d91\u0d97\u0d9ecy;\u440acute;\u4143\u0180aey\u0ab4\u0ab9\u0aberon;\u4147dil;\u4145;\u441d\u0180gsw\u0ac7\u0af0\u0b0eative\u0180MTV\u0ad3\u0adf\u0ae8ediumSpace;\u600bhi\u0100cn\u0ae6\u0ad8\xeb\u0ad9eryThi\xee\u0ad9ted\u0100GL\u0af8\u0b06reaterGreate\xf2\u0673essLes\xf3\u0a48Line;\u400ar;\uc000\ud835\udd11\u0200Bnpt\u0b22\u0b28\u0b37\u0b3areak;\u6060BreakingSpace;\u40a0f;\u6115\u0680;CDEGHLNPRSTV\u0b55\u0b56\u0b6a\u0b7c\u0ba1\u0beb\u0c04\u0c5e\u0c84\u0ca6\u0cd8\u0d61\u0d85\u6aec\u0100ou\u0b5b\u0b64ngruent;\u6262pCap;\u626doubleVerticalBar;\u6226\u0180lqx\u0b83\u0b8a\u0b9bement;\u6209ual\u0100;T\u0b92\u0b93\u6260ilde;\uc000\u2242\u0338ists;\u6204reater\u0380;EFGLST\u0bb6\u0bb7\u0bbd\u0bc9\u0bd3\u0bd8\u0be5\u626fqual;\u6271ullEqual;\uc000\u2267\u0338reater;\uc000\u226b\u0338ess;\u6279lantEqual;\uc000\u2a7e\u0338ilde;\u6275ump\u0144\u0bf2\u0bfdownHump;\uc000\u224e\u0338qual;\uc000\u224f\u0338e\u0100fs\u0c0a\u0c27tTriangle\u0180;BE\u0c1a\u0c1b\u0c21\u62eaar;\uc000\u29cf\u0338qual;\u62ecs\u0300;EGLST\u0c35\u0c36\u0c3c\u0c44\u0c4b\u0c58\u626equal;\u6270reater;\u6278ess;\uc000\u226a\u0338lantEqual;\uc000\u2a7d\u0338ilde;\u6274ested\u0100GL\u0c68\u0c79reaterGreater;\uc000\u2aa2\u0338essLess;\uc000\u2aa1\u0338recedes\u0180;ES\u0c92\u0c93\u0c9b\u6280qual;\uc000\u2aaf\u0338lantEqual;\u62e0\u0100ei\u0cab\u0cb9verseElement;\u620cghtTriangle\u0180;BE\u0ccb\u0ccc\u0cd2\u62ebar;\uc000\u29d0\u0338qual;\u62ed\u0100qu\u0cdd\u0d0cuareSu\u0100bp\u0ce8\u0cf9set\u0100;E\u0cf0\u0cf3\uc000\u228f\u0338qual;\u62e2erset\u0100;E\u0d03\u0d06\uc000\u2290\u0338qual;\u62e3\u0180bcp\u0d13\u0d24\u0d4eset\u0100;E\u0d1b\u0d1e\uc000\u2282\u20d2qual;\u6288ceeds\u0200;EST\u0d32\u0d33\u0d3b\u0d46\u6281qual;\uc000\u2ab0\u0338lantEqual;\u62e1ilde;\uc000\u227f\u0338erset\u0100;E\u0d58\u0d5b\uc000\u2283\u20d2qual;\u6289ilde\u0200;EFT\u0d6e\u0d6f\u0d75\u0d7f\u6241qual;\u6244ullEqual;\u6247ilde;\u6249erticalBar;\u6224cr;\uc000\ud835\udca9ilde\u803b\xd1\u40d1;\u439d\u0700Eacdfgmoprstuv\u0dbd\u0dc2\u0dc9\u0dd5\u0ddb\u0de0\u0de7\u0dfc\u0e02\u0e20\u0e22\u0e32\u0e3f\u0e44lig;\u4152cute\u803b\xd3\u40d3\u0100iy\u0dce\u0dd3rc\u803b\xd4\u40d4;\u441eblac;\u4150r;\uc000\ud835\udd12rave\u803b\xd2\u40d2\u0180aei\u0dee\u0df2\u0df6cr;\u414cga;\u43a9cron;\u439fpf;\uc000\ud835\udd46enCurly\u0100DQ\u0e0e\u0e1aoubleQuote;\u601cuote;\u6018;\u6a54\u0100cl\u0e27\u0e2cr;\uc000\ud835\udcaaash\u803b\xd8\u40d8i\u016c\u0e37\u0e3cde\u803b\xd5\u40d5es;\u6a37ml\u803b\xd6\u40d6er\u0100BP\u0e4b\u0e60\u0100ar\u0e50\u0e53r;\u603eac\u0100ek\u0e5a\u0e5c;\u63deet;\u63b4arenthesis;\u63dc\u0480acfhilors\u0e7f\u0e87\u0e8a\u0e8f\u0e92\u0e94\u0e9d\u0eb0\u0efcrtialD;\u6202y;\u441fr;\uc000\ud835\udd13i;\u43a6;\u43a0usMinus;\u40b1\u0100ip\u0ea2\u0eadncareplan\xe5\u069df;\u6119\u0200;eio\u0eb9\u0eba\u0ee0\u0ee4\u6abbcedes\u0200;EST\u0ec8\u0ec9\u0ecf\u0eda\u627aqual;\u6aaflantEqual;\u627cilde;\u627eme;\u6033\u0100dp\u0ee9\u0eeeuct;\u620fortion\u0100;a\u0225\u0ef9l;\u621d\u0100ci\u0f01\u0f06r;\uc000\ud835\udcab;\u43a8\u0200Ufos\u0f11\u0f16\u0f1b\u0f1fOT\u803b\"\u4022r;\uc000\ud835\udd14pf;\u611acr;\uc000\ud835\udcac\u0600BEacefhiorsu\u0f3e\u0f43\u0f47\u0f60\u0f73\u0fa7\u0faa\u0fad\u1096\u10a9\u10b4\u10bearr;\u6910G\u803b\xae\u40ae\u0180cnr\u0f4e\u0f53\u0f56ute;\u4154g;\u67ebr\u0100;t\u0f5c\u0f5d\u61a0l;\u6916\u0180aey\u0f67\u0f6c\u0f71ron;\u4158dil;\u4156;\u4420\u0100;v\u0f78\u0f79\u611cerse\u0100EU\u0f82\u0f99\u0100lq\u0f87\u0f8eement;\u620builibrium;\u61cbpEquilibrium;\u696fr\xbb\u0f79o;\u43a1ght\u0400ACDFTUVa\u0fc1\u0feb\u0ff3\u1022\u1028\u105b\u1087\u03d8\u0100nr\u0fc6\u0fd2gleBracket;\u67e9row\u0180;BL\u0fdc\u0fdd\u0fe1\u6192ar;\u61e5eftArrow;\u61c4eiling;\u6309o\u01f5\u0ff9\0\u1005bleBracket;\u67e7n\u01d4\u100a\0\u1014eeVector;\u695dector\u0100;B\u101d\u101e\u61c2ar;\u6955loor;\u630b\u0100er\u102d\u1043e\u0180;AV\u1035\u1036\u103c\u62a2rrow;\u61a6ector;\u695biangle\u0180;BE\u1050\u1051\u1055\u62b3ar;\u69d0qual;\u62b5p\u0180DTV\u1063\u106e\u1078ownVector;\u694feeVector;\u695cector\u0100;B\u1082\u1083\u61bear;\u6954ector\u0100;B\u1091\u1092\u61c0ar;\u6953\u0100pu\u109b\u109ef;\u611dndImplies;\u6970ightarrow;\u61db\u0100ch\u10b9\u10bcr;\u611b;\u61b1leDelayed;\u69f4\u0680HOacfhimoqstu\u10e4\u10f1\u10f7\u10fd\u1119\u111e\u1151\u1156\u1161\u1167\u11b5\u11bb\u11bf\u0100Cc\u10e9\u10eeHcy;\u4429y;\u4428FTcy;\u442ccute;\u415a\u0280;aeiy\u1108\u1109\u110e\u1113\u1117\u6abcron;\u4160dil;\u415erc;\u415c;\u4421r;\uc000\ud835\udd16ort\u0200DLRU\u112a\u1134\u113e\u1149ownArrow\xbb\u041eeftArrow\xbb\u089aightArrow\xbb\u0fddpArrow;\u6191gma;\u43a3allCircle;\u6218pf;\uc000\ud835\udd4a\u0272\u116d\0\0\u1170t;\u621aare\u0200;ISU\u117b\u117c\u1189\u11af\u65a1ntersection;\u6293u\u0100bp\u118f\u119eset\u0100;E\u1197\u1198\u628fqual;\u6291erset\u0100;E\u11a8\u11a9\u6290qual;\u6292nion;\u6294cr;\uc000\ud835\udcaear;\u62c6\u0200bcmp\u11c8\u11db\u1209\u120b\u0100;s\u11cd\u11ce\u62d0et\u0100;E\u11cd\u11d5qual;\u6286\u0100ch\u11e0\u1205eeds\u0200;EST\u11ed\u11ee\u11f4\u11ff\u627bqual;\u6ab0lantEqual;\u627dilde;\u627fTh\xe1\u0f8c;\u6211\u0180;es\u1212\u1213\u1223\u62d1rset\u0100;E\u121c\u121d\u6283qual;\u6287et\xbb\u1213\u0580HRSacfhiors\u123e\u1244\u1249\u1255\u125e\u1271\u1276\u129f\u12c2\u12c8\u12d1ORN\u803b\xde\u40deADE;\u6122\u0100Hc\u124e\u1252cy;\u440by;\u4426\u0100bu\u125a\u125c;\u4009;\u43a4\u0180aey\u1265\u126a\u126fron;\u4164dil;\u4162;\u4422r;\uc000\ud835\udd17\u0100ei\u127b\u1289\u01f2\u1280\0\u1287efore;\u6234a;\u4398\u0100cn\u128e\u1298kSpace;\uc000\u205f\u200aSpace;\u6009lde\u0200;EFT\u12ab\u12ac\u12b2\u12bc\u623cqual;\u6243ullEqual;\u6245ilde;\u6248pf;\uc000\ud835\udd4bipleDot;\u60db\u0100ct\u12d6\u12dbr;\uc000\ud835\udcafrok;\u4166\u0ae1\u12f7\u130e\u131a\u1326\0\u132c\u1331\0\0\0\0\0\u1338\u133d\u1377\u1385\0\u13ff\u1404\u140a\u1410\u0100cr\u12fb\u1301ute\u803b\xda\u40dar\u0100;o\u1307\u1308\u619fcir;\u6949r\u01e3\u1313\0\u1316y;\u440eve;\u416c\u0100iy\u131e\u1323rc\u803b\xdb\u40db;\u4423blac;\u4170r;\uc000\ud835\udd18rave\u803b\xd9\u40d9acr;\u416a\u0100di\u1341\u1369er\u0100BP\u1348\u135d\u0100ar\u134d\u1350r;\u405fac\u0100ek\u1357\u1359;\u63dfet;\u63b5arenthesis;\u63ddon\u0100;P\u1370\u1371\u62c3lus;\u628e\u0100gp\u137b\u137fon;\u4172f;\uc000\ud835\udd4c\u0400ADETadps\u1395\u13ae\u13b8\u13c4\u03e8\u13d2\u13d7\u13f3rrow\u0180;BD\u1150\u13a0\u13a4ar;\u6912ownArrow;\u61c5ownArrow;\u6195quilibrium;\u696eee\u0100;A\u13cb\u13cc\u62a5rrow;\u61a5own\xe1\u03f3er\u0100LR\u13de\u13e8eftArrow;\u6196ightArrow;\u6197i\u0100;l\u13f9\u13fa\u43d2on;\u43a5ing;\u416ecr;\uc000\ud835\udcb0ilde;\u4168ml\u803b\xdc\u40dc\u0480Dbcdefosv\u1427\u142c\u1430\u1433\u143e\u1485\u148a\u1490\u1496ash;\u62abar;\u6aeby;\u4412ash\u0100;l\u143b\u143c\u62a9;\u6ae6\u0100er\u1443\u1445;\u62c1\u0180bty\u144c\u1450\u147aar;\u6016\u0100;i\u144f\u1455cal\u0200BLST\u1461\u1465\u146a\u1474ar;\u6223ine;\u407ceparator;\u6758ilde;\u6240ThinSpace;\u600ar;\uc000\ud835\udd19pf;\uc000\ud835\udd4dcr;\uc000\ud835\udcb1dash;\u62aa\u0280cefos\u14a7\u14ac\u14b1\u14b6\u14bcirc;\u4174dge;\u62c0r;\uc000\ud835\udd1apf;\uc000\ud835\udd4ecr;\uc000\ud835\udcb2\u0200fios\u14cb\u14d0\u14d2\u14d8r;\uc000\ud835\udd1b;\u439epf;\uc000\ud835\udd4fcr;\uc000\ud835\udcb3\u0480AIUacfosu\u14f1\u14f5\u14f9\u14fd\u1504\u150f\u1514\u151a\u1520cy;\u442fcy;\u4407cy;\u442ecute\u803b\xdd\u40dd\u0100iy\u1509\u150drc;\u4176;\u442br;\uc000\ud835\udd1cpf;\uc000\ud835\udd50cr;\uc000\ud835\udcb4ml;\u4178\u0400Hacdefos\u1535\u1539\u153f\u154b\u154f\u155d\u1560\u1564cy;\u4416cute;\u4179\u0100ay\u1544\u1549ron;\u417d;\u4417ot;\u417b\u01f2\u1554\0\u155boWidt\xe8\u0ad9a;\u4396r;\u6128pf;\u6124cr;\uc000\ud835\udcb5\u0be1\u1583\u158a\u1590\0\u15b0\u15b6\u15bf\0\0\0\0\u15c6\u15db\u15eb\u165f\u166d\0\u1695\u169b\u16b2\u16b9\0\u16becute\u803b\xe1\u40e1reve;\u4103\u0300;Ediuy\u159c\u159d\u15a1\u15a3\u15a8\u15ad\u623e;\uc000\u223e\u0333;\u623frc\u803b\xe2\u40e2te\u80bb\xb4\u0306;\u4430lig\u803b\xe6\u40e6\u0100;r\xb2\u15ba;\uc000\ud835\udd1erave\u803b\xe0\u40e0\u0100ep\u15ca\u15d6\u0100fp\u15cf\u15d4sym;\u6135\xe8\u15d3ha;\u43b1\u0100ap\u15dfc\u0100cl\u15e4\u15e7r;\u4101g;\u6a3f\u0264\u15f0\0\0\u160a\u0280;adsv\u15fa\u15fb\u15ff\u1601\u1607\u6227nd;\u6a55;\u6a5clope;\u6a58;\u6a5a\u0380;elmrsz\u1618\u1619\u161b\u161e\u163f\u164f\u1659\u6220;\u69a4e\xbb\u1619sd\u0100;a\u1625\u1626\u6221\u0461\u1630\u1632\u1634\u1636\u1638\u163a\u163c\u163e;\u69a8;\u69a9;\u69aa;\u69ab;\u69ac;\u69ad;\u69ae;\u69aft\u0100;v\u1645\u1646\u621fb\u0100;d\u164c\u164d\u62be;\u699d\u0100pt\u1654\u1657h;\u6222\xbb\xb9arr;\u637c\u0100gp\u1663\u1667on;\u4105f;\uc000\ud835\udd52\u0380;Eaeiop\u12c1\u167b\u167d\u1682\u1684\u1687\u168a;\u6a70cir;\u6a6f;\u624ad;\u624bs;\u4027rox\u0100;e\u12c1\u1692\xf1\u1683ing\u803b\xe5\u40e5\u0180cty\u16a1\u16a6\u16a8r;\uc000\ud835\udcb6;\u402amp\u0100;e\u12c1\u16af\xf1\u0288ilde\u803b\xe3\u40e3ml\u803b\xe4\u40e4\u0100ci\u16c2\u16c8onin\xf4\u0272nt;\u6a11\u0800Nabcdefiklnoprsu\u16ed\u16f1\u1730\u173c\u1743\u1748\u1778\u177d\u17e0\u17e6\u1839\u1850\u170d\u193d\u1948\u1970ot;\u6aed\u0100cr\u16f6\u171ek\u0200ceps\u1700\u1705\u170d\u1713ong;\u624cpsilon;\u43f6rime;\u6035im\u0100;e\u171a\u171b\u623dq;\u62cd\u0176\u1722\u1726ee;\u62bded\u0100;g\u172c\u172d\u6305e\xbb\u172drk\u0100;t\u135c\u1737brk;\u63b6\u0100oy\u1701\u1741;\u4431quo;\u601e\u0280cmprt\u1753\u175b\u1761\u1764\u1768aus\u0100;e\u010a\u0109ptyv;\u69b0s\xe9\u170cno\xf5\u0113\u0180ahw\u176f\u1771\u1773;\u43b2;\u6136een;\u626cr;\uc000\ud835\udd1fg\u0380costuvw\u178d\u179d\u17b3\u17c1\u17d5\u17db\u17de\u0180aiu\u1794\u1796\u179a\xf0\u0760rc;\u65efp\xbb\u1371\u0180dpt\u17a4\u17a8\u17adot;\u6a00lus;\u6a01imes;\u6a02\u0271\u17b9\0\0\u17becup;\u6a06ar;\u6605riangle\u0100du\u17cd\u17d2own;\u65bdp;\u65b3plus;\u6a04e\xe5\u1444\xe5\u14adarow;\u690d\u0180ako\u17ed\u1826\u1835\u0100cn\u17f2\u1823k\u0180lst\u17fa\u05ab\u1802ozenge;\u69ebriangle\u0200;dlr\u1812\u1813\u1818\u181d\u65b4own;\u65beeft;\u65c2ight;\u65b8k;\u6423\u01b1\u182b\0\u1833\u01b2\u182f\0\u1831;\u6592;\u65914;\u6593ck;\u6588\u0100eo\u183e\u184d\u0100;q\u1843\u1846\uc000=\u20e5uiv;\uc000\u2261\u20e5t;\u6310\u0200ptwx\u1859\u185e\u1867\u186cf;\uc000\ud835\udd53\u0100;t\u13cb\u1863om\xbb\u13cctie;\u62c8\u0600DHUVbdhmptuv\u1885\u1896\u18aa\u18bb\u18d7\u18db\u18ec\u18ff\u1905\u190a\u1910\u1921\u0200LRlr\u188e\u1890\u1892\u1894;\u6557;\u6554;\u6556;\u6553\u0280;DUdu\u18a1\u18a2\u18a4\u18a6\u18a8\u6550;\u6566;\u6569;\u6564;\u6567\u0200LRlr\u18b3\u18b5\u18b7\u18b9;\u655d;\u655a;\u655c;\u6559\u0380;HLRhlr\u18ca\u18cb\u18cd\u18cf\u18d1\u18d3\u18d5\u6551;\u656c;\u6563;\u6560;\u656b;\u6562;\u655fox;\u69c9\u0200LRlr\u18e4\u18e6\u18e8\u18ea;\u6555;\u6552;\u6510;\u650c\u0280;DUdu\u06bd\u18f7\u18f9\u18fb\u18fd;\u6565;\u6568;\u652c;\u6534inus;\u629flus;\u629eimes;\u62a0\u0200LRlr\u1919\u191b\u191d\u191f;\u655b;\u6558;\u6518;\u6514\u0380;HLRhlr\u1930\u1931\u1933\u1935\u1937\u1939\u193b\u6502;\u656a;\u6561;\u655e;\u653c;\u6524;\u651c\u0100ev\u0123\u1942bar\u803b\xa6\u40a6\u0200ceio\u1951\u1956\u195a\u1960r;\uc000\ud835\udcb7mi;\u604fm\u0100;e\u171a\u171cl\u0180;bh\u1968\u1969\u196b\u405c;\u69c5sub;\u67c8\u016c\u1974\u197el\u0100;e\u1979\u197a\u6022t\xbb\u197ap\u0180;Ee\u012f\u1985\u1987;\u6aae\u0100;q\u06dc\u06db\u0ce1\u19a7\0\u19e8\u1a11\u1a15\u1a32\0\u1a37\u1a50\0\0\u1ab4\0\0\u1ac1\0\0\u1b21\u1b2e\u1b4d\u1b52\0\u1bfd\0\u1c0c\u0180cpr\u19ad\u19b2\u19ddute;\u4107\u0300;abcds\u19bf\u19c0\u19c4\u19ca\u19d5\u19d9\u6229nd;\u6a44rcup;\u6a49\u0100au\u19cf\u19d2p;\u6a4bp;\u6a47ot;\u6a40;\uc000\u2229\ufe00\u0100eo\u19e2\u19e5t;\u6041\xee\u0693\u0200aeiu\u19f0\u19fb\u1a01\u1a05\u01f0\u19f5\0\u19f8s;\u6a4don;\u410ddil\u803b\xe7\u40e7rc;\u4109ps\u0100;s\u1a0c\u1a0d\u6a4cm;\u6a50ot;\u410b\u0180dmn\u1a1b\u1a20\u1a26il\u80bb\xb8\u01adptyv;\u69b2t\u8100\xa2;e\u1a2d\u1a2e\u40a2r\xe4\u01b2r;\uc000\ud835\udd20\u0180cei\u1a3d\u1a40\u1a4dy;\u4447ck\u0100;m\u1a47\u1a48\u6713ark\xbb\u1a48;\u43c7r\u0380;Ecefms\u1a5f\u1a60\u1a62\u1a6b\u1aa4\u1aaa\u1aae\u65cb;\u69c3\u0180;el\u1a69\u1a6a\u1a6d\u42c6q;\u6257e\u0261\u1a74\0\0\u1a88rrow\u0100lr\u1a7c\u1a81eft;\u61baight;\u61bb\u0280RSacd\u1a92\u1a94\u1a96\u1a9a\u1a9f\xbb\u0f47;\u64c8st;\u629birc;\u629aash;\u629dnint;\u6a10id;\u6aefcir;\u69c2ubs\u0100;u\u1abb\u1abc\u6663it\xbb\u1abc\u02ec\u1ac7\u1ad4\u1afa\0\u1b0aon\u0100;e\u1acd\u1ace\u403a\u0100;q\xc7\xc6\u026d\u1ad9\0\0\u1ae2a\u0100;t\u1ade\u1adf\u402c;\u4040\u0180;fl\u1ae8\u1ae9\u1aeb\u6201\xee\u1160e\u0100mx\u1af1\u1af6ent\xbb\u1ae9e\xf3\u024d\u01e7\u1afe\0\u1b07\u0100;d\u12bb\u1b02ot;\u6a6dn\xf4\u0246\u0180fry\u1b10\u1b14\u1b17;\uc000\ud835\udd54o\xe4\u0254\u8100\xa9;s\u0155\u1b1dr;\u6117\u0100ao\u1b25\u1b29rr;\u61b5ss;\u6717\u0100cu\u1b32\u1b37r;\uc000\ud835\udcb8\u0100bp\u1b3c\u1b44\u0100;e\u1b41\u1b42\u6acf;\u6ad1\u0100;e\u1b49\u1b4a\u6ad0;\u6ad2dot;\u62ef\u0380delprvw\u1b60\u1b6c\u1b77\u1b82\u1bac\u1bd4\u1bf9arr\u0100lr\u1b68\u1b6a;\u6938;\u6935\u0270\u1b72\0\0\u1b75r;\u62dec;\u62dfarr\u0100;p\u1b7f\u1b80\u61b6;\u693d\u0300;bcdos\u1b8f\u1b90\u1b96\u1ba1\u1ba5\u1ba8\u622arcap;\u6a48\u0100au\u1b9b\u1b9ep;\u6a46p;\u6a4aot;\u628dr;\u6a45;\uc000\u222a\ufe00\u0200alrv\u1bb5\u1bbf\u1bde\u1be3rr\u0100;m\u1bbc\u1bbd\u61b7;\u693cy\u0180evw\u1bc7\u1bd4\u1bd8q\u0270\u1bce\0\0\u1bd2re\xe3\u1b73u\xe3\u1b75ee;\u62ceedge;\u62cfen\u803b\xa4\u40a4earrow\u0100lr\u1bee\u1bf3eft\xbb\u1b80ight\xbb\u1bbde\xe4\u1bdd\u0100ci\u1c01\u1c07onin\xf4\u01f7nt;\u6231lcty;\u632d\u0980AHabcdefhijlorstuwz\u1c38\u1c3b\u1c3f\u1c5d\u1c69\u1c75\u1c8a\u1c9e\u1cac\u1cb7\u1cfb\u1cff\u1d0d\u1d7b\u1d91\u1dab\u1dbb\u1dc6\u1dcdr\xf2\u0381ar;\u6965\u0200glrs\u1c48\u1c4d\u1c52\u1c54ger;\u6020eth;\u6138\xf2\u1133h\u0100;v\u1c5a\u1c5b\u6010\xbb\u090a\u016b\u1c61\u1c67arow;\u690fa\xe3\u0315\u0100ay\u1c6e\u1c73ron;\u410f;\u4434\u0180;ao\u0332\u1c7c\u1c84\u0100gr\u02bf\u1c81r;\u61catseq;\u6a77\u0180glm\u1c91\u1c94\u1c98\u803b\xb0\u40b0ta;\u43b4ptyv;\u69b1\u0100ir\u1ca3\u1ca8sht;\u697f;\uc000\ud835\udd21ar\u0100lr\u1cb3\u1cb5\xbb\u08dc\xbb\u101e\u0280aegsv\u1cc2\u0378\u1cd6\u1cdc\u1ce0m\u0180;os\u0326\u1cca\u1cd4nd\u0100;s\u0326\u1cd1uit;\u6666amma;\u43ddin;\u62f2\u0180;io\u1ce7\u1ce8\u1cf8\u40f7de\u8100\xf7;o\u1ce7\u1cf0ntimes;\u62c7n\xf8\u1cf7cy;\u4452c\u026f\u1d06\0\0\u1d0arn;\u631eop;\u630d\u0280lptuw\u1d18\u1d1d\u1d22\u1d49\u1d55lar;\u4024f;\uc000\ud835\udd55\u0280;emps\u030b\u1d2d\u1d37\u1d3d\u1d42q\u0100;d\u0352\u1d33ot;\u6251inus;\u6238lus;\u6214quare;\u62a1blebarwedg\xe5\xfan\u0180adh\u112e\u1d5d\u1d67ownarrow\xf3\u1c83arpoon\u0100lr\u1d72\u1d76ef\xf4\u1cb4igh\xf4\u1cb6\u0162\u1d7f\u1d85karo\xf7\u0f42\u026f\u1d8a\0\0\u1d8ern;\u631fop;\u630c\u0180cot\u1d98\u1da3\u1da6\u0100ry\u1d9d\u1da1;\uc000\ud835\udcb9;\u4455l;\u69f6rok;\u4111\u0100dr\u1db0\u1db4ot;\u62f1i\u0100;f\u1dba\u1816\u65bf\u0100ah\u1dc0\u1dc3r\xf2\u0429a\xf2\u0fa6angle;\u69a6\u0100ci\u1dd2\u1dd5y;\u445fgrarr;\u67ff\u0900Dacdefglmnopqrstux\u1e01\u1e09\u1e19\u1e38\u0578\u1e3c\u1e49\u1e61\u1e7e\u1ea5\u1eaf\u1ebd\u1ee1\u1f2a\u1f37\u1f44\u1f4e\u1f5a\u0100Do\u1e06\u1d34o\xf4\u1c89\u0100cs\u1e0e\u1e14ute\u803b\xe9\u40e9ter;\u6a6e\u0200aioy\u1e22\u1e27\u1e31\u1e36ron;\u411br\u0100;c\u1e2d\u1e2e\u6256\u803b\xea\u40ealon;\u6255;\u444dot;\u4117\u0100Dr\u1e41\u1e45ot;\u6252;\uc000\ud835\udd22\u0180;rs\u1e50\u1e51\u1e57\u6a9aave\u803b\xe8\u40e8\u0100;d\u1e5c\u1e5d\u6a96ot;\u6a98\u0200;ils\u1e6a\u1e6b\u1e72\u1e74\u6a99nters;\u63e7;\u6113\u0100;d\u1e79\u1e7a\u6a95ot;\u6a97\u0180aps\u1e85\u1e89\u1e97cr;\u4113ty\u0180;sv\u1e92\u1e93\u1e95\u6205et\xbb\u1e93p\u01001;\u1e9d\u1ea4\u0133\u1ea1\u1ea3;\u6004;\u6005\u6003\u0100gs\u1eaa\u1eac;\u414bp;\u6002\u0100gp\u1eb4\u1eb8on;\u4119f;\uc000\ud835\udd56\u0180als\u1ec4\u1ece\u1ed2r\u0100;s\u1eca\u1ecb\u62d5l;\u69e3us;\u6a71i\u0180;lv\u1eda\u1edb\u1edf\u43b5on\xbb\u1edb;\u43f5\u0200csuv\u1eea\u1ef3\u1f0b\u1f23\u0100io\u1eef\u1e31rc\xbb\u1e2e\u0269\u1ef9\0\0\u1efb\xed\u0548ant\u0100gl\u1f02\u1f06tr\xbb\u1e5dess\xbb\u1e7a\u0180aei\u1f12\u1f16\u1f1als;\u403dst;\u625fv\u0100;D\u0235\u1f20D;\u6a78parsl;\u69e5\u0100Da\u1f2f\u1f33ot;\u6253rr;\u6971\u0180cdi\u1f3e\u1f41\u1ef8r;\u612fo\xf4\u0352\u0100ah\u1f49\u1f4b;\u43b7\u803b\xf0\u40f0\u0100mr\u1f53\u1f57l\u803b\xeb\u40ebo;\u60ac\u0180cip\u1f61\u1f64\u1f67l;\u4021s\xf4\u056e\u0100eo\u1f6c\u1f74ctatio\xee\u0559nential\xe5\u0579\u09e1\u1f92\0\u1f9e\0\u1fa1\u1fa7\0\0\u1fc6\u1fcc\0\u1fd3\0\u1fe6\u1fea\u2000\0\u2008\u205allingdotse\xf1\u1e44y;\u4444male;\u6640\u0180ilr\u1fad\u1fb3\u1fc1lig;\u8000\ufb03\u0269\u1fb9\0\0\u1fbdg;\u8000\ufb00ig;\u8000\ufb04;\uc000\ud835\udd23lig;\u8000\ufb01lig;\uc000fj\u0180alt\u1fd9\u1fdc\u1fe1t;\u666dig;\u8000\ufb02ns;\u65b1of;\u4192\u01f0\u1fee\0\u1ff3f;\uc000\ud835\udd57\u0100ak\u05bf\u1ff7\u0100;v\u1ffc\u1ffd\u62d4;\u6ad9artint;\u6a0d\u0100ao\u200c\u2055\u0100cs\u2011\u2052\u03b1\u201a\u2030\u2038\u2045\u2048\0\u2050\u03b2\u2022\u2025\u2027\u202a\u202c\0\u202e\u803b\xbd\u40bd;\u6153\u803b\xbc\u40bc;\u6155;\u6159;\u615b\u01b3\u2034\0\u2036;\u6154;\u6156\u02b4\u203e\u2041\0\0\u2043\u803b\xbe\u40be;\u6157;\u615c5;\u6158\u01b6\u204c\0\u204e;\u615a;\u615d8;\u615el;\u6044wn;\u6322cr;\uc000\ud835\udcbb\u0880Eabcdefgijlnorstv\u2082\u2089\u209f\u20a5\u20b0\u20b4\u20f0\u20f5\u20fa\u20ff\u2103\u2112\u2138\u0317\u213e\u2152\u219e\u0100;l\u064d\u2087;\u6a8c\u0180cmp\u2090\u2095\u209dute;\u41f5ma\u0100;d\u209c\u1cda\u43b3;\u6a86reve;\u411f\u0100iy\u20aa\u20aerc;\u411d;\u4433ot;\u4121\u0200;lqs\u063e\u0642\u20bd\u20c9\u0180;qs\u063e\u064c\u20c4lan\xf4\u0665\u0200;cdl\u0665\u20d2\u20d5\u20e5c;\u6aa9ot\u0100;o\u20dc\u20dd\u6a80\u0100;l\u20e2\u20e3\u6a82;\u6a84\u0100;e\u20ea\u20ed\uc000\u22db\ufe00s;\u6a94r;\uc000\ud835\udd24\u0100;g\u0673\u061bmel;\u6137cy;\u4453\u0200;Eaj\u065a\u210c\u210e\u2110;\u6a92;\u6aa5;\u6aa4\u0200Eaes\u211b\u211d\u2129\u2134;\u6269p\u0100;p\u2123\u2124\u6a8arox\xbb\u2124\u0100;q\u212e\u212f\u6a88\u0100;q\u212e\u211bim;\u62e7pf;\uc000\ud835\udd58\u0100ci\u2143\u2146r;\u610am\u0180;el\u066b\u214e\u2150;\u6a8e;\u6a90\u8300>;cdlqr\u05ee\u2160\u216a\u216e\u2173\u2179\u0100ci\u2165\u2167;\u6aa7r;\u6a7aot;\u62d7Par;\u6995uest;\u6a7c\u0280adels\u2184\u216a\u2190\u0656\u219b\u01f0\u2189\0\u218epro\xf8\u209er;\u6978q\u0100lq\u063f\u2196les\xf3\u2088i\xed\u066b\u0100en\u21a3\u21adrtneqq;\uc000\u2269\ufe00\xc5\u21aa\u0500Aabcefkosy\u21c4\u21c7\u21f1\u21f5\u21fa\u2218\u221d\u222f\u2268\u227dr\xf2\u03a0\u0200ilmr\u21d0\u21d4\u21d7\u21dbrs\xf0\u1484f\xbb\u2024il\xf4\u06a9\u0100dr\u21e0\u21e4cy;\u444a\u0180;cw\u08f4\u21eb\u21efir;\u6948;\u61adar;\u610firc;\u4125\u0180alr\u2201\u220e\u2213rts\u0100;u\u2209\u220a\u6665it\xbb\u220alip;\u6026con;\u62b9r;\uc000\ud835\udd25s\u0100ew\u2223\u2229arow;\u6925arow;\u6926\u0280amopr\u223a\u223e\u2243\u225e\u2263rr;\u61fftht;\u623bk\u0100lr\u2249\u2253eftarrow;\u61a9ightarrow;\u61aaf;\uc000\ud835\udd59bar;\u6015\u0180clt\u226f\u2274\u2278r;\uc000\ud835\udcbdas\xe8\u21f4rok;\u4127\u0100bp\u2282\u2287ull;\u6043hen\xbb\u1c5b\u0ae1\u22a3\0\u22aa\0\u22b8\u22c5\u22ce\0\u22d5\u22f3\0\0\u22f8\u2322\u2367\u2362\u237f\0\u2386\u23aa\u23b4cute\u803b\xed\u40ed\u0180;iy\u0771\u22b0\u22b5rc\u803b\xee\u40ee;\u4438\u0100cx\u22bc\u22bfy;\u4435cl\u803b\xa1\u40a1\u0100fr\u039f\u22c9;\uc000\ud835\udd26rave\u803b\xec\u40ec\u0200;ino\u073e\u22dd\u22e9\u22ee\u0100in\u22e2\u22e6nt;\u6a0ct;\u622dfin;\u69dcta;\u6129lig;\u4133\u0180aop\u22fe\u231a\u231d\u0180cgt\u2305\u2308\u2317r;\u412b\u0180elp\u071f\u230f\u2313in\xe5\u078ear\xf4\u0720h;\u4131f;\u62b7ed;\u41b5\u0280;cfot\u04f4\u232c\u2331\u233d\u2341are;\u6105in\u0100;t\u2338\u2339\u621eie;\u69dddo\xf4\u2319\u0280;celp\u0757\u234c\u2350\u235b\u2361al;\u62ba\u0100gr\u2355\u2359er\xf3\u1563\xe3\u234darhk;\u6a17rod;\u6a3c\u0200cgpt\u236f\u2372\u2376\u237by;\u4451on;\u412ff;\uc000\ud835\udd5aa;\u43b9uest\u803b\xbf\u40bf\u0100ci\u238a\u238fr;\uc000\ud835\udcben\u0280;Edsv\u04f4\u239b\u239d\u23a1\u04f3;\u62f9ot;\u62f5\u0100;v\u23a6\u23a7\u62f4;\u62f3\u0100;i\u0777\u23aelde;\u4129\u01eb\u23b8\0\u23bccy;\u4456l\u803b\xef\u40ef\u0300cfmosu\u23cc\u23d7\u23dc\u23e1\u23e7\u23f5\u0100iy\u23d1\u23d5rc;\u4135;\u4439r;\uc000\ud835\udd27ath;\u4237pf;\uc000\ud835\udd5b\u01e3\u23ec\0\u23f1r;\uc000\ud835\udcbfrcy;\u4458kcy;\u4454\u0400acfghjos\u240b\u2416\u2422\u2427\u242d\u2431\u2435\u243bppa\u0100;v\u2413\u2414\u43ba;\u43f0\u0100ey\u241b\u2420dil;\u4137;\u443ar;\uc000\ud835\udd28reen;\u4138cy;\u4445cy;\u445cpf;\uc000\ud835\udd5ccr;\uc000\ud835\udcc0\u0b80ABEHabcdefghjlmnoprstuv\u2470\u2481\u2486\u248d\u2491\u250e\u253d\u255a\u2580\u264e\u265e\u2665\u2679\u267d\u269a\u26b2\u26d8\u275d\u2768\u278b\u27c0\u2801\u2812\u0180art\u2477\u247a\u247cr\xf2\u09c6\xf2\u0395ail;\u691barr;\u690e\u0100;g\u0994\u248b;\u6a8bar;\u6962\u0963\u24a5\0\u24aa\0\u24b1\0\0\0\0\0\u24b5\u24ba\0\u24c6\u24c8\u24cd\0\u24f9ute;\u413amptyv;\u69b4ra\xee\u084cbda;\u43bbg\u0180;dl\u088e\u24c1\u24c3;\u6991\xe5\u088e;\u6a85uo\u803b\xab\u40abr\u0400;bfhlpst\u0899\u24de\u24e6\u24e9\u24eb\u24ee\u24f1\u24f5\u0100;f\u089d\u24e3s;\u691fs;\u691d\xeb\u2252p;\u61abl;\u6939im;\u6973l;\u61a2\u0180;ae\u24ff\u2500\u2504\u6aabil;\u6919\u0100;s\u2509\u250a\u6aad;\uc000\u2aad\ufe00\u0180abr\u2515\u2519\u251drr;\u690crk;\u6772\u0100ak\u2522\u252cc\u0100ek\u2528\u252a;\u407b;\u405b\u0100es\u2531\u2533;\u698bl\u0100du\u2539\u253b;\u698f;\u698d\u0200aeuy\u2546\u254b\u2556\u2558ron;\u413e\u0100di\u2550\u2554il;\u413c\xec\u08b0\xe2\u2529;\u443b\u0200cqrs\u2563\u2566\u256d\u257da;\u6936uo\u0100;r\u0e19\u1746\u0100du\u2572\u2577har;\u6967shar;\u694bh;\u61b2\u0280;fgqs\u258b\u258c\u0989\u25f3\u25ff\u6264t\u0280ahlrt\u2598\u25a4\u25b7\u25c2\u25e8rrow\u0100;t\u0899\u25a1a\xe9\u24f6arpoon\u0100du\u25af\u25b4own\xbb\u045ap\xbb\u0966eftarrows;\u61c7ight\u0180ahs\u25cd\u25d6\u25derrow\u0100;s\u08f4\u08a7arpoon\xf3\u0f98quigarro\xf7\u21f0hreetimes;\u62cb\u0180;qs\u258b\u0993\u25falan\xf4\u09ac\u0280;cdgs\u09ac\u260a\u260d\u261d\u2628c;\u6aa8ot\u0100;o\u2614\u2615\u6a7f\u0100;r\u261a\u261b\u6a81;\u6a83\u0100;e\u2622\u2625\uc000\u22da\ufe00s;\u6a93\u0280adegs\u2633\u2639\u263d\u2649\u264bppro\xf8\u24c6ot;\u62d6q\u0100gq\u2643\u2645\xf4\u0989gt\xf2\u248c\xf4\u099bi\xed\u09b2\u0180ilr\u2655\u08e1\u265asht;\u697c;\uc000\ud835\udd29\u0100;E\u099c\u2663;\u6a91\u0161\u2669\u2676r\u0100du\u25b2\u266e\u0100;l\u0965\u2673;\u696alk;\u6584cy;\u4459\u0280;acht\u0a48\u2688\u268b\u2691\u2696r\xf2\u25c1orne\xf2\u1d08ard;\u696bri;\u65fa\u0100io\u269f\u26a4dot;\u4140ust\u0100;a\u26ac\u26ad\u63b0che\xbb\u26ad\u0200Eaes\u26bb\u26bd\u26c9\u26d4;\u6268p\u0100;p\u26c3\u26c4\u6a89rox\xbb\u26c4\u0100;q\u26ce\u26cf\u6a87\u0100;q\u26ce\u26bbim;\u62e6\u0400abnoptwz\u26e9\u26f4\u26f7\u271a\u272f\u2741\u2747\u2750\u0100nr\u26ee\u26f1g;\u67ecr;\u61fdr\xeb\u08c1g\u0180lmr\u26ff\u270d\u2714eft\u0100ar\u09e6\u2707ight\xe1\u09f2apsto;\u67fcight\xe1\u09fdparrow\u0100lr\u2725\u2729ef\xf4\u24edight;\u61ac\u0180afl\u2736\u2739\u273dr;\u6985;\uc000\ud835\udd5dus;\u6a2dimes;\u6a34\u0161\u274b\u274fst;\u6217\xe1\u134e\u0180;ef\u2757\u2758\u1800\u65cange\xbb\u2758ar\u0100;l\u2764\u2765\u4028t;\u6993\u0280achmt\u2773\u2776\u277c\u2785\u2787r\xf2\u08a8orne\xf2\u1d8car\u0100;d\u0f98\u2783;\u696d;\u600eri;\u62bf\u0300achiqt\u2798\u279d\u0a40\u27a2\u27ae\u27bbquo;\u6039r;\uc000\ud835\udcc1m\u0180;eg\u09b2\u27aa\u27ac;\u6a8d;\u6a8f\u0100bu\u252a\u27b3o\u0100;r\u0e1f\u27b9;\u601arok;\u4142\u8400<;cdhilqr\u082b\u27d2\u2639\u27dc\u27e0\u27e5\u27ea\u27f0\u0100ci\u27d7\u27d9;\u6aa6r;\u6a79re\xe5\u25f2mes;\u62c9arr;\u6976uest;\u6a7b\u0100Pi\u27f5\u27f9ar;\u6996\u0180;ef\u2800\u092d\u181b\u65c3r\u0100du\u2807\u280dshar;\u694ahar;\u6966\u0100en\u2817\u2821rtneqq;\uc000\u2268\ufe00\xc5\u281e\u0700Dacdefhilnopsu\u2840\u2845\u2882\u288e\u2893\u28a0\u28a5\u28a8\u28da\u28e2\u28e4\u0a83\u28f3\u2902Dot;\u623a\u0200clpr\u284e\u2852\u2863\u287dr\u803b\xaf\u40af\u0100et\u2857\u2859;\u6642\u0100;e\u285e\u285f\u6720se\xbb\u285f\u0100;s\u103b\u2868to\u0200;dlu\u103b\u2873\u2877\u287bow\xee\u048cef\xf4\u090f\xf0\u13d1ker;\u65ae\u0100oy\u2887\u288cmma;\u6a29;\u443cash;\u6014asuredangle\xbb\u1626r;\uc000\ud835\udd2ao;\u6127\u0180cdn\u28af\u28b4\u28c9ro\u803b\xb5\u40b5\u0200;acd\u1464\u28bd\u28c0\u28c4s\xf4\u16a7ir;\u6af0ot\u80bb\xb7\u01b5us\u0180;bd\u28d2\u1903\u28d3\u6212\u0100;u\u1d3c\u28d8;\u6a2a\u0163\u28de\u28e1p;\u6adb\xf2\u2212\xf0\u0a81\u0100dp\u28e9\u28eeels;\u62a7f;\uc000\ud835\udd5e\u0100ct\u28f8\u28fdr;\uc000\ud835\udcc2pos\xbb\u159d\u0180;lm\u2909\u290a\u290d\u43bctimap;\u62b8\u0c00GLRVabcdefghijlmoprstuvw\u2942\u2953\u297e\u2989\u2998\u29da\u29e9\u2a15\u2a1a\u2a58\u2a5d\u2a83\u2a95\u2aa4\u2aa8\u2b04\u2b07\u2b44\u2b7f\u2bae\u2c34\u2c67\u2c7c\u2ce9\u0100gt\u2947\u294b;\uc000\u22d9\u0338\u0100;v\u2950\u0bcf\uc000\u226b\u20d2\u0180elt\u295a\u2972\u2976ft\u0100ar\u2961\u2967rrow;\u61cdightarrow;\u61ce;\uc000\u22d8\u0338\u0100;v\u297b\u0c47\uc000\u226a\u20d2ightarrow;\u61cf\u0100Dd\u298e\u2993ash;\u62afash;\u62ae\u0280bcnpt\u29a3\u29a7\u29ac\u29b1\u29ccla\xbb\u02deute;\u4144g;\uc000\u2220\u20d2\u0280;Eiop\u0d84\u29bc\u29c0\u29c5\u29c8;\uc000\u2a70\u0338d;\uc000\u224b\u0338s;\u4149ro\xf8\u0d84ur\u0100;a\u29d3\u29d4\u666el\u0100;s\u29d3\u0b38\u01f3\u29df\0\u29e3p\u80bb\xa0\u0b37mp\u0100;e\u0bf9\u0c00\u0280aeouy\u29f4\u29fe\u2a03\u2a10\u2a13\u01f0\u29f9\0\u29fb;\u6a43on;\u4148dil;\u4146ng\u0100;d\u0d7e\u2a0aot;\uc000\u2a6d\u0338p;\u6a42;\u443dash;\u6013\u0380;Aadqsx\u0b92\u2a29\u2a2d\u2a3b\u2a41\u2a45\u2a50rr;\u61d7r\u0100hr\u2a33\u2a36k;\u6924\u0100;o\u13f2\u13f0ot;\uc000\u2250\u0338ui\xf6\u0b63\u0100ei\u2a4a\u2a4ear;\u6928\xed\u0b98ist\u0100;s\u0ba0\u0b9fr;\uc000\ud835\udd2b\u0200Eest\u0bc5\u2a66\u2a79\u2a7c\u0180;qs\u0bbc\u2a6d\u0be1\u0180;qs\u0bbc\u0bc5\u2a74lan\xf4\u0be2i\xed\u0bea\u0100;r\u0bb6\u2a81\xbb\u0bb7\u0180Aap\u2a8a\u2a8d\u2a91r\xf2\u2971rr;\u61aear;\u6af2\u0180;sv\u0f8d\u2a9c\u0f8c\u0100;d\u2aa1\u2aa2\u62fc;\u62facy;\u445a\u0380AEadest\u2ab7\u2aba\u2abe\u2ac2\u2ac5\u2af6\u2af9r\xf2\u2966;\uc000\u2266\u0338rr;\u619ar;\u6025\u0200;fqs\u0c3b\u2ace\u2ae3\u2aeft\u0100ar\u2ad4\u2ad9rro\xf7\u2ac1ightarro\xf7\u2a90\u0180;qs\u0c3b\u2aba\u2aealan\xf4\u0c55\u0100;s\u0c55\u2af4\xbb\u0c36i\xed\u0c5d\u0100;r\u0c35\u2afei\u0100;e\u0c1a\u0c25i\xe4\u0d90\u0100pt\u2b0c\u2b11f;\uc000\ud835\udd5f\u8180\xac;in\u2b19\u2b1a\u2b36\u40acn\u0200;Edv\u0b89\u2b24\u2b28\u2b2e;\uc000\u22f9\u0338ot;\uc000\u22f5\u0338\u01e1\u0b89\u2b33\u2b35;\u62f7;\u62f6i\u0100;v\u0cb8\u2b3c\u01e1\u0cb8\u2b41\u2b43;\u62fe;\u62fd\u0180aor\u2b4b\u2b63\u2b69r\u0200;ast\u0b7b\u2b55\u2b5a\u2b5flle\xec\u0b7bl;\uc000\u2afd\u20e5;\uc000\u2202\u0338lint;\u6a14\u0180;ce\u0c92\u2b70\u2b73u\xe5\u0ca5\u0100;c\u0c98\u2b78\u0100;e\u0c92\u2b7d\xf1\u0c98\u0200Aait\u2b88\u2b8b\u2b9d\u2ba7r\xf2\u2988rr\u0180;cw\u2b94\u2b95\u2b99\u619b;\uc000\u2933\u0338;\uc000\u219d\u0338ghtarrow\xbb\u2b95ri\u0100;e\u0ccb\u0cd6\u0380chimpqu\u2bbd\u2bcd\u2bd9\u2b04\u0b78\u2be4\u2bef\u0200;cer\u0d32\u2bc6\u0d37\u2bc9u\xe5\u0d45;\uc000\ud835\udcc3ort\u026d\u2b05\0\0\u2bd6ar\xe1\u2b56m\u0100;e\u0d6e\u2bdf\u0100;q\u0d74\u0d73su\u0100bp\u2beb\u2bed\xe5\u0cf8\xe5\u0d0b\u0180bcp\u2bf6\u2c11\u2c19\u0200;Ees\u2bff\u2c00\u0d22\u2c04\u6284;\uc000\u2ac5\u0338et\u0100;e\u0d1b\u2c0bq\u0100;q\u0d23\u2c00c\u0100;e\u0d32\u2c17\xf1\u0d38\u0200;Ees\u2c22\u2c23\u0d5f\u2c27\u6285;\uc000\u2ac6\u0338et\u0100;e\u0d58\u2c2eq\u0100;q\u0d60\u2c23\u0200gilr\u2c3d\u2c3f\u2c45\u2c47\xec\u0bd7lde\u803b\xf1\u40f1\xe7\u0c43iangle\u0100lr\u2c52\u2c5ceft\u0100;e\u0c1a\u2c5a\xf1\u0c26ight\u0100;e\u0ccb\u2c65\xf1\u0cd7\u0100;m\u2c6c\u2c6d\u43bd\u0180;es\u2c74\u2c75\u2c79\u4023ro;\u6116p;\u6007\u0480DHadgilrs\u2c8f\u2c94\u2c99\u2c9e\u2ca3\u2cb0\u2cb6\u2cd3\u2ce3ash;\u62adarr;\u6904p;\uc000\u224d\u20d2ash;\u62ac\u0100et\u2ca8\u2cac;\uc000\u2265\u20d2;\uc000>\u20d2nfin;\u69de\u0180Aet\u2cbd\u2cc1\u2cc5rr;\u6902;\uc000\u2264\u20d2\u0100;r\u2cca\u2ccd\uc000<\u20d2ie;\uc000\u22b4\u20d2\u0100At\u2cd8\u2cdcrr;\u6903rie;\uc000\u22b5\u20d2im;\uc000\u223c\u20d2\u0180Aan\u2cf0\u2cf4\u2d02rr;\u61d6r\u0100hr\u2cfa\u2cfdk;\u6923\u0100;o\u13e7\u13e5ear;\u6927\u1253\u1a95\0\0\0\0\0\0\0\0\0\0\0\0\0\u2d2d\0\u2d38\u2d48\u2d60\u2d65\u2d72\u2d84\u1b07\0\0\u2d8d\u2dab\0\u2dc8\u2dce\0\u2ddc\u2e19\u2e2b\u2e3e\u2e43\u0100cs\u2d31\u1a97ute\u803b\xf3\u40f3\u0100iy\u2d3c\u2d45r\u0100;c\u1a9e\u2d42\u803b\xf4\u40f4;\u443e\u0280abios\u1aa0\u2d52\u2d57\u01c8\u2d5alac;\u4151v;\u6a38old;\u69bclig;\u4153\u0100cr\u2d69\u2d6dir;\u69bf;\uc000\ud835\udd2c\u036f\u2d79\0\0\u2d7c\0\u2d82n;\u42dbave\u803b\xf2\u40f2;\u69c1\u0100bm\u2d88\u0df4ar;\u69b5\u0200acit\u2d95\u2d98\u2da5\u2da8r\xf2\u1a80\u0100ir\u2d9d\u2da0r;\u69beoss;\u69bbn\xe5\u0e52;\u69c0\u0180aei\u2db1\u2db5\u2db9cr;\u414dga;\u43c9\u0180cdn\u2dc0\u2dc5\u01cdron;\u43bf;\u69b6pf;\uc000\ud835\udd60\u0180ael\u2dd4\u2dd7\u01d2r;\u69b7rp;\u69b9\u0380;adiosv\u2dea\u2deb\u2dee\u2e08\u2e0d\u2e10\u2e16\u6228r\xf2\u1a86\u0200;efm\u2df7\u2df8\u2e02\u2e05\u6a5dr\u0100;o\u2dfe\u2dff\u6134f\xbb\u2dff\u803b\xaa\u40aa\u803b\xba\u40bagof;\u62b6r;\u6a56lope;\u6a57;\u6a5b\u0180clo\u2e1f\u2e21\u2e27\xf2\u2e01ash\u803b\xf8\u40f8l;\u6298i\u016c\u2e2f\u2e34de\u803b\xf5\u40f5es\u0100;a\u01db\u2e3as;\u6a36ml\u803b\xf6\u40f6bar;\u633d\u0ae1\u2e5e\0\u2e7d\0\u2e80\u2e9d\0\u2ea2\u2eb9\0\0\u2ecb\u0e9c\0\u2f13\0\0\u2f2b\u2fbc\0\u2fc8r\u0200;ast\u0403\u2e67\u2e72\u0e85\u8100\xb6;l\u2e6d\u2e6e\u40b6le\xec\u0403\u0269\u2e78\0\0\u2e7bm;\u6af3;\u6afdy;\u443fr\u0280cimpt\u2e8b\u2e8f\u2e93\u1865\u2e97nt;\u4025od;\u402eil;\u6030enk;\u6031r;\uc000\ud835\udd2d\u0180imo\u2ea8\u2eb0\u2eb4\u0100;v\u2ead\u2eae\u43c6;\u43d5ma\xf4\u0a76ne;\u660e\u0180;tv\u2ebf\u2ec0\u2ec8\u43c0chfork\xbb\u1ffd;\u43d6\u0100au\u2ecf\u2edfn\u0100ck\u2ed5\u2eddk\u0100;h\u21f4\u2edb;\u610e\xf6\u21f4s\u0480;abcdemst\u2ef3\u2ef4\u1908\u2ef9\u2efd\u2f04\u2f06\u2f0a\u2f0e\u402bcir;\u6a23ir;\u6a22\u0100ou\u1d40\u2f02;\u6a25;\u6a72n\u80bb\xb1\u0e9dim;\u6a26wo;\u6a27\u0180ipu\u2f19\u2f20\u2f25ntint;\u6a15f;\uc000\ud835\udd61nd\u803b\xa3\u40a3\u0500;Eaceinosu\u0ec8\u2f3f\u2f41\u2f44\u2f47\u2f81\u2f89\u2f92\u2f7e\u2fb6;\u6ab3p;\u6ab7u\xe5\u0ed9\u0100;c\u0ece\u2f4c\u0300;acens\u0ec8\u2f59\u2f5f\u2f66\u2f68\u2f7eppro\xf8\u2f43urlye\xf1\u0ed9\xf1\u0ece\u0180aes\u2f6f\u2f76\u2f7approx;\u6ab9qq;\u6ab5im;\u62e8i\xed\u0edfme\u0100;s\u2f88\u0eae\u6032\u0180Eas\u2f78\u2f90\u2f7a\xf0\u2f75\u0180dfp\u0eec\u2f99\u2faf\u0180als\u2fa0\u2fa5\u2faalar;\u632eine;\u6312urf;\u6313\u0100;t\u0efb\u2fb4\xef\u0efbrel;\u62b0\u0100ci\u2fc0\u2fc5r;\uc000\ud835\udcc5;\u43c8ncsp;\u6008\u0300fiopsu\u2fda\u22e2\u2fdf\u2fe5\u2feb\u2ff1r;\uc000\ud835\udd2epf;\uc000\ud835\udd62rime;\u6057cr;\uc000\ud835\udcc6\u0180aeo\u2ff8\u3009\u3013t\u0100ei\u2ffe\u3005rnion\xf3\u06b0nt;\u6a16st\u0100;e\u3010\u3011\u403f\xf1\u1f19\xf4\u0f14\u0a80ABHabcdefhilmnoprstux\u3040\u3051\u3055\u3059\u30e0\u310e\u312b\u3147\u3162\u3172\u318e\u3206\u3215\u3224\u3229\u3258\u326e\u3272\u3290\u32b0\u32b7\u0180art\u3047\u304a\u304cr\xf2\u10b3\xf2\u03ddail;\u691car\xf2\u1c65ar;\u6964\u0380cdenqrt\u3068\u3075\u3078\u307f\u308f\u3094\u30cc\u0100eu\u306d\u3071;\uc000\u223d\u0331te;\u4155i\xe3\u116emptyv;\u69b3g\u0200;del\u0fd1\u3089\u308b\u308d;\u6992;\u69a5\xe5\u0fd1uo\u803b\xbb\u40bbr\u0580;abcfhlpstw\u0fdc\u30ac\u30af\u30b7\u30b9\u30bc\u30be\u30c0\u30c3\u30c7\u30cap;\u6975\u0100;f\u0fe0\u30b4s;\u6920;\u6933s;\u691e\xeb\u225d\xf0\u272el;\u6945im;\u6974l;\u61a3;\u619d\u0100ai\u30d1\u30d5il;\u691ao\u0100;n\u30db\u30dc\u6236al\xf3\u0f1e\u0180abr\u30e7\u30ea\u30eer\xf2\u17e5rk;\u6773\u0100ak\u30f3\u30fdc\u0100ek\u30f9\u30fb;\u407d;\u405d\u0100es\u3102\u3104;\u698cl\u0100du\u310a\u310c;\u698e;\u6990\u0200aeuy\u3117\u311c\u3127\u3129ron;\u4159\u0100di\u3121\u3125il;\u4157\xec\u0ff2\xe2\u30fa;\u4440\u0200clqs\u3134\u3137\u313d\u3144a;\u6937dhar;\u6969uo\u0100;r\u020e\u020dh;\u61b3\u0180acg\u314e\u315f\u0f44l\u0200;ips\u0f78\u3158\u315b\u109cn\xe5\u10bbar\xf4\u0fa9t;\u65ad\u0180ilr\u3169\u1023\u316esht;\u697d;\uc000\ud835\udd2f\u0100ao\u3177\u3186r\u0100du\u317d\u317f\xbb\u047b\u0100;l\u1091\u3184;\u696c\u0100;v\u318b\u318c\u43c1;\u43f1\u0180gns\u3195\u31f9\u31fcht\u0300ahlrst\u31a4\u31b0\u31c2\u31d8\u31e4\u31eerrow\u0100;t\u0fdc\u31ada\xe9\u30c8arpoon\u0100du\u31bb\u31bfow\xee\u317ep\xbb\u1092eft\u0100ah\u31ca\u31d0rrow\xf3\u0feaarpoon\xf3\u0551ightarrows;\u61c9quigarro\xf7\u30cbhreetimes;\u62ccg;\u42daingdotse\xf1\u1f32\u0180ahm\u320d\u3210\u3213r\xf2\u0feaa\xf2\u0551;\u600foust\u0100;a\u321e\u321f\u63b1che\xbb\u321fmid;\u6aee\u0200abpt\u3232\u323d\u3240\u3252\u0100nr\u3237\u323ag;\u67edr;\u61fer\xeb\u1003\u0180afl\u3247\u324a\u324er;\u6986;\uc000\ud835\udd63us;\u6a2eimes;\u6a35\u0100ap\u325d\u3267r\u0100;g\u3263\u3264\u4029t;\u6994olint;\u6a12ar\xf2\u31e3\u0200achq\u327b\u3280\u10bc\u3285quo;\u603ar;\uc000\ud835\udcc7\u0100bu\u30fb\u328ao\u0100;r\u0214\u0213\u0180hir\u3297\u329b\u32a0re\xe5\u31f8mes;\u62cai\u0200;efl\u32aa\u1059\u1821\u32ab\u65b9tri;\u69celuhar;\u6968;\u611e\u0d61\u32d5\u32db\u32df\u332c\u3338\u3371\0\u337a\u33a4\0\0\u33ec\u33f0\0\u3428\u3448\u345a\u34ad\u34b1\u34ca\u34f1\0\u3616\0\0\u3633cute;\u415bqu\xef\u27ba\u0500;Eaceinpsy\u11ed\u32f3\u32f5\u32ff\u3302\u330b\u330f\u331f\u3326\u3329;\u6ab4\u01f0\u32fa\0\u32fc;\u6ab8on;\u4161u\xe5\u11fe\u0100;d\u11f3\u3307il;\u415frc;\u415d\u0180Eas\u3316\u3318\u331b;\u6ab6p;\u6abaim;\u62e9olint;\u6a13i\xed\u1204;\u4441ot\u0180;be\u3334\u1d47\u3335\u62c5;\u6a66\u0380Aacmstx\u3346\u334a\u3357\u335b\u335e\u3363\u336drr;\u61d8r\u0100hr\u3350\u3352\xeb\u2228\u0100;o\u0a36\u0a34t\u803b\xa7\u40a7i;\u403bwar;\u6929m\u0100in\u3369\xf0nu\xf3\xf1t;\u6736r\u0100;o\u3376\u2055\uc000\ud835\udd30\u0200acoy\u3382\u3386\u3391\u33a0rp;\u666f\u0100hy\u338b\u338fcy;\u4449;\u4448rt\u026d\u3399\0\0\u339ci\xe4\u1464ara\xec\u2e6f\u803b\xad\u40ad\u0100gm\u33a8\u33b4ma\u0180;fv\u33b1\u33b2\u33b2\u43c3;\u43c2\u0400;deglnpr\u12ab\u33c5\u33c9\u33ce\u33d6\u33de\u33e1\u33e6ot;\u6a6a\u0100;q\u12b1\u12b0\u0100;E\u33d3\u33d4\u6a9e;\u6aa0\u0100;E\u33db\u33dc\u6a9d;\u6a9fe;\u6246lus;\u6a24arr;\u6972ar\xf2\u113d\u0200aeit\u33f8\u3408\u340f\u3417\u0100ls\u33fd\u3404lsetm\xe9\u336ahp;\u6a33parsl;\u69e4\u0100dl\u1463\u3414e;\u6323\u0100;e\u341c\u341d\u6aaa\u0100;s\u3422\u3423\u6aac;\uc000\u2aac\ufe00\u0180flp\u342e\u3433\u3442tcy;\u444c\u0100;b\u3438\u3439\u402f\u0100;a\u343e\u343f\u69c4r;\u633ff;\uc000\ud835\udd64a\u0100dr\u344d\u0402es\u0100;u\u3454\u3455\u6660it\xbb\u3455\u0180csu\u3460\u3479\u349f\u0100au\u3465\u346fp\u0100;s\u1188\u346b;\uc000\u2293\ufe00p\u0100;s\u11b4\u3475;\uc000\u2294\ufe00u\u0100bp\u347f\u348f\u0180;es\u1197\u119c\u3486et\u0100;e\u1197\u348d\xf1\u119d\u0180;es\u11a8\u11ad\u3496et\u0100;e\u11a8\u349d\xf1\u11ae\u0180;af\u117b\u34a6\u05b0r\u0165\u34ab\u05b1\xbb\u117car\xf2\u1148\u0200cemt\u34b9\u34be\u34c2\u34c5r;\uc000\ud835\udcc8tm\xee\xf1i\xec\u3415ar\xe6\u11be\u0100ar\u34ce\u34d5r\u0100;f\u34d4\u17bf\u6606\u0100an\u34da\u34edight\u0100ep\u34e3\u34eapsilo\xee\u1ee0h\xe9\u2eafs\xbb\u2852\u0280bcmnp\u34fb\u355e\u1209\u358b\u358e\u0480;Edemnprs\u350e\u350f\u3511\u3515\u351e\u3523\u352c\u3531\u3536\u6282;\u6ac5ot;\u6abd\u0100;d\u11da\u351aot;\u6ac3ult;\u6ac1\u0100Ee\u3528\u352a;\u6acb;\u628alus;\u6abfarr;\u6979\u0180eiu\u353d\u3552\u3555t\u0180;en\u350e\u3545\u354bq\u0100;q\u11da\u350feq\u0100;q\u352b\u3528m;\u6ac7\u0100bp\u355a\u355c;\u6ad5;\u6ad3c\u0300;acens\u11ed\u356c\u3572\u3579\u357b\u3326ppro\xf8\u32faurlye\xf1\u11fe\xf1\u11f3\u0180aes\u3582\u3588\u331bppro\xf8\u331aq\xf1\u3317g;\u666a\u0680123;Edehlmnps\u35a9\u35ac\u35af\u121c\u35b2\u35b4\u35c0\u35c9\u35d5\u35da\u35df\u35e8\u35ed\u803b\xb9\u40b9\u803b\xb2\u40b2\u803b\xb3\u40b3;\u6ac6\u0100os\u35b9\u35bct;\u6abeub;\u6ad8\u0100;d\u1222\u35c5ot;\u6ac4s\u0100ou\u35cf\u35d2l;\u67c9b;\u6ad7arr;\u697bult;\u6ac2\u0100Ee\u35e4\u35e6;\u6acc;\u628blus;\u6ac0\u0180eiu\u35f4\u3609\u360ct\u0180;en\u121c\u35fc\u3602q\u0100;q\u1222\u35b2eq\u0100;q\u35e7\u35e4m;\u6ac8\u0100bp\u3611\u3613;\u6ad4;\u6ad6\u0180Aan\u361c\u3620\u362drr;\u61d9r\u0100hr\u3626\u3628\xeb\u222e\u0100;o\u0a2b\u0a29war;\u692alig\u803b\xdf\u40df\u0be1\u3651\u365d\u3660\u12ce\u3673\u3679\0\u367e\u36c2\0\0\0\0\0\u36db\u3703\0\u3709\u376c\0\0\0\u3787\u0272\u3656\0\0\u365bget;\u6316;\u43c4r\xeb\u0e5f\u0180aey\u3666\u366b\u3670ron;\u4165dil;\u4163;\u4442lrec;\u6315r;\uc000\ud835\udd31\u0200eiko\u3686\u369d\u36b5\u36bc\u01f2\u368b\0\u3691e\u01004f\u1284\u1281a\u0180;sv\u3698\u3699\u369b\u43b8ym;\u43d1\u0100cn\u36a2\u36b2k\u0100as\u36a8\u36aeppro\xf8\u12c1im\xbb\u12acs\xf0\u129e\u0100as\u36ba\u36ae\xf0\u12c1rn\u803b\xfe\u40fe\u01ec\u031f\u36c6\u22e7es\u8180\xd7;bd\u36cf\u36d0\u36d8\u40d7\u0100;a\u190f\u36d5r;\u6a31;\u6a30\u0180eps\u36e1\u36e3\u3700\xe1\u2a4d\u0200;bcf\u0486\u36ec\u36f0\u36f4ot;\u6336ir;\u6af1\u0100;o\u36f9\u36fc\uc000\ud835\udd65rk;\u6ada\xe1\u3362rime;\u6034\u0180aip\u370f\u3712\u3764d\xe5\u1248\u0380adempst\u3721\u374d\u3740\u3751\u3757\u375c\u375fngle\u0280;dlqr\u3730\u3731\u3736\u3740\u3742\u65b5own\xbb\u1dbbeft\u0100;e\u2800\u373e\xf1\u092e;\u625cight\u0100;e\u32aa\u374b\xf1\u105aot;\u65ecinus;\u6a3alus;\u6a39b;\u69cdime;\u6a3bezium;\u63e2\u0180cht\u3772\u377d\u3781\u0100ry\u3777\u377b;\uc000\ud835\udcc9;\u4446cy;\u445brok;\u4167\u0100io\u378b\u378ex\xf4\u1777head\u0100lr\u3797\u37a0eftarro\xf7\u084fightarrow\xbb\u0f5d\u0900AHabcdfghlmoprstuw\u37d0\u37d3\u37d7\u37e4\u37f0\u37fc\u380e\u381c\u3823\u3834\u3851\u385d\u386b\u38a9\u38cc\u38d2\u38ea\u38f6r\xf2\u03edar;\u6963\u0100cr\u37dc\u37e2ute\u803b\xfa\u40fa\xf2\u1150r\u01e3\u37ea\0\u37edy;\u445eve;\u416d\u0100iy\u37f5\u37farc\u803b\xfb\u40fb;\u4443\u0180abh\u3803\u3806\u380br\xf2\u13adlac;\u4171a\xf2\u13c3\u0100ir\u3813\u3818sht;\u697e;\uc000\ud835\udd32rave\u803b\xf9\u40f9\u0161\u3827\u3831r\u0100lr\u382c\u382e\xbb\u0957\xbb\u1083lk;\u6580\u0100ct\u3839\u384d\u026f\u383f\0\0\u384arn\u0100;e\u3845\u3846\u631cr\xbb\u3846op;\u630fri;\u65f8\u0100al\u3856\u385acr;\u416b\u80bb\xa8\u0349\u0100gp\u3862\u3866on;\u4173f;\uc000\ud835\udd66\u0300adhlsu\u114b\u3878\u387d\u1372\u3891\u38a0own\xe1\u13b3arpoon\u0100lr\u3888\u388cef\xf4\u382digh\xf4\u382fi\u0180;hl\u3899\u389a\u389c\u43c5\xbb\u13faon\xbb\u389aparrows;\u61c8\u0180cit\u38b0\u38c4\u38c8\u026f\u38b6\0\0\u38c1rn\u0100;e\u38bc\u38bd\u631dr\xbb\u38bdop;\u630eng;\u416fri;\u65f9cr;\uc000\ud835\udcca\u0180dir\u38d9\u38dd\u38e2ot;\u62f0lde;\u4169i\u0100;f\u3730\u38e8\xbb\u1813\u0100am\u38ef\u38f2r\xf2\u38a8l\u803b\xfc\u40fcangle;\u69a7\u0780ABDacdeflnoprsz\u391c\u391f\u3929\u392d\u39b5\u39b8\u39bd\u39df\u39e4\u39e8\u39f3\u39f9\u39fd\u3a01\u3a20r\xf2\u03f7ar\u0100;v\u3926\u3927\u6ae8;\u6ae9as\xe8\u03e1\u0100nr\u3932\u3937grt;\u699c\u0380eknprst\u34e3\u3946\u394b\u3952\u395d\u3964\u3996app\xe1\u2415othin\xe7\u1e96\u0180hir\u34eb\u2ec8\u3959op\xf4\u2fb5\u0100;h\u13b7\u3962\xef\u318d\u0100iu\u3969\u396dgm\xe1\u33b3\u0100bp\u3972\u3984setneq\u0100;q\u397d\u3980\uc000\u228a\ufe00;\uc000\u2acb\ufe00setneq\u0100;q\u398f\u3992\uc000\u228b\ufe00;\uc000\u2acc\ufe00\u0100hr\u399b\u399fet\xe1\u369ciangle\u0100lr\u39aa\u39afeft\xbb\u0925ight\xbb\u1051y;\u4432ash\xbb\u1036\u0180elr\u39c4\u39d2\u39d7\u0180;be\u2dea\u39cb\u39cfar;\u62bbq;\u625alip;\u62ee\u0100bt\u39dc\u1468a\xf2\u1469r;\uc000\ud835\udd33tr\xe9\u39aesu\u0100bp\u39ef\u39f1\xbb\u0d1c\xbb\u0d59pf;\uc000\ud835\udd67ro\xf0\u0efbtr\xe9\u39b4\u0100cu\u3a06\u3a0br;\uc000\ud835\udccb\u0100bp\u3a10\u3a18n\u0100Ee\u3980\u3a16\xbb\u397en\u0100Ee\u3992\u3a1e\xbb\u3990igzag;\u699a\u0380cefoprs\u3a36\u3a3b\u3a56\u3a5b\u3a54\u3a61\u3a6airc;\u4175\u0100di\u3a40\u3a51\u0100bg\u3a45\u3a49ar;\u6a5fe\u0100;q\u15fa\u3a4f;\u6259erp;\u6118r;\uc000\ud835\udd34pf;\uc000\ud835\udd68\u0100;e\u1479\u3a66at\xe8\u1479cr;\uc000\ud835\udccc\u0ae3\u178e\u3a87\0\u3a8b\0\u3a90\u3a9b\0\0\u3a9d\u3aa8\u3aab\u3aaf\0\0\u3ac3\u3ace\0\u3ad8\u17dc\u17dftr\xe9\u17d1r;\uc000\ud835\udd35\u0100Aa\u3a94\u3a97r\xf2\u03c3r\xf2\u09f6;\u43be\u0100Aa\u3aa1\u3aa4r\xf2\u03b8r\xf2\u09eba\xf0\u2713is;\u62fb\u0180dpt\u17a4\u3ab5\u3abe\u0100fl\u3aba\u17a9;\uc000\ud835\udd69im\xe5\u17b2\u0100Aa\u3ac7\u3acar\xf2\u03cer\xf2\u0a01\u0100cq\u3ad2\u17b8r;\uc000\ud835\udccd\u0100pt\u17d6\u3adcr\xe9\u17d4\u0400acefiosu\u3af0\u3afd\u3b08\u3b0c\u3b11\u3b15\u3b1b\u3b21c\u0100uy\u3af6\u3afbte\u803b\xfd\u40fd;\u444f\u0100iy\u3b02\u3b06rc;\u4177;\u444bn\u803b\xa5\u40a5r;\uc000\ud835\udd36cy;\u4457pf;\uc000\ud835\udd6acr;\uc000\ud835\udcce\u0100cm\u3b26\u3b29y;\u444el\u803b\xff\u40ff\u0500acdefhiosw\u3b42\u3b48\u3b54\u3b58\u3b64\u3b69\u3b6d\u3b74\u3b7a\u3b80cute;\u417a\u0100ay\u3b4d\u3b52ron;\u417e;\u4437ot;\u417c\u0100et\u3b5d\u3b61tr\xe6\u155fa;\u43b6r;\uc000\ud835\udd37cy;\u4436grarr;\u61ddpf;\uc000\ud835\udd6bcr;\uc000\ud835\udccf\u0100jn\u3b85\u3b87;\u600dj;\u600c" + .split("") + .map((c) => c.charCodeAt(0)), +); diff --git a/node_modules/@11ty/eleventy/node_modules/entities/src/generated/decode-data-xml.ts b/node_modules/@11ty/eleventy/node_modules/entities/src/generated/decode-data-xml.ts new file mode 100644 index 0000000..735cf7e --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/src/generated/decode-data-xml.ts @@ -0,0 +1,8 @@ +// Generated using scripts/write-decode-map.ts + +export const xmlDecodeTree: Uint16Array = /* #__PURE__ */ new Uint16Array( + // prettier-ignore + /* #__PURE__ */ "\u0200aglq\t\x15\x18\x1b\u026d\x0f\0\0\x12p;\u4026os;\u4027t;\u403et;\u403cuot;\u4022" + .split("") + .map((c) => c.charCodeAt(0)), +); diff --git a/node_modules/@11ty/eleventy/node_modules/entities/src/generated/encode-html.ts b/node_modules/@11ty/eleventy/node_modules/entities/src/generated/encode-html.ts new file mode 100644 index 0000000..8f00fdc --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/src/generated/encode-html.ts @@ -0,0 +1,17 @@ +// Generated using scripts/write-encode-map.ts + +type EncodeTrieNode = + | string + | { v?: string; n: number | Map; o?: string }; + +function restoreDiff>( + array: T, +): T { + for (let index = 1; index < array.length; index++) { + array[index][0] += array[index - 1][0] + 1; + } + return array; +} + +// prettier-ignore +export const htmlTrie: Map = /* #__PURE__ */ new Map(/* #__PURE__ */restoreDiff([[9," "],[0," "],[22,"!"],[0,"""],[0,"#"],[0,"$"],[0,"%"],[0,"&"],[0,"'"],[0,"("],[0,")"],[0,"*"],[0,"+"],[0,","],[1,"."],[0,"/"],[10,":"],[0,";"],[0,{v:"<",n:8402,o:"<⃒"}],[0,{v:"=",n:8421,o:"=⃥"}],[0,{v:">",n:8402,o:">⃒"}],[0,"?"],[0,"@"],[26,"["],[0,"\"],[0,"]"],[0,"^"],[0,"_"],[0,"`"],[5,{n:106,o:"fj"}],[20,"{"],[0,"|"],[0,"}"],[34," "],[0,"¡"],[0,"¢"],[0,"£"],[0,"¤"],[0,"¥"],[0,"¦"],[0,"§"],[0,"¨"],[0,"©"],[0,"ª"],[0,"«"],[0,"¬"],[0,"­"],[0,"®"],[0,"¯"],[0,"°"],[0,"±"],[0,"²"],[0,"³"],[0,"´"],[0,"µ"],[0,"¶"],[0,"·"],[0,"¸"],[0,"¹"],[0,"º"],[0,"»"],[0,"¼"],[0,"½"],[0,"¾"],[0,"¿"],[0,"À"],[0,"Á"],[0,"Â"],[0,"Ã"],[0,"Ä"],[0,"Å"],[0,"Æ"],[0,"Ç"],[0,"È"],[0,"É"],[0,"Ê"],[0,"Ë"],[0,"Ì"],[0,"Í"],[0,"Î"],[0,"Ï"],[0,"Ð"],[0,"Ñ"],[0,"Ò"],[0,"Ó"],[0,"Ô"],[0,"Õ"],[0,"Ö"],[0,"×"],[0,"Ø"],[0,"Ù"],[0,"Ú"],[0,"Û"],[0,"Ü"],[0,"Ý"],[0,"Þ"],[0,"ß"],[0,"à"],[0,"á"],[0,"â"],[0,"ã"],[0,"ä"],[0,"å"],[0,"æ"],[0,"ç"],[0,"è"],[0,"é"],[0,"ê"],[0,"ë"],[0,"ì"],[0,"í"],[0,"î"],[0,"ï"],[0,"ð"],[0,"ñ"],[0,"ò"],[0,"ó"],[0,"ô"],[0,"õ"],[0,"ö"],[0,"÷"],[0,"ø"],[0,"ù"],[0,"ú"],[0,"û"],[0,"ü"],[0,"ý"],[0,"þ"],[0,"ÿ"],[0,"Ā"],[0,"ā"],[0,"Ă"],[0,"ă"],[0,"Ą"],[0,"ą"],[0,"Ć"],[0,"ć"],[0,"Ĉ"],[0,"ĉ"],[0,"Ċ"],[0,"ċ"],[0,"Č"],[0,"č"],[0,"Ď"],[0,"ď"],[0,"Đ"],[0,"đ"],[0,"Ē"],[0,"ē"],[2,"Ė"],[0,"ė"],[0,"Ę"],[0,"ę"],[0,"Ě"],[0,"ě"],[0,"Ĝ"],[0,"ĝ"],[0,"Ğ"],[0,"ğ"],[0,"Ġ"],[0,"ġ"],[0,"Ģ"],[1,"Ĥ"],[0,"ĥ"],[0,"Ħ"],[0,"ħ"],[0,"Ĩ"],[0,"ĩ"],[0,"Ī"],[0,"ī"],[2,"Į"],[0,"į"],[0,"İ"],[0,"ı"],[0,"IJ"],[0,"ij"],[0,"Ĵ"],[0,"ĵ"],[0,"Ķ"],[0,"ķ"],[0,"ĸ"],[0,"Ĺ"],[0,"ĺ"],[0,"Ļ"],[0,"ļ"],[0,"Ľ"],[0,"ľ"],[0,"Ŀ"],[0,"ŀ"],[0,"Ł"],[0,"ł"],[0,"Ń"],[0,"ń"],[0,"Ņ"],[0,"ņ"],[0,"Ň"],[0,"ň"],[0,"ʼn"],[0,"Ŋ"],[0,"ŋ"],[0,"Ō"],[0,"ō"],[2,"Ő"],[0,"ő"],[0,"Œ"],[0,"œ"],[0,"Ŕ"],[0,"ŕ"],[0,"Ŗ"],[0,"ŗ"],[0,"Ř"],[0,"ř"],[0,"Ś"],[0,"ś"],[0,"Ŝ"],[0,"ŝ"],[0,"Ş"],[0,"ş"],[0,"Š"],[0,"š"],[0,"Ţ"],[0,"ţ"],[0,"Ť"],[0,"ť"],[0,"Ŧ"],[0,"ŧ"],[0,"Ũ"],[0,"ũ"],[0,"Ū"],[0,"ū"],[0,"Ŭ"],[0,"ŭ"],[0,"Ů"],[0,"ů"],[0,"Ű"],[0,"ű"],[0,"Ų"],[0,"ų"],[0,"Ŵ"],[0,"ŵ"],[0,"Ŷ"],[0,"ŷ"],[0,"Ÿ"],[0,"Ź"],[0,"ź"],[0,"Ż"],[0,"ż"],[0,"Ž"],[0,"ž"],[19,"ƒ"],[34,"Ƶ"],[63,"ǵ"],[65,"ȷ"],[142,"ˆ"],[0,"ˇ"],[16,"˘"],[0,"˙"],[0,"˚"],[0,"˛"],[0,"˜"],[0,"˝"],[51,"̑"],[127,"Α"],[0,"Β"],[0,"Γ"],[0,"Δ"],[0,"Ε"],[0,"Ζ"],[0,"Η"],[0,"Θ"],[0,"Ι"],[0,"Κ"],[0,"Λ"],[0,"Μ"],[0,"Ν"],[0,"Ξ"],[0,"Ο"],[0,"Π"],[0,"Ρ"],[1,"Σ"],[0,"Τ"],[0,"Υ"],[0,"Φ"],[0,"Χ"],[0,"Ψ"],[0,"Ω"],[7,"α"],[0,"β"],[0,"γ"],[0,"δ"],[0,"ε"],[0,"ζ"],[0,"η"],[0,"θ"],[0,"ι"],[0,"κ"],[0,"λ"],[0,"μ"],[0,"ν"],[0,"ξ"],[0,"ο"],[0,"π"],[0,"ρ"],[0,"ς"],[0,"σ"],[0,"τ"],[0,"υ"],[0,"φ"],[0,"χ"],[0,"ψ"],[0,"ω"],[7,"ϑ"],[0,"ϒ"],[2,"ϕ"],[0,"ϖ"],[5,"Ϝ"],[0,"ϝ"],[18,"ϰ"],[0,"ϱ"],[3,"ϵ"],[0,"϶"],[10,"Ё"],[0,"Ђ"],[0,"Ѓ"],[0,"Є"],[0,"Ѕ"],[0,"І"],[0,"Ї"],[0,"Ј"],[0,"Љ"],[0,"Њ"],[0,"Ћ"],[0,"Ќ"],[1,"Ў"],[0,"Џ"],[0,"А"],[0,"Б"],[0,"В"],[0,"Г"],[0,"Д"],[0,"Е"],[0,"Ж"],[0,"З"],[0,"И"],[0,"Й"],[0,"К"],[0,"Л"],[0,"М"],[0,"Н"],[0,"О"],[0,"П"],[0,"Р"],[0,"С"],[0,"Т"],[0,"У"],[0,"Ф"],[0,"Х"],[0,"Ц"],[0,"Ч"],[0,"Ш"],[0,"Щ"],[0,"Ъ"],[0,"Ы"],[0,"Ь"],[0,"Э"],[0,"Ю"],[0,"Я"],[0,"а"],[0,"б"],[0,"в"],[0,"г"],[0,"д"],[0,"е"],[0,"ж"],[0,"з"],[0,"и"],[0,"й"],[0,"к"],[0,"л"],[0,"м"],[0,"н"],[0,"о"],[0,"п"],[0,"р"],[0,"с"],[0,"т"],[0,"у"],[0,"ф"],[0,"х"],[0,"ц"],[0,"ч"],[0,"ш"],[0,"щ"],[0,"ъ"],[0,"ы"],[0,"ь"],[0,"э"],[0,"ю"],[0,"я"],[1,"ё"],[0,"ђ"],[0,"ѓ"],[0,"є"],[0,"ѕ"],[0,"і"],[0,"ї"],[0,"ј"],[0,"љ"],[0,"њ"],[0,"ћ"],[0,"ќ"],[1,"ў"],[0,"џ"],[7074," "],[0," "],[0," "],[0," "],[1," "],[0," "],[0," "],[0," "],[0,"​"],[0,"‌"],[0,"‍"],[0,"‎"],[0,"‏"],[0,"‐"],[2,"–"],[0,"—"],[0,"―"],[0,"‖"],[1,"‘"],[0,"’"],[0,"‚"],[1,"“"],[0,"”"],[0,"„"],[1,"†"],[0,"‡"],[0,"•"],[2,"‥"],[0,"…"],[9,"‰"],[0,"‱"],[0,"′"],[0,"″"],[0,"‴"],[0,"‵"],[3,"‹"],[0,"›"],[3,"‾"],[2,"⁁"],[1,"⁃"],[0,"⁄"],[10,"⁏"],[7,"⁗"],[7,{v:" ",n:8202,o:"  "}],[0,"⁠"],[0,"⁡"],[0,"⁢"],[0,"⁣"],[72,"€"],[46,"⃛"],[0,"⃜"],[37,"ℂ"],[2,"℅"],[4,"ℊ"],[0,"ℋ"],[0,"ℌ"],[0,"ℍ"],[0,"ℎ"],[0,"ℏ"],[0,"ℐ"],[0,"ℑ"],[0,"ℒ"],[0,"ℓ"],[1,"ℕ"],[0,"№"],[0,"℗"],[0,"℘"],[0,"ℙ"],[0,"ℚ"],[0,"ℛ"],[0,"ℜ"],[0,"ℝ"],[0,"℞"],[3,"™"],[1,"ℤ"],[2,"℧"],[0,"ℨ"],[0,"℩"],[2,"ℬ"],[0,"ℭ"],[1,"ℯ"],[0,"ℰ"],[0,"ℱ"],[1,"ℳ"],[0,"ℴ"],[0,"ℵ"],[0,"ℶ"],[0,"ℷ"],[0,"ℸ"],[12,"ⅅ"],[0,"ⅆ"],[0,"ⅇ"],[0,"ⅈ"],[10,"⅓"],[0,"⅔"],[0,"⅕"],[0,"⅖"],[0,"⅗"],[0,"⅘"],[0,"⅙"],[0,"⅚"],[0,"⅛"],[0,"⅜"],[0,"⅝"],[0,"⅞"],[49,"←"],[0,"↑"],[0,"→"],[0,"↓"],[0,"↔"],[0,"↕"],[0,"↖"],[0,"↗"],[0,"↘"],[0,"↙"],[0,"↚"],[0,"↛"],[1,{v:"↝",n:824,o:"↝̸"}],[0,"↞"],[0,"↟"],[0,"↠"],[0,"↡"],[0,"↢"],[0,"↣"],[0,"↤"],[0,"↥"],[0,"↦"],[0,"↧"],[1,"↩"],[0,"↪"],[0,"↫"],[0,"↬"],[0,"↭"],[0,"↮"],[1,"↰"],[0,"↱"],[0,"↲"],[0,"↳"],[1,"↵"],[0,"↶"],[0,"↷"],[2,"↺"],[0,"↻"],[0,"↼"],[0,"↽"],[0,"↾"],[0,"↿"],[0,"⇀"],[0,"⇁"],[0,"⇂"],[0,"⇃"],[0,"⇄"],[0,"⇅"],[0,"⇆"],[0,"⇇"],[0,"⇈"],[0,"⇉"],[0,"⇊"],[0,"⇋"],[0,"⇌"],[0,"⇍"],[0,"⇎"],[0,"⇏"],[0,"⇐"],[0,"⇑"],[0,"⇒"],[0,"⇓"],[0,"⇔"],[0,"⇕"],[0,"⇖"],[0,"⇗"],[0,"⇘"],[0,"⇙"],[0,"⇚"],[0,"⇛"],[1,"⇝"],[6,"⇤"],[0,"⇥"],[15,"⇵"],[7,"⇽"],[0,"⇾"],[0,"⇿"],[0,"∀"],[0,"∁"],[0,{v:"∂",n:824,o:"∂̸"}],[0,"∃"],[0,"∄"],[0,"∅"],[1,"∇"],[0,"∈"],[0,"∉"],[1,"∋"],[0,"∌"],[2,"∏"],[0,"∐"],[0,"∑"],[0,"−"],[0,"∓"],[0,"∔"],[1,"∖"],[0,"∗"],[0,"∘"],[1,"√"],[2,"∝"],[0,"∞"],[0,"∟"],[0,{v:"∠",n:8402,o:"∠⃒"}],[0,"∡"],[0,"∢"],[0,"∣"],[0,"∤"],[0,"∥"],[0,"∦"],[0,"∧"],[0,"∨"],[0,{v:"∩",n:65024,o:"∩︀"}],[0,{v:"∪",n:65024,o:"∪︀"}],[0,"∫"],[0,"∬"],[0,"∭"],[0,"∮"],[0,"∯"],[0,"∰"],[0,"∱"],[0,"∲"],[0,"∳"],[0,"∴"],[0,"∵"],[0,"∶"],[0,"∷"],[0,"∸"],[1,"∺"],[0,"∻"],[0,{v:"∼",n:8402,o:"∼⃒"}],[0,{v:"∽",n:817,o:"∽̱"}],[0,{v:"∾",n:819,o:"∾̳"}],[0,"∿"],[0,"≀"],[0,"≁"],[0,{v:"≂",n:824,o:"≂̸"}],[0,"≃"],[0,"≄"],[0,"≅"],[0,"≆"],[0,"≇"],[0,"≈"],[0,"≉"],[0,"≊"],[0,{v:"≋",n:824,o:"≋̸"}],[0,"≌"],[0,{v:"≍",n:8402,o:"≍⃒"}],[0,{v:"≎",n:824,o:"≎̸"}],[0,{v:"≏",n:824,o:"≏̸"}],[0,{v:"≐",n:824,o:"≐̸"}],[0,"≑"],[0,"≒"],[0,"≓"],[0,"≔"],[0,"≕"],[0,"≖"],[0,"≗"],[1,"≙"],[0,"≚"],[1,"≜"],[2,"≟"],[0,"≠"],[0,{v:"≡",n:8421,o:"≡⃥"}],[0,"≢"],[1,{v:"≤",n:8402,o:"≤⃒"}],[0,{v:"≥",n:8402,o:"≥⃒"}],[0,{v:"≦",n:824,o:"≦̸"}],[0,{v:"≧",n:824,o:"≧̸"}],[0,{v:"≨",n:65024,o:"≨︀"}],[0,{v:"≩",n:65024,o:"≩︀"}],[0,{v:"≪",n:/* #__PURE__ */ new Map(/* #__PURE__ */restoreDiff([[824,"≪̸"],[7577,"≪⃒"]]))}],[0,{v:"≫",n:/* #__PURE__ */ new Map(/* #__PURE__ */restoreDiff([[824,"≫̸"],[7577,"≫⃒"]]))}],[0,"≬"],[0,"≭"],[0,"≮"],[0,"≯"],[0,"≰"],[0,"≱"],[0,"≲"],[0,"≳"],[0,"≴"],[0,"≵"],[0,"≶"],[0,"≷"],[0,"≸"],[0,"≹"],[0,"≺"],[0,"≻"],[0,"≼"],[0,"≽"],[0,"≾"],[0,{v:"≿",n:824,o:"≿̸"}],[0,"⊀"],[0,"⊁"],[0,{v:"⊂",n:8402,o:"⊂⃒"}],[0,{v:"⊃",n:8402,o:"⊃⃒"}],[0,"⊄"],[0,"⊅"],[0,"⊆"],[0,"⊇"],[0,"⊈"],[0,"⊉"],[0,{v:"⊊",n:65024,o:"⊊︀"}],[0,{v:"⊋",n:65024,o:"⊋︀"}],[1,"⊍"],[0,"⊎"],[0,{v:"⊏",n:824,o:"⊏̸"}],[0,{v:"⊐",n:824,o:"⊐̸"}],[0,"⊑"],[0,"⊒"],[0,{v:"⊓",n:65024,o:"⊓︀"}],[0,{v:"⊔",n:65024,o:"⊔︀"}],[0,"⊕"],[0,"⊖"],[0,"⊗"],[0,"⊘"],[0,"⊙"],[0,"⊚"],[0,"⊛"],[1,"⊝"],[0,"⊞"],[0,"⊟"],[0,"⊠"],[0,"⊡"],[0,"⊢"],[0,"⊣"],[0,"⊤"],[0,"⊥"],[1,"⊧"],[0,"⊨"],[0,"⊩"],[0,"⊪"],[0,"⊫"],[0,"⊬"],[0,"⊭"],[0,"⊮"],[0,"⊯"],[0,"⊰"],[1,"⊲"],[0,"⊳"],[0,{v:"⊴",n:8402,o:"⊴⃒"}],[0,{v:"⊵",n:8402,o:"⊵⃒"}],[0,"⊶"],[0,"⊷"],[0,"⊸"],[0,"⊹"],[0,"⊺"],[0,"⊻"],[1,"⊽"],[0,"⊾"],[0,"⊿"],[0,"⋀"],[0,"⋁"],[0,"⋂"],[0,"⋃"],[0,"⋄"],[0,"⋅"],[0,"⋆"],[0,"⋇"],[0,"⋈"],[0,"⋉"],[0,"⋊"],[0,"⋋"],[0,"⋌"],[0,"⋍"],[0,"⋎"],[0,"⋏"],[0,"⋐"],[0,"⋑"],[0,"⋒"],[0,"⋓"],[0,"⋔"],[0,"⋕"],[0,"⋖"],[0,"⋗"],[0,{v:"⋘",n:824,o:"⋘̸"}],[0,{v:"⋙",n:824,o:"⋙̸"}],[0,{v:"⋚",n:65024,o:"⋚︀"}],[0,{v:"⋛",n:65024,o:"⋛︀"}],[2,"⋞"],[0,"⋟"],[0,"⋠"],[0,"⋡"],[0,"⋢"],[0,"⋣"],[2,"⋦"],[0,"⋧"],[0,"⋨"],[0,"⋩"],[0,"⋪"],[0,"⋫"],[0,"⋬"],[0,"⋭"],[0,"⋮"],[0,"⋯"],[0,"⋰"],[0,"⋱"],[0,"⋲"],[0,"⋳"],[0,"⋴"],[0,{v:"⋵",n:824,o:"⋵̸"}],[0,"⋶"],[0,"⋷"],[1,{v:"⋹",n:824,o:"⋹̸"}],[0,"⋺"],[0,"⋻"],[0,"⋼"],[0,"⋽"],[0,"⋾"],[6,"⌅"],[0,"⌆"],[1,"⌈"],[0,"⌉"],[0,"⌊"],[0,"⌋"],[0,"⌌"],[0,"⌍"],[0,"⌎"],[0,"⌏"],[0,"⌐"],[1,"⌒"],[0,"⌓"],[1,"⌕"],[0,"⌖"],[5,"⌜"],[0,"⌝"],[0,"⌞"],[0,"⌟"],[2,"⌢"],[0,"⌣"],[9,"⌭"],[0,"⌮"],[7,"⌶"],[6,"⌽"],[1,"⌿"],[60,"⍼"],[51,"⎰"],[0,"⎱"],[2,"⎴"],[0,"⎵"],[0,"⎶"],[37,"⏜"],[0,"⏝"],[0,"⏞"],[0,"⏟"],[2,"⏢"],[4,"⏧"],[59,"␣"],[164,"Ⓢ"],[55,"─"],[1,"│"],[9,"┌"],[3,"┐"],[3,"└"],[3,"┘"],[3,"├"],[7,"┤"],[7,"┬"],[7,"┴"],[7,"┼"],[19,"═"],[0,"║"],[0,"╒"],[0,"╓"],[0,"╔"],[0,"╕"],[0,"╖"],[0,"╗"],[0,"╘"],[0,"╙"],[0,"╚"],[0,"╛"],[0,"╜"],[0,"╝"],[0,"╞"],[0,"╟"],[0,"╠"],[0,"╡"],[0,"╢"],[0,"╣"],[0,"╤"],[0,"╥"],[0,"╦"],[0,"╧"],[0,"╨"],[0,"╩"],[0,"╪"],[0,"╫"],[0,"╬"],[19,"▀"],[3,"▄"],[3,"█"],[8,"░"],[0,"▒"],[0,"▓"],[13,"□"],[8,"▪"],[0,"▫"],[1,"▭"],[0,"▮"],[2,"▱"],[1,"△"],[0,"▴"],[0,"▵"],[2,"▸"],[0,"▹"],[3,"▽"],[0,"▾"],[0,"▿"],[2,"◂"],[0,"◃"],[6,"◊"],[0,"○"],[32,"◬"],[2,"◯"],[8,"◸"],[0,"◹"],[0,"◺"],[0,"◻"],[0,"◼"],[8,"★"],[0,"☆"],[7,"☎"],[49,"♀"],[1,"♂"],[29,"♠"],[2,"♣"],[1,"♥"],[0,"♦"],[3,"♪"],[2,"♭"],[0,"♮"],[0,"♯"],[163,"✓"],[3,"✗"],[8,"✠"],[21,"✶"],[33,"❘"],[25,"❲"],[0,"❳"],[84,"⟈"],[0,"⟉"],[28,"⟦"],[0,"⟧"],[0,"⟨"],[0,"⟩"],[0,"⟪"],[0,"⟫"],[0,"⟬"],[0,"⟭"],[7,"⟵"],[0,"⟶"],[0,"⟷"],[0,"⟸"],[0,"⟹"],[0,"⟺"],[1,"⟼"],[2,"⟿"],[258,"⤂"],[0,"⤃"],[0,"⤄"],[0,"⤅"],[6,"⤌"],[0,"⤍"],[0,"⤎"],[0,"⤏"],[0,"⤐"],[0,"⤑"],[0,"⤒"],[0,"⤓"],[2,"⤖"],[2,"⤙"],[0,"⤚"],[0,"⤛"],[0,"⤜"],[0,"⤝"],[0,"⤞"],[0,"⤟"],[0,"⤠"],[2,"⤣"],[0,"⤤"],[0,"⤥"],[0,"⤦"],[0,"⤧"],[0,"⤨"],[0,"⤩"],[0,"⤪"],[8,{v:"⤳",n:824,o:"⤳̸"}],[1,"⤵"],[0,"⤶"],[0,"⤷"],[0,"⤸"],[0,"⤹"],[2,"⤼"],[0,"⤽"],[7,"⥅"],[2,"⥈"],[0,"⥉"],[0,"⥊"],[0,"⥋"],[2,"⥎"],[0,"⥏"],[0,"⥐"],[0,"⥑"],[0,"⥒"],[0,"⥓"],[0,"⥔"],[0,"⥕"],[0,"⥖"],[0,"⥗"],[0,"⥘"],[0,"⥙"],[0,"⥚"],[0,"⥛"],[0,"⥜"],[0,"⥝"],[0,"⥞"],[0,"⥟"],[0,"⥠"],[0,"⥡"],[0,"⥢"],[0,"⥣"],[0,"⥤"],[0,"⥥"],[0,"⥦"],[0,"⥧"],[0,"⥨"],[0,"⥩"],[0,"⥪"],[0,"⥫"],[0,"⥬"],[0,"⥭"],[0,"⥮"],[0,"⥯"],[0,"⥰"],[0,"⥱"],[0,"⥲"],[0,"⥳"],[0,"⥴"],[0,"⥵"],[0,"⥶"],[1,"⥸"],[0,"⥹"],[1,"⥻"],[0,"⥼"],[0,"⥽"],[0,"⥾"],[0,"⥿"],[5,"⦅"],[0,"⦆"],[4,"⦋"],[0,"⦌"],[0,"⦍"],[0,"⦎"],[0,"⦏"],[0,"⦐"],[0,"⦑"],[0,"⦒"],[0,"⦓"],[0,"⦔"],[0,"⦕"],[0,"⦖"],[3,"⦚"],[1,"⦜"],[0,"⦝"],[6,"⦤"],[0,"⦥"],[0,"⦦"],[0,"⦧"],[0,"⦨"],[0,"⦩"],[0,"⦪"],[0,"⦫"],[0,"⦬"],[0,"⦭"],[0,"⦮"],[0,"⦯"],[0,"⦰"],[0,"⦱"],[0,"⦲"],[0,"⦳"],[0,"⦴"],[0,"⦵"],[0,"⦶"],[0,"⦷"],[1,"⦹"],[1,"⦻"],[0,"⦼"],[1,"⦾"],[0,"⦿"],[0,"⧀"],[0,"⧁"],[0,"⧂"],[0,"⧃"],[0,"⧄"],[0,"⧅"],[3,"⧉"],[3,"⧍"],[0,"⧎"],[0,{v:"⧏",n:824,o:"⧏̸"}],[0,{v:"⧐",n:824,o:"⧐̸"}],[11,"⧜"],[0,"⧝"],[0,"⧞"],[4,"⧣"],[0,"⧤"],[0,"⧥"],[5,"⧫"],[8,"⧴"],[1,"⧶"],[9,"⨀"],[0,"⨁"],[0,"⨂"],[1,"⨄"],[1,"⨆"],[5,"⨌"],[0,"⨍"],[2,"⨐"],[0,"⨑"],[0,"⨒"],[0,"⨓"],[0,"⨔"],[0,"⨕"],[0,"⨖"],[0,"⨗"],[10,"⨢"],[0,"⨣"],[0,"⨤"],[0,"⨥"],[0,"⨦"],[0,"⨧"],[1,"⨩"],[0,"⨪"],[2,"⨭"],[0,"⨮"],[0,"⨯"],[0,"⨰"],[0,"⨱"],[1,"⨳"],[0,"⨴"],[0,"⨵"],[0,"⨶"],[0,"⨷"],[0,"⨸"],[0,"⨹"],[0,"⨺"],[0,"⨻"],[0,"⨼"],[2,"⨿"],[0,"⩀"],[1,"⩂"],[0,"⩃"],[0,"⩄"],[0,"⩅"],[0,"⩆"],[0,"⩇"],[0,"⩈"],[0,"⩉"],[0,"⩊"],[0,"⩋"],[0,"⩌"],[0,"⩍"],[2,"⩐"],[2,"⩓"],[0,"⩔"],[0,"⩕"],[0,"⩖"],[0,"⩗"],[0,"⩘"],[1,"⩚"],[0,"⩛"],[0,"⩜"],[0,"⩝"],[1,"⩟"],[6,"⩦"],[3,"⩪"],[2,{v:"⩭",n:824,o:"⩭̸"}],[0,"⩮"],[0,"⩯"],[0,{v:"⩰",n:824,o:"⩰̸"}],[0,"⩱"],[0,"⩲"],[0,"⩳"],[0,"⩴"],[0,"⩵"],[1,"⩷"],[0,"⩸"],[0,"⩹"],[0,"⩺"],[0,"⩻"],[0,"⩼"],[0,{v:"⩽",n:824,o:"⩽̸"}],[0,{v:"⩾",n:824,o:"⩾̸"}],[0,"⩿"],[0,"⪀"],[0,"⪁"],[0,"⪂"],[0,"⪃"],[0,"⪄"],[0,"⪅"],[0,"⪆"],[0,"⪇"],[0,"⪈"],[0,"⪉"],[0,"⪊"],[0,"⪋"],[0,"⪌"],[0,"⪍"],[0,"⪎"],[0,"⪏"],[0,"⪐"],[0,"⪑"],[0,"⪒"],[0,"⪓"],[0,"⪔"],[0,"⪕"],[0,"⪖"],[0,"⪗"],[0,"⪘"],[0,"⪙"],[0,"⪚"],[2,"⪝"],[0,"⪞"],[0,"⪟"],[0,"⪠"],[0,{v:"⪡",n:824,o:"⪡̸"}],[0,{v:"⪢",n:824,o:"⪢̸"}],[1,"⪤"],[0,"⪥"],[0,"⪦"],[0,"⪧"],[0,"⪨"],[0,"⪩"],[0,"⪪"],[0,"⪫"],[0,{v:"⪬",n:65024,o:"⪬︀"}],[0,{v:"⪭",n:65024,o:"⪭︀"}],[0,"⪮"],[0,{v:"⪯",n:824,o:"⪯̸"}],[0,{v:"⪰",n:824,o:"⪰̸"}],[2,"⪳"],[0,"⪴"],[0,"⪵"],[0,"⪶"],[0,"⪷"],[0,"⪸"],[0,"⪹"],[0,"⪺"],[0,"⪻"],[0,"⪼"],[0,"⪽"],[0,"⪾"],[0,"⪿"],[0,"⫀"],[0,"⫁"],[0,"⫂"],[0,"⫃"],[0,"⫄"],[0,{v:"⫅",n:824,o:"⫅̸"}],[0,{v:"⫆",n:824,o:"⫆̸"}],[0,"⫇"],[0,"⫈"],[2,{v:"⫋",n:65024,o:"⫋︀"}],[0,{v:"⫌",n:65024,o:"⫌︀"}],[2,"⫏"],[0,"⫐"],[0,"⫑"],[0,"⫒"],[0,"⫓"],[0,"⫔"],[0,"⫕"],[0,"⫖"],[0,"⫗"],[0,"⫘"],[0,"⫙"],[0,"⫚"],[0,"⫛"],[8,"⫤"],[1,"⫦"],[0,"⫧"],[0,"⫨"],[0,"⫩"],[1,"⫫"],[0,"⫬"],[0,"⫭"],[0,"⫮"],[0,"⫯"],[0,"⫰"],[0,"⫱"],[0,"⫲"],[0,"⫳"],[9,{v:"⫽",n:8421,o:"⫽⃥"}],[44343,{n:/* #__PURE__ */ new Map(/* #__PURE__ */restoreDiff([[56476,"𝒜"],[1,"𝒞"],[0,"𝒟"],[2,"𝒢"],[2,"𝒥"],[0,"𝒦"],[2,"𝒩"],[0,"𝒪"],[0,"𝒫"],[0,"𝒬"],[1,"𝒮"],[0,"𝒯"],[0,"𝒰"],[0,"𝒱"],[0,"𝒲"],[0,"𝒳"],[0,"𝒴"],[0,"𝒵"],[0,"𝒶"],[0,"𝒷"],[0,"𝒸"],[0,"𝒹"],[1,"𝒻"],[1,"𝒽"],[0,"𝒾"],[0,"𝒿"],[0,"𝓀"],[0,"𝓁"],[0,"𝓂"],[0,"𝓃"],[1,"𝓅"],[0,"𝓆"],[0,"𝓇"],[0,"𝓈"],[0,"𝓉"],[0,"𝓊"],[0,"𝓋"],[0,"𝓌"],[0,"𝓍"],[0,"𝓎"],[0,"𝓏"],[52,"𝔄"],[0,"𝔅"],[1,"𝔇"],[0,"𝔈"],[0,"𝔉"],[0,"𝔊"],[2,"𝔍"],[0,"𝔎"],[0,"𝔏"],[0,"𝔐"],[0,"𝔑"],[0,"𝔒"],[0,"𝔓"],[0,"𝔔"],[1,"𝔖"],[0,"𝔗"],[0,"𝔘"],[0,"𝔙"],[0,"𝔚"],[0,"𝔛"],[0,"𝔜"],[1,"𝔞"],[0,"𝔟"],[0,"𝔠"],[0,"𝔡"],[0,"𝔢"],[0,"𝔣"],[0,"𝔤"],[0,"𝔥"],[0,"𝔦"],[0,"𝔧"],[0,"𝔨"],[0,"𝔩"],[0,"𝔪"],[0,"𝔫"],[0,"𝔬"],[0,"𝔭"],[0,"𝔮"],[0,"𝔯"],[0,"𝔰"],[0,"𝔱"],[0,"𝔲"],[0,"𝔳"],[0,"𝔴"],[0,"𝔵"],[0,"𝔶"],[0,"𝔷"],[0,"𝔸"],[0,"𝔹"],[1,"𝔻"],[0,"𝔼"],[0,"𝔽"],[0,"𝔾"],[1,"𝕀"],[0,"𝕁"],[0,"𝕂"],[0,"𝕃"],[0,"𝕄"],[1,"𝕆"],[3,"𝕊"],[0,"𝕋"],[0,"𝕌"],[0,"𝕍"],[0,"𝕎"],[0,"𝕏"],[0,"𝕐"],[1,"𝕒"],[0,"𝕓"],[0,"𝕔"],[0,"𝕕"],[0,"𝕖"],[0,"𝕗"],[0,"𝕘"],[0,"𝕙"],[0,"𝕚"],[0,"𝕛"],[0,"𝕜"],[0,"𝕝"],[0,"𝕞"],[0,"𝕟"],[0,"𝕠"],[0,"𝕡"],[0,"𝕢"],[0,"𝕣"],[0,"𝕤"],[0,"𝕥"],[0,"𝕦"],[0,"𝕧"],[0,"𝕨"],[0,"𝕩"],[0,"𝕪"],[0,"𝕫"]]))}],[8906,"ff"],[0,"fi"],[0,"fl"],[0,"ffi"],[0,"ffl"]])); diff --git a/node_modules/@11ty/eleventy/node_modules/entities/src/index.spec.ts b/node_modules/@11ty/eleventy/node_modules/entities/src/index.spec.ts new file mode 100644 index 0000000..eba6c5a --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/src/index.spec.ts @@ -0,0 +1,125 @@ +import { readFileSync } from "node:fs"; +import { describe, it, expect } from "vitest"; +import * as entities from "./index.js"; +import legacy from "../maps/legacy.json" with { type: "json" }; + +const levels = ["xml", "entities"]; + +describe("Documents", () => { + const levelDocuments = levels + .map((name) => new URL(`../maps/${name}.json`, import.meta.url)) + .map((url) => JSON.parse(readFileSync(url, "utf8"))) + .map((document, index) => [index, document]); + + for (const [level, document] of levelDocuments) { + describe("Decode", () => { + it(levels[level], () => { + for (const entity of Object.keys(document)) { + for (let l = level; l < levels.length; l++) { + expect(entities.decode(`&${entity};`, l)).toBe( + document[entity], + ); + expect( + entities.decode(`&${entity};`, { level: l }), + ).toBe(document[entity]); + } + } + }); + }); + + describe("Decode strict", () => { + it(levels[level], () => { + for (const entity of Object.keys(document)) { + for (let l = level; l < levels.length; l++) { + expect(entities.decodeStrict(`&${entity};`, l)).toBe( + document[entity], + ); + expect( + entities.decode(`&${entity};`, { + level: l, + mode: entities.DecodingMode.Strict, + }), + ).toBe(document[entity]); + } + } + }); + }); + + describe("Encode", () => { + it(levels[level], () => { + for (const entity of Object.keys(document)) { + for (let l = level; l < levels.length; l++) { + const encoded = entities.encode(document[entity], l); + const decoded = entities.decode(encoded, l); + expect(decoded).toBe(document[entity]); + } + } + }); + + it("should only encode non-ASCII values if asked", () => + expect( + entities.encode("Great #'s of 🎁", { + level, + mode: entities.EncodingMode.ASCII, + }), + ).toBe("Great #'s of 🎁")); + }); + } + + describe("Legacy", () => { + const legacyMap: Record = legacy; + it("should decode", () => { + for (const entity of Object.keys(legacyMap)) { + expect(entities.decodeHTML(`&${entity}`)).toBe( + legacyMap[entity], + ); + expect( + entities.decodeStrict(`&${entity}`, { + level: entities.EntityLevel.HTML, + mode: entities.DecodingMode.Legacy, + }), + ).toBe(legacyMap[entity]); + } + }); + }); +}); + +const astral = [ + ["1d306", "\uD834\uDF06"], + ["1d11e", "\uD834\uDD1E"], +]; + +const astralSpecial = [ + ["80", "\u20AC"], + ["110000", "\uFFFD"], +]; + +describe("Astral entities", () => { + for (const [c, value] of astral) { + it(`should decode ${value}`, () => + expect(entities.decode(`&#x${c};`)).toBe(value)); + + it(`should encode ${value}`, () => + expect(entities.encode(value)).toBe(`&#x${c};`)); + + it(`should escape ${value}`, () => + expect(entities.escape(value)).toBe(`&#x${c};`)); + } + + for (const [c, value] of astralSpecial) { + it(`should decode special \\u${c}`, () => + expect(entities.decode(`&#x${c};`)).toBe(value)); + } +}); + +describe("Escape", () => { + it("should always decode ASCII chars", () => { + for (let index = 0; index < 0x7f; index++) { + const c = String.fromCharCode(index); + expect(entities.decodeXML(entities.escape(c))).toBe(c); + } + }); + + it("should keep UTF8 characters", () => + expect(entities.escapeUTF8('ß < "ü"')).toBe(`ß < "ü"`)); +}); diff --git a/node_modules/@11ty/eleventy/node_modules/entities/src/index.ts b/node_modules/@11ty/eleventy/node_modules/entities/src/index.ts new file mode 100644 index 0000000..6440562 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/entities/src/index.ts @@ -0,0 +1,188 @@ +import { decodeXML, decodeHTML, DecodingMode } from "./decode.js"; +import { encodeHTML, encodeNonAsciiHTML } from "./encode.js"; +import { + encodeXML, + escapeUTF8, + escapeAttribute, + escapeText, +} from "./escape.js"; + +/** The level of entities to support. */ +export enum EntityLevel { + /** Support only XML entities. */ + XML = 0, + /** Support HTML entities, which are a superset of XML entities. */ + HTML = 1, +} + +export enum EncodingMode { + /** + * The output is UTF-8 encoded. Only characters that need escaping within + * XML will be escaped. + */ + UTF8, + /** + * The output consists only of ASCII characters. Characters that need + * escaping within HTML, and characters that aren't ASCII characters will + * be escaped. + */ + ASCII, + /** + * Encode all characters that have an equivalent entity, as well as all + * characters that are not ASCII characters. + */ + Extensive, + /** + * Encode all characters that have to be escaped in HTML attributes, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + */ + Attribute, + /** + * Encode all characters that have to be escaped in HTML text, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + */ + Text, +} + +export interface DecodingOptions { + /** + * The level of entities to support. + * @default {@link EntityLevel.XML} + */ + level?: EntityLevel; + /** + * Decoding mode. If `Legacy`, will support legacy entities not terminated + * with a semicolon (`;`). + * + * Always `Strict` for XML. For HTML, set this to `true` if you are parsing + * an attribute value. + * + * The deprecated `decodeStrict` function defaults this to `Strict`. + * + * @default {@link DecodingMode.Legacy} + */ + mode?: DecodingMode | undefined; +} + +/** + * Decodes a string with entities. + * + * @param input String to decode. + * @param options Decoding options. + */ +export function decode( + input: string, + options: DecodingOptions | EntityLevel = EntityLevel.XML, +): string { + const level = typeof options === "number" ? options : options.level; + + if (level === EntityLevel.HTML) { + const mode = typeof options === "object" ? options.mode : undefined; + return decodeHTML(input, mode); + } + + return decodeXML(input); +} + +/** + * Decodes a string with entities. Does not allow missing trailing semicolons for entities. + * + * @param input String to decode. + * @param options Decoding options. + * @deprecated Use `decode` with the `mode` set to `Strict`. + */ +export function decodeStrict( + input: string, + options: DecodingOptions | EntityLevel = EntityLevel.XML, +): string { + const normalizedOptions = + typeof options === "number" ? { level: options } : options; + normalizedOptions.mode ??= DecodingMode.Strict; + + return decode(input, normalizedOptions); +} + +/** + * Options for `encode`. + */ +export interface EncodingOptions { + /** + * The level of entities to support. + * @default {@link EntityLevel.XML} + */ + level?: EntityLevel; + /** + * Output format. + * @default {@link EncodingMode.Extensive} + */ + mode?: EncodingMode; +} + +/** + * Encodes a string with entities. + * + * @param input String to encode. + * @param options Encoding options. + */ +export function encode( + input: string, + options: EncodingOptions | EntityLevel = EntityLevel.XML, +): string { + const { mode = EncodingMode.Extensive, level = EntityLevel.XML } = + typeof options === "number" ? { level: options } : options; + + switch (mode) { + case EncodingMode.UTF8: { + return escapeUTF8(input); + } + case EncodingMode.Attribute: { + return escapeAttribute(input); + } + case EncodingMode.Text: { + return escapeText(input); + } + case EncodingMode.ASCII: { + return level === EntityLevel.HTML + ? encodeNonAsciiHTML(input) + : encodeXML(input); + } + // eslint-disable-next-line unicorn/no-useless-switch-case + case EncodingMode.Extensive: + default: { + return level === EntityLevel.HTML + ? encodeHTML(input) + : encodeXML(input); + } + } +} + +export { + encodeXML, + escape, + escapeUTF8, + escapeAttribute, + escapeText, +} from "./escape.js"; + +export { + encodeHTML, + encodeNonAsciiHTML, + // Legacy aliases (deprecated) + encodeHTML as encodeHTML4, + encodeHTML as encodeHTML5, +} from "./encode.js"; + +export { + EntityDecoder, + DecodingMode, + decodeXML, + decodeHTML, + decodeHTMLStrict, + decodeHTMLAttribute, + // Legacy aliases (deprecated) + decodeHTML as decodeHTML4, + decodeHTML as decodeHTML5, + decodeHTMLStrict as decodeHTML4Strict, + decodeHTMLStrict as decodeHTML5Strict, + decodeXML as decodeXMLStrict, +} from "./decode.js"; diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/CHANGELOG.md b/node_modules/@11ty/eleventy/node_modules/js-yaml/CHANGELOG.md new file mode 100644 index 0000000..ff2375e --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/CHANGELOG.md @@ -0,0 +1,616 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + +## [4.1.0] - 2021-04-15 +### Added +- Types are now exported as `yaml.types.XXX`. +- Every type now has `options` property with original arguments kept as they were + (see `yaml.types.int.options` as an example). + +### Changed +- `Schema.extend()` now keeps old type order in case of conflicts + (e.g. Schema.extend([ a, b, c ]).extend([ b, a, d ]) is now ordered as `abcd` instead of `cbad`). + + +## [4.0.0] - 2021-01-03 +### Changed +- Check [migration guide](migrate_v3_to_v4.md) to see details for all breaking changes. +- Breaking: "unsafe" tags `!!js/function`, `!!js/regexp`, `!!js/undefined` are + moved to [js-yaml-js-types](https://github.com/nodeca/js-yaml-js-types) package. +- Breaking: removed `safe*` functions. Use `load`, `loadAll`, `dump` + instead which are all now safe by default. +- `yaml.DEFAULT_SAFE_SCHEMA` and `yaml.DEFAULT_FULL_SCHEMA` are removed, use + `yaml.DEFAULT_SCHEMA` instead. +- `yaml.Schema.create(schema, tags)` is removed, use `schema.extend(tags)` instead. +- `!!binary` now always mapped to `Uint8Array` on load. +- Reduced nesting of `/lib` folder. +- Parse numbers according to YAML 1.2 instead of YAML 1.1 (`01234` is now decimal, + `0o1234` is octal, `1:23` is parsed as string instead of base60). +- `dump()` no longer quotes `:`, `[`, `]`, `(`, `)` except when necessary, #470, #557. +- Line and column in exceptions are now formatted as `(X:Y)` instead of + `at line X, column Y` (also present in compact format), #332. +- Code snippet created in exceptions now contains multiple lines with line numbers. +- `dump()` now serializes `undefined` as `null` in collections and removes keys with + `undefined` in mappings, #571. +- `dump()` with `skipInvalid=true` now serializes invalid items in collections as null. +- Custom tags starting with `!` are now dumped as `!tag` instead of `!`, #576. +- Custom tags starting with `tag:yaml.org,2002:` are now shorthanded using `!!`, #258. + +### Added +- Added `.mjs` (es modules) support. +- Added `quotingType` and `forceQuotes` options for dumper to configure + string literal style, #290, #529. +- Added `styles: { '!!null': 'empty' }` option for dumper + (serializes `{ foo: null }` as "`foo: `"), #570. +- Added `replacer` option (similar to option in JSON.stringify), #339. +- Custom `Tag` can now handle all tags or multiple tags with the same prefix, #385. + +### Fixed +- Astral characters are no longer encoded by `dump()`, #587. +- "duplicate mapping key" exception now points at the correct column, #452. +- Extra commas in flow collections (e.g. `[foo,,bar]`) now throw an exception + instead of producing null, #321. +- `__proto__` key no longer overrides object prototype, #164. +- Removed `bower.json`. +- Tags are now url-decoded in `load()` and url-encoded in `dump()` + (previously usage of custom non-ascii tags may have led to invalid YAML that can't be parsed). +- Anchors now work correctly with empty nodes, #301. +- Fix incorrect parsing of invalid block mapping syntax, #418. +- Throw an error if block sequence/mapping indent contains a tab, #80. + + +## [3.14.1] - 2020-12-07 +### Security +- Fix possible code execution in (already unsafe) `.load()` (in &anchor). + + +## [3.14.0] - 2020-05-22 +### Changed +- Support `safe/loadAll(input, options)` variant of call. +- CI: drop outdated nodejs versions. +- Dev deps bump. + +### Fixed +- Quote `=` in plain scalars #519. +- Check the node type for `!` tag in case user manually specifies it. +- Verify that there are no null-bytes in input. +- Fix wrong quote position when writing condensed flow, #526. + + +## [3.13.1] - 2019-04-05 +### Security +- Fix possible code execution in (already unsafe) `.load()`, #480. + + +## [3.13.0] - 2019-03-20 +### Security +- Security fix: `safeLoad()` can hang when arrays with nested refs + used as key. Now throws exception for nested arrays. #475. + + +## [3.12.2] - 2019-02-26 +### Fixed +- Fix `noArrayIndent` option for root level, #468. + + +## [3.12.1] - 2019-01-05 +### Added +- Added `noArrayIndent` option, #432. + + +## [3.12.0] - 2018-06-02 +### Changed +- Support arrow functions without a block statement, #421. + + +## [3.11.0] - 2018-03-05 +### Added +- Add arrow functions suport for `!!js/function`. + +### Fixed +- Fix dump in bin/octal/hex formats for negative integers, #399. + + +## [3.10.0] - 2017-09-10 +### Fixed +- Fix `condenseFlow` output (quote keys for sure, instead of spaces), #371, #370. +- Dump astrals as codepoints instead of surrogate pair, #368. + + +## [3.9.1] - 2017-07-08 +### Fixed +- Ensure stack is present for custom errors in node 7.+, #351. + + +## [3.9.0] - 2017-07-08 +### Added +- Add `condenseFlow` option (to create pretty URL query params), #346. + +### Fixed +- Support array return from safeLoadAll/loadAll, #350. + + +## [3.8.4] - 2017-05-08 +### Fixed +- Dumper: prevent space after dash for arrays that wrap, #343. + + +## [3.8.3] - 2017-04-05 +### Fixed +- Should not allow numbers to begin and end with underscore, #335. + + +## [3.8.2] - 2017-03-02 +### Fixed +- Fix `!!float 123` (integers) parse, #333. +- Don't allow leading zeros in floats (except 0, 0.xxx). +- Allow positive exponent without sign in floats. + + +## [3.8.1] - 2017-02-07 +### Changed +- Maintenance: update browserified build. + + +## [3.8.0] - 2017-02-07 +### Fixed +- Fix reported position for `duplicated mapping key` errors. + Now points to block start instead of block end. + (#243, thanks to @shockey). + + +## [3.7.0] - 2016-11-12 +### Added +- Support polymorphism for tags (#300, thanks to @monken). + +### Fixed +- Fix parsing of quotes followed by newlines (#304, thanks to @dplepage). + + +## [3.6.1] - 2016-05-11 +### Fixed +- Fix output cut on a pipe, #286. + + +## [3.6.0] - 2016-04-16 +### Fixed +- Dumper rewrite, fix multiple bugs with trailing `\n`. + Big thanks to @aepsilon! +- Loader: fix leading/trailing newlines in block scalars, @aepsilon. + + +## [3.5.5] - 2016-03-17 +### Fixed +- Date parse fix: don't allow dates with on digit in month and day, #268. + + +## [3.5.4] - 2016-03-09 +### Added +- `noCompatMode` for dumper, to disable quoting YAML 1.1 values. + + +## [3.5.3] - 2016-02-11 +### Changed +- Maintenance release. + + +## [3.5.2] - 2016-01-11 +### Changed +- Maintenance: missed comma in bower config. + + +## [3.5.1] - 2016-01-11 +### Changed +- Removed `inherit` dependency, #239. +- Better browserify workaround for esprima load. +- Demo rewrite. + + +## [3.5.0] - 2016-01-10 +### Fixed +- Dumper. Fold strings only, #217. +- Dumper. `norefs` option, to clone linked objects, #229. +- Loader. Throw a warning for duplicate keys, #166. +- Improved browserify support (mark `esprima` & `Buffer` excluded). + + +## [3.4.6] - 2015-11-26 +### Changed +- Use standalone `inherit` to keep browserified files clear. + + +## [3.4.5] - 2015-11-23 +### Added +- Added `lineWidth` option to dumper. + + +## [3.4.4] - 2015-11-21 +### Fixed +- Fixed floats dump (missed dot for scientific format), #220. +- Allow non-printable characters inside quoted scalars, #192. + + +## [3.4.3] - 2015-10-10 +### Changed +- Maintenance release - deps bump (esprima, argparse). + + +## [3.4.2] - 2015-09-09 +### Fixed +- Fixed serialization of duplicated entries in sequences, #205. + Thanks to @vogelsgesang. + + +## [3.4.1] - 2015-09-05 +### Fixed +- Fixed stacktrace handling in generated errors, for browsers (FF/IE). + + +## [3.4.0] - 2015-08-23 +### Changed +- Don't throw on warnings anymore. Use `onWarning` option to catch. +- Throw error on unknown tags (was warning before). +- Reworked internals of error class. + +### Fixed +- Fixed multiline keys dump, #197. Thanks to @tcr. +- Fixed heading line breaks in some scalars (regression). + + +## [3.3.1] - 2015-05-13 +### Added +- Added `.sortKeys` dumper option, thanks to @rjmunro. + +### Fixed +- Fixed astral characters support, #191. + + +## [3.3.0] - 2015-04-26 +### Changed +- Significantly improved long strings formatting in dumper, thanks to @isaacs. +- Strip BOM if exists. + + +## [3.2.7] - 2015-02-19 +### Changed +- Maintenance release. +- Updated dependencies. +- HISTORY.md -> CHANGELOG.md + + +## [3.2.6] - 2015-02-07 +### Fixed +- Fixed encoding of UTF-16 surrogate pairs. (e.g. "\U0001F431" CAT FACE). +- Fixed demo dates dump (#113, thanks to @Hypercubed). + + +## [3.2.5] - 2014-12-28 +### Fixed +- Fixed resolving of all built-in types on empty nodes. +- Fixed invalid warning on empty lines within quoted scalars and flow collections. +- Fixed bug: Tag on an empty node didn't resolve in some cases. + + +## [3.2.4] - 2014-12-19 +### Fixed +- Fixed resolving of !!null tag on an empty node. + + +## [3.2.3] - 2014-11-08 +### Fixed +- Implemented dumping of objects with circular and cross references. +- Partially fixed aliasing of constructed objects. (see issue #141 for details) + + +## [3.2.2] - 2014-09-07 +### Fixed +- Fixed infinite loop on unindented block scalars. +- Rewritten base64 encode/decode in binary type, to keep code licence clear. + + +## [3.2.1] - 2014-08-24 +### Fixed +- Nothig new. Just fix npm publish error. + + +## [3.2.0] - 2014-08-24 +### Added +- Added input piping support to CLI. + +### Fixed +- Fixed typo, that could cause hand on initial indent (#139). + + +## [3.1.0] - 2014-07-07 +### Changed +- 1.5x-2x speed boost. +- Removed deprecated `require('xxx.yml')` support. +- Significant code cleanup and refactoring. +- Internal API changed. If you used custom types - see updated examples. + Others are not affected. +- Even if the input string has no trailing line break character, + it will be parsed as if it has one. +- Added benchmark scripts. +- Moved bower files to /dist folder +- Bugfixes. + + +## [3.0.2] - 2014-02-27 +### Fixed +- Fixed bug: "constructor" string parsed as `null`. + + +## [3.0.1] - 2013-12-22 +### Fixed +- Fixed parsing of literal scalars. (issue #108) +- Prevented adding unnecessary spaces in object dumps. (issue #68) +- Fixed dumping of objects with very long (> 1024 in length) keys. + + +## [3.0.0] - 2013-12-16 +### Changed +- Refactored code. Changed API for custom types. +- Removed output colors in CLI, dump json by default. +- Removed big dependencies from browser version (esprima, buffer). Load `esprima` manually, if `!!js/function` needed. `!!bin` now returns Array in browser +- AMD support. +- Don't quote dumped strings because of `-` & `?` (if not first char). +- __Deprecated__ loading yaml files via `require()`, as not recommended + behaviour for node. + + +## [2.1.3] - 2013-10-16 +### Fixed +- Fix wrong loading of empty block scalars. + + +## [2.1.2] - 2013-10-07 +### Fixed +- Fix unwanted line breaks in folded scalars. + + +## [2.1.1] - 2013-10-02 +### Fixed +- Dumper now respects deprecated booleans syntax from YAML 1.0/1.1 +- Fixed reader bug in JSON-like sequences/mappings. + + +## [2.1.0] - 2013-06-05 +### Added +- Add standard YAML schemas: Failsafe (`FAILSAFE_SCHEMA`), + JSON (`JSON_SCHEMA`) and Core (`CORE_SCHEMA`). +- Add `skipInvalid` dumper option. + +### Changed +- Rename `DEFAULT_SCHEMA` to `DEFAULT_FULL_SCHEMA` + and `SAFE_SCHEMA` to `DEFAULT_SAFE_SCHEMA`. +- Use `safeLoad` for `require` extension. + +### Fixed +- Bug fix: export `NIL` constant from the public interface. + + +## [2.0.5] - 2013-04-26 +### Security +- Close security issue in !!js/function constructor. + Big thanks to @nealpoole for security audit. + + +## [2.0.4] - 2013-04-08 +### Changed +- Updated .npmignore to reduce package size + + +## [2.0.3] - 2013-02-26 +### Fixed +- Fixed dumping of empty arrays ans objects. ([] and {} instead of null) + + +## [2.0.2] - 2013-02-15 +### Fixed +- Fixed input validation: tabs are printable characters. + + +## [2.0.1] - 2013-02-09 +### Fixed +- Fixed error, when options not passed to function cass + + +## [2.0.0] - 2013-02-09 +### Changed +- Full rewrite. New architecture. Fast one-stage parsing. +- Changed custom types API. +- Added YAML dumper. + + +## [1.0.3] - 2012-11-05 +### Fixed +- Fixed utf-8 files loading. + + +## [1.0.2] - 2012-08-02 +### Fixed +- Pull out hand-written shims. Use ES5-Shims for old browsers support. See #44. +- Fix timstamps incorectly parsed in local time when no time part specified. + + +## [1.0.1] - 2012-07-07 +### Fixed +- Fixes `TypeError: 'undefined' is not an object` under Safari. Thanks Phuong. +- Fix timestamps incorrectly parsed in local time. Thanks @caolan. Closes #46. + + +## [1.0.0] - 2012-07-01 +### Changed +- `y`, `yes`, `n`, `no`, `on`, `off` are not converted to Booleans anymore. + Fixes #42. +- `require(filename)` now returns a single document and throws an Error if + file contains more than one document. +- CLI was merged back from js-yaml.bin + + +## [0.3.7] - 2012-02-28 +### Fixed +- Fix export of `addConstructor()`. Closes #39. + + +## [0.3.6] - 2012-02-22 +### Changed +- Removed AMD parts - too buggy to use. Need help to rewrite from scratch + +### Fixed +- Removed YUI compressor warning (renamed `double` variable). Closes #40. + + +## [0.3.5] - 2012-01-10 +### Fixed +- Workagound for .npmignore fuckup under windows. Thanks to airportyh. + + +## [0.3.4] - 2011-12-24 +### Fixed +- Fixes str[] for oldIEs support. +- Adds better has change support for browserified demo. +- improves compact output of Error. Closes #33. + + +## [0.3.3] - 2011-12-20 +### Added +- adds `compact` stringification of Errors. + +### Changed +- jsyaml executable moved to separate module. + + +## [0.3.2] - 2011-12-16 +### Added +- Added jsyaml executable. +- Added !!js/function support. Closes #12. + +### Fixed +- Fixes ug with block style scalars. Closes #26. +- All sources are passing JSLint now. +- Fixes bug in Safari. Closes #28. +- Fixes bug in Opers. Closes #29. +- Improves browser support. Closes #20. + + +## [0.3.1] - 2011-11-18 +### Added +- Added AMD support for browserified version. +- Added permalinks for online demo YAML snippets. Now we have YPaste service, lol. +- Added !!js/regexp and !!js/undefined types. Partially solves #12. + +### Changed +- Wrapped browserified js-yaml into closure. + +### Fixed +- Fixed the resolvement of non-specific tags. Closes #17. +- Fixed !!set mapping. +- Fixed month parse in dates. Closes #19. + + +## [0.3.0] - 2011-11-09 +### Added +- Added browserified version. Closes #13. +- Added live demo of browserified version. +- Ported some of the PyYAML tests. See #14. + +### Fixed +- Removed JS.Class dependency. Closes #3. +- Fixed timestamp bug when fraction was given. + + +## [0.2.2] - 2011-11-06 +### Fixed +- Fixed crash on docs without ---. Closes #8. +- Fixed multiline string parse +- Fixed tests/comments for using array as key + + +## [0.2.1] - 2011-11-02 +### Fixed +- Fixed short file read (<4k). Closes #9. + + +## [0.2.0] - 2011-11-02 +### Changed +- First public release + + +[4.1.0]: https://github.com/nodeca/js-yaml/compare/4.0.0...4.1.0 +[4.0.0]: https://github.com/nodeca/js-yaml/compare/3.14.0...4.0.0 +[3.14.0]: https://github.com/nodeca/js-yaml/compare/3.13.1...3.14.0 +[3.13.1]: https://github.com/nodeca/js-yaml/compare/3.13.0...3.13.1 +[3.13.0]: https://github.com/nodeca/js-yaml/compare/3.12.2...3.13.0 +[3.12.2]: https://github.com/nodeca/js-yaml/compare/3.12.1...3.12.2 +[3.12.1]: https://github.com/nodeca/js-yaml/compare/3.12.0...3.12.1 +[3.12.0]: https://github.com/nodeca/js-yaml/compare/3.11.0...3.12.0 +[3.11.0]: https://github.com/nodeca/js-yaml/compare/3.10.0...3.11.0 +[3.10.0]: https://github.com/nodeca/js-yaml/compare/3.9.1...3.10.0 +[3.9.1]: https://github.com/nodeca/js-yaml/compare/3.9.0...3.9.1 +[3.9.0]: https://github.com/nodeca/js-yaml/compare/3.8.4...3.9.0 +[3.8.4]: https://github.com/nodeca/js-yaml/compare/3.8.3...3.8.4 +[3.8.3]: https://github.com/nodeca/js-yaml/compare/3.8.2...3.8.3 +[3.8.2]: https://github.com/nodeca/js-yaml/compare/3.8.1...3.8.2 +[3.8.1]: https://github.com/nodeca/js-yaml/compare/3.8.0...3.8.1 +[3.8.0]: https://github.com/nodeca/js-yaml/compare/3.7.0...3.8.0 +[3.7.0]: https://github.com/nodeca/js-yaml/compare/3.6.1...3.7.0 +[3.6.1]: https://github.com/nodeca/js-yaml/compare/3.6.0...3.6.1 +[3.6.0]: https://github.com/nodeca/js-yaml/compare/3.5.5...3.6.0 +[3.5.5]: https://github.com/nodeca/js-yaml/compare/3.5.4...3.5.5 +[3.5.4]: https://github.com/nodeca/js-yaml/compare/3.5.3...3.5.4 +[3.5.3]: https://github.com/nodeca/js-yaml/compare/3.5.2...3.5.3 +[3.5.2]: https://github.com/nodeca/js-yaml/compare/3.5.1...3.5.2 +[3.5.1]: https://github.com/nodeca/js-yaml/compare/3.5.0...3.5.1 +[3.5.0]: https://github.com/nodeca/js-yaml/compare/3.4.6...3.5.0 +[3.4.6]: https://github.com/nodeca/js-yaml/compare/3.4.5...3.4.6 +[3.4.5]: https://github.com/nodeca/js-yaml/compare/3.4.4...3.4.5 +[3.4.4]: https://github.com/nodeca/js-yaml/compare/3.4.3...3.4.4 +[3.4.3]: https://github.com/nodeca/js-yaml/compare/3.4.2...3.4.3 +[3.4.2]: https://github.com/nodeca/js-yaml/compare/3.4.1...3.4.2 +[3.4.1]: https://github.com/nodeca/js-yaml/compare/3.4.0...3.4.1 +[3.4.0]: https://github.com/nodeca/js-yaml/compare/3.3.1...3.4.0 +[3.3.1]: https://github.com/nodeca/js-yaml/compare/3.3.0...3.3.1 +[3.3.0]: https://github.com/nodeca/js-yaml/compare/3.2.7...3.3.0 +[3.2.7]: https://github.com/nodeca/js-yaml/compare/3.2.6...3.2.7 +[3.2.6]: https://github.com/nodeca/js-yaml/compare/3.2.5...3.2.6 +[3.2.5]: https://github.com/nodeca/js-yaml/compare/3.2.4...3.2.5 +[3.2.4]: https://github.com/nodeca/js-yaml/compare/3.2.3...3.2.4 +[3.2.3]: https://github.com/nodeca/js-yaml/compare/3.2.2...3.2.3 +[3.2.2]: https://github.com/nodeca/js-yaml/compare/3.2.1...3.2.2 +[3.2.1]: https://github.com/nodeca/js-yaml/compare/3.2.0...3.2.1 +[3.2.0]: https://github.com/nodeca/js-yaml/compare/3.1.0...3.2.0 +[3.1.0]: https://github.com/nodeca/js-yaml/compare/3.0.2...3.1.0 +[3.0.2]: https://github.com/nodeca/js-yaml/compare/3.0.1...3.0.2 +[3.0.1]: https://github.com/nodeca/js-yaml/compare/3.0.0...3.0.1 +[3.0.0]: https://github.com/nodeca/js-yaml/compare/2.1.3...3.0.0 +[2.1.3]: https://github.com/nodeca/js-yaml/compare/2.1.2...2.1.3 +[2.1.2]: https://github.com/nodeca/js-yaml/compare/2.1.1...2.1.2 +[2.1.1]: https://github.com/nodeca/js-yaml/compare/2.1.0...2.1.1 +[2.1.0]: https://github.com/nodeca/js-yaml/compare/2.0.5...2.1.0 +[2.0.5]: https://github.com/nodeca/js-yaml/compare/2.0.4...2.0.5 +[2.0.4]: https://github.com/nodeca/js-yaml/compare/2.0.3...2.0.4 +[2.0.3]: https://github.com/nodeca/js-yaml/compare/2.0.2...2.0.3 +[2.0.2]: https://github.com/nodeca/js-yaml/compare/2.0.1...2.0.2 +[2.0.1]: https://github.com/nodeca/js-yaml/compare/2.0.0...2.0.1 +[2.0.0]: https://github.com/nodeca/js-yaml/compare/1.0.3...2.0.0 +[1.0.3]: https://github.com/nodeca/js-yaml/compare/1.0.2...1.0.3 +[1.0.2]: https://github.com/nodeca/js-yaml/compare/1.0.1...1.0.2 +[1.0.1]: https://github.com/nodeca/js-yaml/compare/1.0.0...1.0.1 +[1.0.0]: https://github.com/nodeca/js-yaml/compare/0.3.7...1.0.0 +[0.3.7]: https://github.com/nodeca/js-yaml/compare/0.3.6...0.3.7 +[0.3.6]: https://github.com/nodeca/js-yaml/compare/0.3.5...0.3.6 +[0.3.5]: https://github.com/nodeca/js-yaml/compare/0.3.4...0.3.5 +[0.3.4]: https://github.com/nodeca/js-yaml/compare/0.3.3...0.3.4 +[0.3.3]: https://github.com/nodeca/js-yaml/compare/0.3.2...0.3.3 +[0.3.2]: https://github.com/nodeca/js-yaml/compare/0.3.1...0.3.2 +[0.3.1]: https://github.com/nodeca/js-yaml/compare/0.3.0...0.3.1 +[0.3.0]: https://github.com/nodeca/js-yaml/compare/0.2.2...0.3.0 +[0.2.2]: https://github.com/nodeca/js-yaml/compare/0.2.1...0.2.2 +[0.2.1]: https://github.com/nodeca/js-yaml/compare/0.2.0...0.2.1 +[0.2.0]: https://github.com/nodeca/js-yaml/releases/tag/0.2.0 diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/LICENSE b/node_modules/@11ty/eleventy/node_modules/js-yaml/LICENSE new file mode 100644 index 0000000..09d3a29 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/LICENSE @@ -0,0 +1,21 @@ +(The MIT License) + +Copyright (C) 2011-2015 by Vitaly Puzrin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/README.md b/node_modules/@11ty/eleventy/node_modules/js-yaml/README.md new file mode 100644 index 0000000..3cbc4bd --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/README.md @@ -0,0 +1,246 @@ +JS-YAML - YAML 1.2 parser / writer for JavaScript +================================================= + +[![CI](https://github.com/nodeca/js-yaml/workflows/CI/badge.svg?branch=master)](https://github.com/nodeca/js-yaml/actions) +[![NPM version](https://img.shields.io/npm/v/js-yaml.svg)](https://www.npmjs.org/package/js-yaml) + +__[Online Demo](http://nodeca.github.com/js-yaml/)__ + + +This is an implementation of [YAML](http://yaml.org/), a human-friendly data +serialization language. Started as [PyYAML](http://pyyaml.org/) port, it was +completely rewritten from scratch. Now it's very fast, and supports 1.2 spec. + + +Installation +------------ + +### YAML module for node.js + +``` +npm install js-yaml +``` + + +### CLI executable + +If you want to inspect your YAML files from CLI, install js-yaml globally: + +``` +npm install -g js-yaml +``` + +#### Usage + +``` +usage: js-yaml [-h] [-v] [-c] [-t] file + +Positional arguments: + file File with YAML document(s) + +Optional arguments: + -h, --help Show this help message and exit. + -v, --version Show program's version number and exit. + -c, --compact Display errors in compact mode + -t, --trace Show stack trace on error +``` + + +API +--- + +Here we cover the most 'useful' methods. If you need advanced details (creating +your own tags), see [examples](https://github.com/nodeca/js-yaml/tree/master/examples) +for more info. + +``` javascript +const yaml = require('js-yaml'); +const fs = require('fs'); + +// Get document, or throw exception on error +try { + const doc = yaml.load(fs.readFileSync('/home/ixti/example.yml', 'utf8')); + console.log(doc); +} catch (e) { + console.log(e); +} +``` + + +### load (string [ , options ]) + +Parses `string` as single YAML document. Returns either a +plain object, a string, a number, `null` or `undefined`, or throws `YAMLException` on error. By default, does +not support regexps, functions and undefined. + +options: + +- `filename` _(default: null)_ - string to be used as a file path in + error/warning messages. +- `onWarning` _(default: null)_ - function to call on warning messages. + Loader will call this function with an instance of `YAMLException` for each warning. +- `schema` _(default: `DEFAULT_SCHEMA`)_ - specifies a schema to use. + - `FAILSAFE_SCHEMA` - only strings, arrays and plain objects: + http://www.yaml.org/spec/1.2/spec.html#id2802346 + - `JSON_SCHEMA` - all JSON-supported types: + http://www.yaml.org/spec/1.2/spec.html#id2803231 + - `CORE_SCHEMA` - same as `JSON_SCHEMA`: + http://www.yaml.org/spec/1.2/spec.html#id2804923 + - `DEFAULT_SCHEMA` - all supported YAML types. +- `json` _(default: false)_ - compatibility with JSON.parse behaviour. If true, then duplicate keys in a mapping will override values rather than throwing an error. + +NOTE: This function **does not** understand multi-document sources, it throws +exception on those. + +NOTE: JS-YAML **does not** support schema-specific tag resolution restrictions. +So, the JSON schema is not as strictly defined in the YAML specification. +It allows numbers in any notation, use `Null` and `NULL` as `null`, etc. +The core schema also has no such restrictions. It allows binary notation for integers. + + +### loadAll (string [, iterator] [, options ]) + +Same as `load()`, but understands multi-document sources. Applies +`iterator` to each document if specified, or returns array of documents. + +``` javascript +const yaml = require('js-yaml'); + +yaml.loadAll(data, function (doc) { + console.log(doc); +}); +``` + + +### dump (object [ , options ]) + +Serializes `object` as a YAML document. Uses `DEFAULT_SCHEMA`, so it will +throw an exception if you try to dump regexps or functions. However, you can +disable exceptions by setting the `skipInvalid` option to `true`. + +options: + +- `indent` _(default: 2)_ - indentation width to use (in spaces). +- `noArrayIndent` _(default: false)_ - when true, will not add an indentation level to array elements +- `skipInvalid` _(default: false)_ - do not throw on invalid types (like function + in the safe schema) and skip pairs and single values with such types. +- `flowLevel` _(default: -1)_ - specifies level of nesting, when to switch from + block to flow style for collections. -1 means block style everwhere +- `styles` - "tag" => "style" map. Each tag may have own set of styles. +- `schema` _(default: `DEFAULT_SCHEMA`)_ specifies a schema to use. +- `sortKeys` _(default: `false`)_ - if `true`, sort keys when dumping YAML. If a + function, use the function to sort the keys. +- `lineWidth` _(default: `80`)_ - set max line width. Set `-1` for unlimited width. +- `noRefs` _(default: `false`)_ - if `true`, don't convert duplicate objects into references +- `noCompatMode` _(default: `false`)_ - if `true` don't try to be compatible with older + yaml versions. Currently: don't quote "yes", "no" and so on, as required for YAML 1.1 +- `condenseFlow` _(default: `false`)_ - if `true` flow sequences will be condensed, omitting the space between `a, b`. Eg. `'[a,b]'`, and omitting the space between `key: value` and quoting the key. Eg. `'{"a":b}'` Can be useful when using yaml for pretty URL query params as spaces are %-encoded. +- `quotingType` _(`'` or `"`, default: `'`)_ - strings will be quoted using this quoting style. If you specify single quotes, double quotes will still be used for non-printable characters. +- `forceQuotes` _(default: `false`)_ - if `true`, all non-key strings will be quoted even if they normally don't need to. +- `replacer` - callback `function (key, value)` called recursively on each key/value in source object (see `replacer` docs for `JSON.stringify`). + +The following table show availlable styles (e.g. "canonical", +"binary"...) available for each tag (.e.g. !!null, !!int ...). Yaml +output is shown on the right side after `=>` (default setting) or `->`: + +``` none +!!null + "canonical" -> "~" + "lowercase" => "null" + "uppercase" -> "NULL" + "camelcase" -> "Null" + +!!int + "binary" -> "0b1", "0b101010", "0b1110001111010" + "octal" -> "0o1", "0o52", "0o16172" + "decimal" => "1", "42", "7290" + "hexadecimal" -> "0x1", "0x2A", "0x1C7A" + +!!bool + "lowercase" => "true", "false" + "uppercase" -> "TRUE", "FALSE" + "camelcase" -> "True", "False" + +!!float + "lowercase" => ".nan", '.inf' + "uppercase" -> ".NAN", '.INF' + "camelcase" -> ".NaN", '.Inf' +``` + +Example: + +``` javascript +dump(object, { + 'styles': { + '!!null': 'canonical' // dump null as ~ + }, + 'sortKeys': true // sort object keys +}); +``` + +Supported YAML types +-------------------- + +The list of standard YAML tags and corresponding JavaScript types. See also +[YAML tag discussion](http://pyyaml.org/wiki/YAMLTagDiscussion) and +[YAML types repository](http://yaml.org/type/). + +``` +!!null '' # null +!!bool 'yes' # bool +!!int '3...' # number +!!float '3.14...' # number +!!binary '...base64...' # buffer +!!timestamp 'YYYY-...' # date +!!omap [ ... ] # array of key-value pairs +!!pairs [ ... ] # array or array pairs +!!set { ... } # array of objects with given keys and null values +!!str '...' # string +!!seq [ ... ] # array +!!map { ... } # object +``` + +**JavaScript-specific tags** + +See [js-yaml-js-types](https://github.com/nodeca/js-yaml-js-types) for +extra types. + + +Caveats +------- + +Note, that you use arrays or objects as key in JS-YAML. JS does not allow objects +or arrays as keys, and stringifies (by calling `toString()` method) them at the +moment of adding them. + +``` yaml +--- +? [ foo, bar ] +: - baz +? { foo: bar } +: - baz + - baz +``` + +``` javascript +{ "foo,bar": ["baz"], "[object Object]": ["baz", "baz"] } +``` + +Also, reading of properties on implicit block mapping keys is not supported yet. +So, the following YAML document cannot be loaded. + +``` yaml +&anchor foo: + foo: bar + *anchor: duplicate key + baz: bat + *anchor: duplicate key +``` + + +js-yaml for enterprise +---------------------- + +Available as part of the Tidelift Subscription + +The maintainers of js-yaml and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-js-yaml?utm_source=npm-js-yaml&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/bin/js-yaml.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/bin/js-yaml.js new file mode 100755 index 0000000..a182f1a --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/bin/js-yaml.js @@ -0,0 +1,126 @@ +#!/usr/bin/env node + + +'use strict'; + +/*eslint-disable no-console*/ + + +var fs = require('fs'); +var argparse = require('argparse'); +var yaml = require('..'); + + +//////////////////////////////////////////////////////////////////////////////// + + +var cli = new argparse.ArgumentParser({ + prog: 'js-yaml', + add_help: true +}); + +cli.add_argument('-v', '--version', { + action: 'version', + version: require('../package.json').version +}); + +cli.add_argument('-c', '--compact', { + help: 'Display errors in compact mode', + action: 'store_true' +}); + +// deprecated (not needed after we removed output colors) +// option suppressed, but not completely removed for compatibility +cli.add_argument('-j', '--to-json', { + help: argparse.SUPPRESS, + dest: 'json', + action: 'store_true' +}); + +cli.add_argument('-t', '--trace', { + help: 'Show stack trace on error', + action: 'store_true' +}); + +cli.add_argument('file', { + help: 'File to read, utf-8 encoded without BOM', + nargs: '?', + default: '-' +}); + + +//////////////////////////////////////////////////////////////////////////////// + + +var options = cli.parse_args(); + + +//////////////////////////////////////////////////////////////////////////////// + +function readFile(filename, encoding, callback) { + if (options.file === '-') { + // read from stdin + + var chunks = []; + + process.stdin.on('data', function (chunk) { + chunks.push(chunk); + }); + + process.stdin.on('end', function () { + return callback(null, Buffer.concat(chunks).toString(encoding)); + }); + } else { + fs.readFile(filename, encoding, callback); + } +} + +readFile(options.file, 'utf8', function (error, input) { + var output, isYaml; + + if (error) { + if (error.code === 'ENOENT') { + console.error('File not found: ' + options.file); + process.exit(2); + } + + console.error( + options.trace && error.stack || + error.message || + String(error)); + + process.exit(1); + } + + try { + output = JSON.parse(input); + isYaml = false; + } catch (err) { + if (err instanceof SyntaxError) { + try { + output = []; + yaml.loadAll(input, function (doc) { output.push(doc); }, {}); + isYaml = true; + + if (output.length === 0) output = null; + else if (output.length === 1) output = output[0]; + + } catch (e) { + if (options.trace && err.stack) console.error(e.stack); + else console.error(e.toString(options.compact)); + + process.exit(1); + } + } else { + console.error( + options.trace && err.stack || + err.message || + String(err)); + + process.exit(1); + } + } + + if (isYaml) console.log(JSON.stringify(output, null, ' ')); + else console.log(yaml.dump(output)); +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/dist/js-yaml.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/dist/js-yaml.js new file mode 100644 index 0000000..4cc0ddf --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/dist/js-yaml.js @@ -0,0 +1,3874 @@ + +/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jsyaml = {})); +}(this, (function (exports) { 'use strict'; + + function isNothing(subject) { + return (typeof subject === 'undefined') || (subject === null); + } + + + function isObject(subject) { + return (typeof subject === 'object') && (subject !== null); + } + + + function toArray(sequence) { + if (Array.isArray(sequence)) return sequence; + else if (isNothing(sequence)) return []; + + return [ sequence ]; + } + + + function extend(target, source) { + var index, length, key, sourceKeys; + + if (source) { + sourceKeys = Object.keys(source); + + for (index = 0, length = sourceKeys.length; index < length; index += 1) { + key = sourceKeys[index]; + target[key] = source[key]; + } + } + + return target; + } + + + function repeat(string, count) { + var result = '', cycle; + + for (cycle = 0; cycle < count; cycle += 1) { + result += string; + } + + return result; + } + + + function isNegativeZero(number) { + return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number); + } + + + var isNothing_1 = isNothing; + var isObject_1 = isObject; + var toArray_1 = toArray; + var repeat_1 = repeat; + var isNegativeZero_1 = isNegativeZero; + var extend_1 = extend; + + var common = { + isNothing: isNothing_1, + isObject: isObject_1, + toArray: toArray_1, + repeat: repeat_1, + isNegativeZero: isNegativeZero_1, + extend: extend_1 + }; + + // YAML error class. http://stackoverflow.com/questions/8458984 + + + function formatError(exception, compact) { + var where = '', message = exception.reason || '(unknown reason)'; + + if (!exception.mark) return message; + + if (exception.mark.name) { + where += 'in "' + exception.mark.name + '" '; + } + + where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')'; + + if (!compact && exception.mark.snippet) { + where += '\n\n' + exception.mark.snippet; + } + + return message + ' ' + where; + } + + + function YAMLException$1(reason, mark) { + // Super constructor + Error.call(this); + + this.name = 'YAMLException'; + this.reason = reason; + this.mark = mark; + this.message = formatError(this, false); + + // Include stack trace in error object + if (Error.captureStackTrace) { + // Chrome and NodeJS + Error.captureStackTrace(this, this.constructor); + } else { + // FF, IE 10+ and Safari 6+. Fallback for others + this.stack = (new Error()).stack || ''; + } + } + + + // Inherit from Error + YAMLException$1.prototype = Object.create(Error.prototype); + YAMLException$1.prototype.constructor = YAMLException$1; + + + YAMLException$1.prototype.toString = function toString(compact) { + return this.name + ': ' + formatError(this, compact); + }; + + + var exception = YAMLException$1; + + // get snippet for a single line, respecting maxLength + function getLine(buffer, lineStart, lineEnd, position, maxLineLength) { + var head = ''; + var tail = ''; + var maxHalfLength = Math.floor(maxLineLength / 2) - 1; + + if (position - lineStart > maxHalfLength) { + head = ' ... '; + lineStart = position - maxHalfLength + head.length; + } + + if (lineEnd - position > maxHalfLength) { + tail = ' ...'; + lineEnd = position + maxHalfLength - tail.length; + } + + return { + str: head + buffer.slice(lineStart, lineEnd).replace(/\t/g, '→') + tail, + pos: position - lineStart + head.length // relative position + }; + } + + + function padStart(string, max) { + return common.repeat(' ', max - string.length) + string; + } + + + function makeSnippet(mark, options) { + options = Object.create(options || null); + + if (!mark.buffer) return null; + + if (!options.maxLength) options.maxLength = 79; + if (typeof options.indent !== 'number') options.indent = 1; + if (typeof options.linesBefore !== 'number') options.linesBefore = 3; + if (typeof options.linesAfter !== 'number') options.linesAfter = 2; + + var re = /\r?\n|\r|\0/g; + var lineStarts = [ 0 ]; + var lineEnds = []; + var match; + var foundLineNo = -1; + + while ((match = re.exec(mark.buffer))) { + lineEnds.push(match.index); + lineStarts.push(match.index + match[0].length); + + if (mark.position <= match.index && foundLineNo < 0) { + foundLineNo = lineStarts.length - 2; + } + } + + if (foundLineNo < 0) foundLineNo = lineStarts.length - 1; + + var result = '', i, line; + var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length; + var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3); + + for (i = 1; i <= options.linesBefore; i++) { + if (foundLineNo - i < 0) break; + line = getLine( + mark.buffer, + lineStarts[foundLineNo - i], + lineEnds[foundLineNo - i], + mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]), + maxLineLength + ); + result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) + + ' | ' + line.str + '\n' + result; + } + + line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength); + result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) + + ' | ' + line.str + '\n'; + result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\n'; + + for (i = 1; i <= options.linesAfter; i++) { + if (foundLineNo + i >= lineEnds.length) break; + line = getLine( + mark.buffer, + lineStarts[foundLineNo + i], + lineEnds[foundLineNo + i], + mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]), + maxLineLength + ); + result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) + + ' | ' + line.str + '\n'; + } + + return result.replace(/\n$/, ''); + } + + + var snippet = makeSnippet; + + var TYPE_CONSTRUCTOR_OPTIONS = [ + 'kind', + 'multi', + 'resolve', + 'construct', + 'instanceOf', + 'predicate', + 'represent', + 'representName', + 'defaultStyle', + 'styleAliases' + ]; + + var YAML_NODE_KINDS = [ + 'scalar', + 'sequence', + 'mapping' + ]; + + function compileStyleAliases(map) { + var result = {}; + + if (map !== null) { + Object.keys(map).forEach(function (style) { + map[style].forEach(function (alias) { + result[String(alias)] = style; + }); + }); + } + + return result; + } + + function Type$1(tag, options) { + options = options || {}; + + Object.keys(options).forEach(function (name) { + if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { + throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); + } + }); + + // TODO: Add tag format check. + this.options = options; // keep original options in case user wants to extend this type later + this.tag = tag; + this.kind = options['kind'] || null; + this.resolve = options['resolve'] || function () { return true; }; + this.construct = options['construct'] || function (data) { return data; }; + this.instanceOf = options['instanceOf'] || null; + this.predicate = options['predicate'] || null; + this.represent = options['represent'] || null; + this.representName = options['representName'] || null; + this.defaultStyle = options['defaultStyle'] || null; + this.multi = options['multi'] || false; + this.styleAliases = compileStyleAliases(options['styleAliases'] || null); + + if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { + throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); + } + } + + var type = Type$1; + + /*eslint-disable max-len*/ + + + + + + function compileList(schema, name) { + var result = []; + + schema[name].forEach(function (currentType) { + var newIndex = result.length; + + result.forEach(function (previousType, previousIndex) { + if (previousType.tag === currentType.tag && + previousType.kind === currentType.kind && + previousType.multi === currentType.multi) { + + newIndex = previousIndex; + } + }); + + result[newIndex] = currentType; + }); + + return result; + } + + + function compileMap(/* lists... */) { + var result = { + scalar: {}, + sequence: {}, + mapping: {}, + fallback: {}, + multi: { + scalar: [], + sequence: [], + mapping: [], + fallback: [] + } + }, index, length; + + function collectType(type) { + if (type.multi) { + result.multi[type.kind].push(type); + result.multi['fallback'].push(type); + } else { + result[type.kind][type.tag] = result['fallback'][type.tag] = type; + } + } + + for (index = 0, length = arguments.length; index < length; index += 1) { + arguments[index].forEach(collectType); + } + return result; + } + + + function Schema$1(definition) { + return this.extend(definition); + } + + + Schema$1.prototype.extend = function extend(definition) { + var implicit = []; + var explicit = []; + + if (definition instanceof type) { + // Schema.extend(type) + explicit.push(definition); + + } else if (Array.isArray(definition)) { + // Schema.extend([ type1, type2, ... ]) + explicit = explicit.concat(definition); + + } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) { + // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] }) + if (definition.implicit) implicit = implicit.concat(definition.implicit); + if (definition.explicit) explicit = explicit.concat(definition.explicit); + + } else { + throw new exception('Schema.extend argument should be a Type, [ Type ], ' + + 'or a schema definition ({ implicit: [...], explicit: [...] })'); + } + + implicit.forEach(function (type$1) { + if (!(type$1 instanceof type)) { + throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.'); + } + + if (type$1.loadKind && type$1.loadKind !== 'scalar') { + throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.'); + } + + if (type$1.multi) { + throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.'); + } + }); + + explicit.forEach(function (type$1) { + if (!(type$1 instanceof type)) { + throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.'); + } + }); + + var result = Object.create(Schema$1.prototype); + + result.implicit = (this.implicit || []).concat(implicit); + result.explicit = (this.explicit || []).concat(explicit); + + result.compiledImplicit = compileList(result, 'implicit'); + result.compiledExplicit = compileList(result, 'explicit'); + result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit); + + return result; + }; + + + var schema = Schema$1; + + var str = new type('tag:yaml.org,2002:str', { + kind: 'scalar', + construct: function (data) { return data !== null ? data : ''; } + }); + + var seq = new type('tag:yaml.org,2002:seq', { + kind: 'sequence', + construct: function (data) { return data !== null ? data : []; } + }); + + var map = new type('tag:yaml.org,2002:map', { + kind: 'mapping', + construct: function (data) { return data !== null ? data : {}; } + }); + + var failsafe = new schema({ + explicit: [ + str, + seq, + map + ] + }); + + function resolveYamlNull(data) { + if (data === null) return true; + + var max = data.length; + + return (max === 1 && data === '~') || + (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL')); + } + + function constructYamlNull() { + return null; + } + + function isNull(object) { + return object === null; + } + + var _null = new type('tag:yaml.org,2002:null', { + kind: 'scalar', + resolve: resolveYamlNull, + construct: constructYamlNull, + predicate: isNull, + represent: { + canonical: function () { return '~'; }, + lowercase: function () { return 'null'; }, + uppercase: function () { return 'NULL'; }, + camelcase: function () { return 'Null'; }, + empty: function () { return ''; } + }, + defaultStyle: 'lowercase' + }); + + function resolveYamlBoolean(data) { + if (data === null) return false; + + var max = data.length; + + return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) || + (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE')); + } + + function constructYamlBoolean(data) { + return data === 'true' || + data === 'True' || + data === 'TRUE'; + } + + function isBoolean(object) { + return Object.prototype.toString.call(object) === '[object Boolean]'; + } + + var bool = new type('tag:yaml.org,2002:bool', { + kind: 'scalar', + resolve: resolveYamlBoolean, + construct: constructYamlBoolean, + predicate: isBoolean, + represent: { + lowercase: function (object) { return object ? 'true' : 'false'; }, + uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; }, + camelcase: function (object) { return object ? 'True' : 'False'; } + }, + defaultStyle: 'lowercase' + }); + + function isHexCode(c) { + return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) || + ((0x41/* A */ <= c) && (c <= 0x46/* F */)) || + ((0x61/* a */ <= c) && (c <= 0x66/* f */)); + } + + function isOctCode(c) { + return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */)); + } + + function isDecCode(c) { + return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)); + } + + function resolveYamlInteger(data) { + if (data === null) return false; + + var max = data.length, + index = 0, + hasDigits = false, + ch; + + if (!max) return false; + + ch = data[index]; + + // sign + if (ch === '-' || ch === '+') { + ch = data[++index]; + } + + if (ch === '0') { + // 0 + if (index + 1 === max) return true; + ch = data[++index]; + + // base 2, base 8, base 16 + + if (ch === 'b') { + // base 2 + index++; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (ch !== '0' && ch !== '1') return false; + hasDigits = true; + } + return hasDigits && ch !== '_'; + } + + + if (ch === 'x') { + // base 16 + index++; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (!isHexCode(data.charCodeAt(index))) return false; + hasDigits = true; + } + return hasDigits && ch !== '_'; + } + + + if (ch === 'o') { + // base 8 + index++; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (!isOctCode(data.charCodeAt(index))) return false; + hasDigits = true; + } + return hasDigits && ch !== '_'; + } + } + + // base 10 (except 0) + + // value should not start with `_`; + if (ch === '_') return false; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (!isDecCode(data.charCodeAt(index))) { + return false; + } + hasDigits = true; + } + + // Should have digits and should not end with `_` + if (!hasDigits || ch === '_') return false; + + return true; + } + + function constructYamlInteger(data) { + var value = data, sign = 1, ch; + + if (value.indexOf('_') !== -1) { + value = value.replace(/_/g, ''); + } + + ch = value[0]; + + if (ch === '-' || ch === '+') { + if (ch === '-') sign = -1; + value = value.slice(1); + ch = value[0]; + } + + if (value === '0') return 0; + + if (ch === '0') { + if (value[1] === 'b') return sign * parseInt(value.slice(2), 2); + if (value[1] === 'x') return sign * parseInt(value.slice(2), 16); + if (value[1] === 'o') return sign * parseInt(value.slice(2), 8); + } + + return sign * parseInt(value, 10); + } + + function isInteger(object) { + return (Object.prototype.toString.call(object)) === '[object Number]' && + (object % 1 === 0 && !common.isNegativeZero(object)); + } + + var int = new type('tag:yaml.org,2002:int', { + kind: 'scalar', + resolve: resolveYamlInteger, + construct: constructYamlInteger, + predicate: isInteger, + represent: { + binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); }, + octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); }, + decimal: function (obj) { return obj.toString(10); }, + /* eslint-disable max-len */ + hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); } + }, + defaultStyle: 'decimal', + styleAliases: { + binary: [ 2, 'bin' ], + octal: [ 8, 'oct' ], + decimal: [ 10, 'dec' ], + hexadecimal: [ 16, 'hex' ] + } + }); + + var YAML_FLOAT_PATTERN = new RegExp( + // 2.5e4, 2.5 and integers + '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + + // .2e4, .2 + // special case, seems not from spec + '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + + // .inf + '|[-+]?\\.(?:inf|Inf|INF)' + + // .nan + '|\\.(?:nan|NaN|NAN))$'); + + function resolveYamlFloat(data) { + if (data === null) return false; + + if (!YAML_FLOAT_PATTERN.test(data) || + // Quick hack to not allow integers end with `_` + // Probably should update regexp & check speed + data[data.length - 1] === '_') { + return false; + } + + return true; + } + + function constructYamlFloat(data) { + var value, sign; + + value = data.replace(/_/g, '').toLowerCase(); + sign = value[0] === '-' ? -1 : 1; + + if ('+-'.indexOf(value[0]) >= 0) { + value = value.slice(1); + } + + if (value === '.inf') { + return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; + + } else if (value === '.nan') { + return NaN; + } + return sign * parseFloat(value, 10); + } + + + var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; + + function representYamlFloat(object, style) { + var res; + + if (isNaN(object)) { + switch (style) { + case 'lowercase': return '.nan'; + case 'uppercase': return '.NAN'; + case 'camelcase': return '.NaN'; + } + } else if (Number.POSITIVE_INFINITY === object) { + switch (style) { + case 'lowercase': return '.inf'; + case 'uppercase': return '.INF'; + case 'camelcase': return '.Inf'; + } + } else if (Number.NEGATIVE_INFINITY === object) { + switch (style) { + case 'lowercase': return '-.inf'; + case 'uppercase': return '-.INF'; + case 'camelcase': return '-.Inf'; + } + } else if (common.isNegativeZero(object)) { + return '-0.0'; + } + + res = object.toString(10); + + // JS stringifier can build scientific format without dots: 5e-100, + // while YAML requres dot: 5.e-100. Fix it with simple hack + + return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res; + } + + function isFloat(object) { + return (Object.prototype.toString.call(object) === '[object Number]') && + (object % 1 !== 0 || common.isNegativeZero(object)); + } + + var float = new type('tag:yaml.org,2002:float', { + kind: 'scalar', + resolve: resolveYamlFloat, + construct: constructYamlFloat, + predicate: isFloat, + represent: representYamlFloat, + defaultStyle: 'lowercase' + }); + + var json = failsafe.extend({ + implicit: [ + _null, + bool, + int, + float + ] + }); + + var core = json; + + var YAML_DATE_REGEXP = new RegExp( + '^([0-9][0-9][0-9][0-9])' + // [1] year + '-([0-9][0-9])' + // [2] month + '-([0-9][0-9])$'); // [3] day + + var YAML_TIMESTAMP_REGEXP = new RegExp( + '^([0-9][0-9][0-9][0-9])' + // [1] year + '-([0-9][0-9]?)' + // [2] month + '-([0-9][0-9]?)' + // [3] day + '(?:[Tt]|[ \\t]+)' + // ... + '([0-9][0-9]?)' + // [4] hour + ':([0-9][0-9])' + // [5] minute + ':([0-9][0-9])' + // [6] second + '(?:\\.([0-9]*))?' + // [7] fraction + '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour + '(?::([0-9][0-9]))?))?$'); // [11] tz_minute + + function resolveYamlTimestamp(data) { + if (data === null) return false; + if (YAML_DATE_REGEXP.exec(data) !== null) return true; + if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; + return false; + } + + function constructYamlTimestamp(data) { + var match, year, month, day, hour, minute, second, fraction = 0, + delta = null, tz_hour, tz_minute, date; + + match = YAML_DATE_REGEXP.exec(data); + if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); + + if (match === null) throw new Error('Date resolve error'); + + // match: [1] year [2] month [3] day + + year = +(match[1]); + month = +(match[2]) - 1; // JS month starts with 0 + day = +(match[3]); + + if (!match[4]) { // no hour + return new Date(Date.UTC(year, month, day)); + } + + // match: [4] hour [5] minute [6] second [7] fraction + + hour = +(match[4]); + minute = +(match[5]); + second = +(match[6]); + + if (match[7]) { + fraction = match[7].slice(0, 3); + while (fraction.length < 3) { // milli-seconds + fraction += '0'; + } + fraction = +fraction; + } + + // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute + + if (match[9]) { + tz_hour = +(match[10]); + tz_minute = +(match[11] || 0); + delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds + if (match[9] === '-') delta = -delta; + } + + date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); + + if (delta) date.setTime(date.getTime() - delta); + + return date; + } + + function representYamlTimestamp(object /*, style*/) { + return object.toISOString(); + } + + var timestamp = new type('tag:yaml.org,2002:timestamp', { + kind: 'scalar', + resolve: resolveYamlTimestamp, + construct: constructYamlTimestamp, + instanceOf: Date, + represent: representYamlTimestamp + }); + + function resolveYamlMerge(data) { + return data === '<<' || data === null; + } + + var merge = new type('tag:yaml.org,2002:merge', { + kind: 'scalar', + resolve: resolveYamlMerge + }); + + /*eslint-disable no-bitwise*/ + + + + + + // [ 64, 65, 66 ] -> [ padding, CR, LF ] + var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; + + + function resolveYamlBinary(data) { + if (data === null) return false; + + var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP; + + // Convert one by one. + for (idx = 0; idx < max; idx++) { + code = map.indexOf(data.charAt(idx)); + + // Skip CR/LF + if (code > 64) continue; + + // Fail on illegal characters + if (code < 0) return false; + + bitlen += 6; + } + + // If there are any bits left, source was corrupted + return (bitlen % 8) === 0; + } + + function constructYamlBinary(data) { + var idx, tailbits, + input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan + max = input.length, + map = BASE64_MAP, + bits = 0, + result = []; + + // Collect by 6*4 bits (3 bytes) + + for (idx = 0; idx < max; idx++) { + if ((idx % 4 === 0) && idx) { + result.push((bits >> 16) & 0xFF); + result.push((bits >> 8) & 0xFF); + result.push(bits & 0xFF); + } + + bits = (bits << 6) | map.indexOf(input.charAt(idx)); + } + + // Dump tail + + tailbits = (max % 4) * 6; + + if (tailbits === 0) { + result.push((bits >> 16) & 0xFF); + result.push((bits >> 8) & 0xFF); + result.push(bits & 0xFF); + } else if (tailbits === 18) { + result.push((bits >> 10) & 0xFF); + result.push((bits >> 2) & 0xFF); + } else if (tailbits === 12) { + result.push((bits >> 4) & 0xFF); + } + + return new Uint8Array(result); + } + + function representYamlBinary(object /*, style*/) { + var result = '', bits = 0, idx, tail, + max = object.length, + map = BASE64_MAP; + + // Convert every three bytes to 4 ASCII characters. + + for (idx = 0; idx < max; idx++) { + if ((idx % 3 === 0) && idx) { + result += map[(bits >> 18) & 0x3F]; + result += map[(bits >> 12) & 0x3F]; + result += map[(bits >> 6) & 0x3F]; + result += map[bits & 0x3F]; + } + + bits = (bits << 8) + object[idx]; + } + + // Dump tail + + tail = max % 3; + + if (tail === 0) { + result += map[(bits >> 18) & 0x3F]; + result += map[(bits >> 12) & 0x3F]; + result += map[(bits >> 6) & 0x3F]; + result += map[bits & 0x3F]; + } else if (tail === 2) { + result += map[(bits >> 10) & 0x3F]; + result += map[(bits >> 4) & 0x3F]; + result += map[(bits << 2) & 0x3F]; + result += map[64]; + } else if (tail === 1) { + result += map[(bits >> 2) & 0x3F]; + result += map[(bits << 4) & 0x3F]; + result += map[64]; + result += map[64]; + } + + return result; + } + + function isBinary(obj) { + return Object.prototype.toString.call(obj) === '[object Uint8Array]'; + } + + var binary = new type('tag:yaml.org,2002:binary', { + kind: 'scalar', + resolve: resolveYamlBinary, + construct: constructYamlBinary, + predicate: isBinary, + represent: representYamlBinary + }); + + var _hasOwnProperty$3 = Object.prototype.hasOwnProperty; + var _toString$2 = Object.prototype.toString; + + function resolveYamlOmap(data) { + if (data === null) return true; + + var objectKeys = [], index, length, pair, pairKey, pairHasKey, + object = data; + + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + pairHasKey = false; + + if (_toString$2.call(pair) !== '[object Object]') return false; + + for (pairKey in pair) { + if (_hasOwnProperty$3.call(pair, pairKey)) { + if (!pairHasKey) pairHasKey = true; + else return false; + } + } + + if (!pairHasKey) return false; + + if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey); + else return false; + } + + return true; + } + + function constructYamlOmap(data) { + return data !== null ? data : []; + } + + var omap = new type('tag:yaml.org,2002:omap', { + kind: 'sequence', + resolve: resolveYamlOmap, + construct: constructYamlOmap + }); + + var _toString$1 = Object.prototype.toString; + + function resolveYamlPairs(data) { + if (data === null) return true; + + var index, length, pair, keys, result, + object = data; + + result = new Array(object.length); + + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + + if (_toString$1.call(pair) !== '[object Object]') return false; + + keys = Object.keys(pair); + + if (keys.length !== 1) return false; + + result[index] = [ keys[0], pair[keys[0]] ]; + } + + return true; + } + + function constructYamlPairs(data) { + if (data === null) return []; + + var index, length, pair, keys, result, + object = data; + + result = new Array(object.length); + + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + + keys = Object.keys(pair); + + result[index] = [ keys[0], pair[keys[0]] ]; + } + + return result; + } + + var pairs = new type('tag:yaml.org,2002:pairs', { + kind: 'sequence', + resolve: resolveYamlPairs, + construct: constructYamlPairs + }); + + var _hasOwnProperty$2 = Object.prototype.hasOwnProperty; + + function resolveYamlSet(data) { + if (data === null) return true; + + var key, object = data; + + for (key in object) { + if (_hasOwnProperty$2.call(object, key)) { + if (object[key] !== null) return false; + } + } + + return true; + } + + function constructYamlSet(data) { + return data !== null ? data : {}; + } + + var set = new type('tag:yaml.org,2002:set', { + kind: 'mapping', + resolve: resolveYamlSet, + construct: constructYamlSet + }); + + var _default = core.extend({ + implicit: [ + timestamp, + merge + ], + explicit: [ + binary, + omap, + pairs, + set + ] + }); + + /*eslint-disable max-len,no-use-before-define*/ + + + + + + + + var _hasOwnProperty$1 = Object.prototype.hasOwnProperty; + + + var CONTEXT_FLOW_IN = 1; + var CONTEXT_FLOW_OUT = 2; + var CONTEXT_BLOCK_IN = 3; + var CONTEXT_BLOCK_OUT = 4; + + + var CHOMPING_CLIP = 1; + var CHOMPING_STRIP = 2; + var CHOMPING_KEEP = 3; + + + var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; + var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; + var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; + var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; + var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; + + + function _class(obj) { return Object.prototype.toString.call(obj); } + + function is_EOL(c) { + return (c === 0x0A/* LF */) || (c === 0x0D/* CR */); + } + + function is_WHITE_SPACE(c) { + return (c === 0x09/* Tab */) || (c === 0x20/* Space */); + } + + function is_WS_OR_EOL(c) { + return (c === 0x09/* Tab */) || + (c === 0x20/* Space */) || + (c === 0x0A/* LF */) || + (c === 0x0D/* CR */); + } + + function is_FLOW_INDICATOR(c) { + return c === 0x2C/* , */ || + c === 0x5B/* [ */ || + c === 0x5D/* ] */ || + c === 0x7B/* { */ || + c === 0x7D/* } */; + } + + function fromHexCode(c) { + var lc; + + if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { + return c - 0x30; + } + + /*eslint-disable no-bitwise*/ + lc = c | 0x20; + + if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) { + return lc - 0x61 + 10; + } + + return -1; + } + + function escapedHexLen(c) { + if (c === 0x78/* x */) { return 2; } + if (c === 0x75/* u */) { return 4; } + if (c === 0x55/* U */) { return 8; } + return 0; + } + + function fromDecimalCode(c) { + if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { + return c - 0x30; + } + + return -1; + } + + function simpleEscapeSequence(c) { + /* eslint-disable indent */ + return (c === 0x30/* 0 */) ? '\x00' : + (c === 0x61/* a */) ? '\x07' : + (c === 0x62/* b */) ? '\x08' : + (c === 0x74/* t */) ? '\x09' : + (c === 0x09/* Tab */) ? '\x09' : + (c === 0x6E/* n */) ? '\x0A' : + (c === 0x76/* v */) ? '\x0B' : + (c === 0x66/* f */) ? '\x0C' : + (c === 0x72/* r */) ? '\x0D' : + (c === 0x65/* e */) ? '\x1B' : + (c === 0x20/* Space */) ? ' ' : + (c === 0x22/* " */) ? '\x22' : + (c === 0x2F/* / */) ? '/' : + (c === 0x5C/* \ */) ? '\x5C' : + (c === 0x4E/* N */) ? '\x85' : + (c === 0x5F/* _ */) ? '\xA0' : + (c === 0x4C/* L */) ? '\u2028' : + (c === 0x50/* P */) ? '\u2029' : ''; + } + + function charFromCodepoint(c) { + if (c <= 0xFFFF) { + return String.fromCharCode(c); + } + // Encode UTF-16 surrogate pair + // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF + return String.fromCharCode( + ((c - 0x010000) >> 10) + 0xD800, + ((c - 0x010000) & 0x03FF) + 0xDC00 + ); + } + + var simpleEscapeCheck = new Array(256); // integer, for fast access + var simpleEscapeMap = new Array(256); + for (var i = 0; i < 256; i++) { + simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; + simpleEscapeMap[i] = simpleEscapeSequence(i); + } + + + function State$1(input, options) { + this.input = input; + + this.filename = options['filename'] || null; + this.schema = options['schema'] || _default; + this.onWarning = options['onWarning'] || null; + // (Hidden) Remove? makes the loader to expect YAML 1.1 documents + // if such documents have no explicit %YAML directive + this.legacy = options['legacy'] || false; + + this.json = options['json'] || false; + this.listener = options['listener'] || null; + + this.implicitTypes = this.schema.compiledImplicit; + this.typeMap = this.schema.compiledTypeMap; + + this.length = input.length; + this.position = 0; + this.line = 0; + this.lineStart = 0; + this.lineIndent = 0; + + // position of first leading tab in the current line, + // used to make sure there are no tabs in the indentation + this.firstTabInLine = -1; + + this.documents = []; + + /* + this.version; + this.checkLineBreaks; + this.tagMap; + this.anchorMap; + this.tag; + this.anchor; + this.kind; + this.result;*/ + + } + + + function generateError(state, message) { + var mark = { + name: state.filename, + buffer: state.input.slice(0, -1), // omit trailing \0 + position: state.position, + line: state.line, + column: state.position - state.lineStart + }; + + mark.snippet = snippet(mark); + + return new exception(message, mark); + } + + function throwError(state, message) { + throw generateError(state, message); + } + + function throwWarning(state, message) { + if (state.onWarning) { + state.onWarning.call(null, generateError(state, message)); + } + } + + + var directiveHandlers = { + + YAML: function handleYamlDirective(state, name, args) { + + var match, major, minor; + + if (state.version !== null) { + throwError(state, 'duplication of %YAML directive'); + } + + if (args.length !== 1) { + throwError(state, 'YAML directive accepts exactly one argument'); + } + + match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); + + if (match === null) { + throwError(state, 'ill-formed argument of the YAML directive'); + } + + major = parseInt(match[1], 10); + minor = parseInt(match[2], 10); + + if (major !== 1) { + throwError(state, 'unacceptable YAML version of the document'); + } + + state.version = args[0]; + state.checkLineBreaks = (minor < 2); + + if (minor !== 1 && minor !== 2) { + throwWarning(state, 'unsupported YAML version of the document'); + } + }, + + TAG: function handleTagDirective(state, name, args) { + + var handle, prefix; + + if (args.length !== 2) { + throwError(state, 'TAG directive accepts exactly two arguments'); + } + + handle = args[0]; + prefix = args[1]; + + if (!PATTERN_TAG_HANDLE.test(handle)) { + throwError(state, 'ill-formed tag handle (first argument) of the TAG directive'); + } + + if (_hasOwnProperty$1.call(state.tagMap, handle)) { + throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); + } + + if (!PATTERN_TAG_URI.test(prefix)) { + throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive'); + } + + try { + prefix = decodeURIComponent(prefix); + } catch (err) { + throwError(state, 'tag prefix is malformed: ' + prefix); + } + + state.tagMap[handle] = prefix; + } + }; + + + function captureSegment(state, start, end, checkJson) { + var _position, _length, _character, _result; + + if (start < end) { + _result = state.input.slice(start, end); + + if (checkJson) { + for (_position = 0, _length = _result.length; _position < _length; _position += 1) { + _character = _result.charCodeAt(_position); + if (!(_character === 0x09 || + (0x20 <= _character && _character <= 0x10FFFF))) { + throwError(state, 'expected valid JSON character'); + } + } + } else if (PATTERN_NON_PRINTABLE.test(_result)) { + throwError(state, 'the stream contains non-printable characters'); + } + + state.result += _result; + } + } + + function mergeMappings(state, destination, source, overridableKeys) { + var sourceKeys, key, index, quantity; + + if (!common.isObject(source)) { + throwError(state, 'cannot merge mappings; the provided source object is unacceptable'); + } + + sourceKeys = Object.keys(source); + + for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { + key = sourceKeys[index]; + + if (!_hasOwnProperty$1.call(destination, key)) { + destination[key] = source[key]; + overridableKeys[key] = true; + } + } + } + + function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, + startLine, startLineStart, startPos) { + + var index, quantity; + + // The output is a plain object here, so keys can only be strings. + // We need to convert keyNode to a string, but doing so can hang the process + // (deeply nested arrays that explode exponentially using aliases). + if (Array.isArray(keyNode)) { + keyNode = Array.prototype.slice.call(keyNode); + + for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { + if (Array.isArray(keyNode[index])) { + throwError(state, 'nested arrays are not supported inside keys'); + } + + if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') { + keyNode[index] = '[object Object]'; + } + } + } + + // Avoid code execution in load() via toString property + // (still use its own toString for arrays, timestamps, + // and whatever user schema extensions happen to have @@toStringTag) + if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') { + keyNode = '[object Object]'; + } + + + keyNode = String(keyNode); + + if (_result === null) { + _result = {}; + } + + if (keyTag === 'tag:yaml.org,2002:merge') { + if (Array.isArray(valueNode)) { + for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { + mergeMappings(state, _result, valueNode[index], overridableKeys); + } + } else { + mergeMappings(state, _result, valueNode, overridableKeys); + } + } else { + if (!state.json && + !_hasOwnProperty$1.call(overridableKeys, keyNode) && + _hasOwnProperty$1.call(_result, keyNode)) { + state.line = startLine || state.line; + state.lineStart = startLineStart || state.lineStart; + state.position = startPos || state.position; + throwError(state, 'duplicated mapping key'); + } + + // used for this specific key only because Object.defineProperty is slow + if (keyNode === '__proto__') { + Object.defineProperty(_result, keyNode, { + configurable: true, + enumerable: true, + writable: true, + value: valueNode + }); + } else { + _result[keyNode] = valueNode; + } + delete overridableKeys[keyNode]; + } + + return _result; + } + + function readLineBreak(state) { + var ch; + + ch = state.input.charCodeAt(state.position); + + if (ch === 0x0A/* LF */) { + state.position++; + } else if (ch === 0x0D/* CR */) { + state.position++; + if (state.input.charCodeAt(state.position) === 0x0A/* LF */) { + state.position++; + } + } else { + throwError(state, 'a line break is expected'); + } + + state.line += 1; + state.lineStart = state.position; + state.firstTabInLine = -1; + } + + function skipSeparationSpace(state, allowComments, checkIndent) { + var lineBreaks = 0, + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) { + state.firstTabInLine = state.position; + } + ch = state.input.charCodeAt(++state.position); + } + + if (allowComments && ch === 0x23/* # */) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0); + } + + if (is_EOL(ch)) { + readLineBreak(state); + + ch = state.input.charCodeAt(state.position); + lineBreaks++; + state.lineIndent = 0; + + while (ch === 0x20/* Space */) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); + } + } else { + break; + } + } + + if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { + throwWarning(state, 'deficient indentation'); + } + + return lineBreaks; + } + + function testDocumentSeparator(state) { + var _position = state.position, + ch; + + ch = state.input.charCodeAt(_position); + + // Condition state.position === state.lineStart is tested + // in parent on each call, for efficiency. No needs to test here again. + if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) && + ch === state.input.charCodeAt(_position + 1) && + ch === state.input.charCodeAt(_position + 2)) { + + _position += 3; + + ch = state.input.charCodeAt(_position); + + if (ch === 0 || is_WS_OR_EOL(ch)) { + return true; + } + } + + return false; + } + + function writeFoldedLines(state, count) { + if (count === 1) { + state.result += ' '; + } else if (count > 1) { + state.result += common.repeat('\n', count - 1); + } + } + + + function readPlainScalar(state, nodeIndent, withinFlowCollection) { + var preceding, + following, + captureStart, + captureEnd, + hasPendingContent, + _line, + _lineStart, + _lineIndent, + _kind = state.kind, + _result = state.result, + ch; + + ch = state.input.charCodeAt(state.position); + + if (is_WS_OR_EOL(ch) || + is_FLOW_INDICATOR(ch) || + ch === 0x23/* # */ || + ch === 0x26/* & */ || + ch === 0x2A/* * */ || + ch === 0x21/* ! */ || + ch === 0x7C/* | */ || + ch === 0x3E/* > */ || + ch === 0x27/* ' */ || + ch === 0x22/* " */ || + ch === 0x25/* % */ || + ch === 0x40/* @ */ || + ch === 0x60/* ` */) { + return false; + } + + if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) { + following = state.input.charCodeAt(state.position + 1); + + if (is_WS_OR_EOL(following) || + withinFlowCollection && is_FLOW_INDICATOR(following)) { + return false; + } + } + + state.kind = 'scalar'; + state.result = ''; + captureStart = captureEnd = state.position; + hasPendingContent = false; + + while (ch !== 0) { + if (ch === 0x3A/* : */) { + following = state.input.charCodeAt(state.position + 1); + + if (is_WS_OR_EOL(following) || + withinFlowCollection && is_FLOW_INDICATOR(following)) { + break; + } + + } else if (ch === 0x23/* # */) { + preceding = state.input.charCodeAt(state.position - 1); + + if (is_WS_OR_EOL(preceding)) { + break; + } + + } else if ((state.position === state.lineStart && testDocumentSeparator(state)) || + withinFlowCollection && is_FLOW_INDICATOR(ch)) { + break; + + } else if (is_EOL(ch)) { + _line = state.line; + _lineStart = state.lineStart; + _lineIndent = state.lineIndent; + skipSeparationSpace(state, false, -1); + + if (state.lineIndent >= nodeIndent) { + hasPendingContent = true; + ch = state.input.charCodeAt(state.position); + continue; + } else { + state.position = captureEnd; + state.line = _line; + state.lineStart = _lineStart; + state.lineIndent = _lineIndent; + break; + } + } + + if (hasPendingContent) { + captureSegment(state, captureStart, captureEnd, false); + writeFoldedLines(state, state.line - _line); + captureStart = captureEnd = state.position; + hasPendingContent = false; + } + + if (!is_WHITE_SPACE(ch)) { + captureEnd = state.position + 1; + } + + ch = state.input.charCodeAt(++state.position); + } + + captureSegment(state, captureStart, captureEnd, false); + + if (state.result) { + return true; + } + + state.kind = _kind; + state.result = _result; + return false; + } + + function readSingleQuotedScalar(state, nodeIndent) { + var ch, + captureStart, captureEnd; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x27/* ' */) { + return false; + } + + state.kind = 'scalar'; + state.result = ''; + state.position++; + captureStart = captureEnd = state.position; + + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + if (ch === 0x27/* ' */) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + + if (ch === 0x27/* ' */) { + captureStart = state.position; + state.position++; + captureEnd = state.position; + } else { + return true; + } + + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, 'unexpected end of the document within a single quoted scalar'); + + } else { + state.position++; + captureEnd = state.position; + } + } + + throwError(state, 'unexpected end of the stream within a single quoted scalar'); + } + + function readDoubleQuotedScalar(state, nodeIndent) { + var captureStart, + captureEnd, + hexLength, + hexResult, + tmp, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x22/* " */) { + return false; + } + + state.kind = 'scalar'; + state.result = ''; + state.position++; + captureStart = captureEnd = state.position; + + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + if (ch === 0x22/* " */) { + captureSegment(state, captureStart, state.position, true); + state.position++; + return true; + + } else if (ch === 0x5C/* \ */) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + + if (is_EOL(ch)) { + skipSeparationSpace(state, false, nodeIndent); + + // TODO: rework to inline fn with no type cast? + } else if (ch < 256 && simpleEscapeCheck[ch]) { + state.result += simpleEscapeMap[ch]; + state.position++; + + } else if ((tmp = escapedHexLen(ch)) > 0) { + hexLength = tmp; + hexResult = 0; + + for (; hexLength > 0; hexLength--) { + ch = state.input.charCodeAt(++state.position); + + if ((tmp = fromHexCode(ch)) >= 0) { + hexResult = (hexResult << 4) + tmp; + + } else { + throwError(state, 'expected hexadecimal character'); + } + } + + state.result += charFromCodepoint(hexResult); + + state.position++; + + } else { + throwError(state, 'unknown escape sequence'); + } + + captureStart = captureEnd = state.position; + + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, 'unexpected end of the document within a double quoted scalar'); + + } else { + state.position++; + captureEnd = state.position; + } + } + + throwError(state, 'unexpected end of the stream within a double quoted scalar'); + } + + function readFlowCollection(state, nodeIndent) { + var readNext = true, + _line, + _lineStart, + _pos, + _tag = state.tag, + _result, + _anchor = state.anchor, + following, + terminator, + isPair, + isExplicitPair, + isMapping, + overridableKeys = Object.create(null), + keyNode, + keyTag, + valueNode, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch === 0x5B/* [ */) { + terminator = 0x5D;/* ] */ + isMapping = false; + _result = []; + } else if (ch === 0x7B/* { */) { + terminator = 0x7D;/* } */ + isMapping = true; + _result = {}; + } else { + return false; + } + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + + ch = state.input.charCodeAt(++state.position); + + while (ch !== 0) { + skipSeparationSpace(state, true, nodeIndent); + + ch = state.input.charCodeAt(state.position); + + if (ch === terminator) { + state.position++; + state.tag = _tag; + state.anchor = _anchor; + state.kind = isMapping ? 'mapping' : 'sequence'; + state.result = _result; + return true; + } else if (!readNext) { + throwError(state, 'missed comma between flow collection entries'); + } else if (ch === 0x2C/* , */) { + // "flow collection entries can never be completely empty", as per YAML 1.2, section 7.4 + throwError(state, "expected the node content, but found ','"); + } + + keyTag = keyNode = valueNode = null; + isPair = isExplicitPair = false; + + if (ch === 0x3F/* ? */) { + following = state.input.charCodeAt(state.position + 1); + + if (is_WS_OR_EOL(following)) { + isPair = isExplicitPair = true; + state.position++; + skipSeparationSpace(state, true, nodeIndent); + } + } + + _line = state.line; // Save the current line. + _lineStart = state.lineStart; + _pos = state.position; + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + keyTag = state.tag; + keyNode = state.result; + skipSeparationSpace(state, true, nodeIndent); + + ch = state.input.charCodeAt(state.position); + + if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) { + isPair = true; + ch = state.input.charCodeAt(++state.position); + skipSeparationSpace(state, true, nodeIndent); + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + valueNode = state.result; + } + + if (isMapping) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos); + } else if (isPair) { + _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos)); + } else { + _result.push(keyNode); + } + + skipSeparationSpace(state, true, nodeIndent); + + ch = state.input.charCodeAt(state.position); + + if (ch === 0x2C/* , */) { + readNext = true; + ch = state.input.charCodeAt(++state.position); + } else { + readNext = false; + } + } + + throwError(state, 'unexpected end of the stream within a flow collection'); + } + + function readBlockScalar(state, nodeIndent) { + var captureStart, + folding, + chomping = CHOMPING_CLIP, + didReadContent = false, + detectedIndent = false, + textIndent = nodeIndent, + emptyLines = 0, + atMoreIndented = false, + tmp, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch === 0x7C/* | */) { + folding = false; + } else if (ch === 0x3E/* > */) { + folding = true; + } else { + return false; + } + + state.kind = 'scalar'; + state.result = ''; + + while (ch !== 0) { + ch = state.input.charCodeAt(++state.position); + + if (ch === 0x2B/* + */ || ch === 0x2D/* - */) { + if (CHOMPING_CLIP === chomping) { + chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP; + } else { + throwError(state, 'repeat of a chomping mode identifier'); + } + + } else if ((tmp = fromDecimalCode(ch)) >= 0) { + if (tmp === 0) { + throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one'); + } else if (!detectedIndent) { + textIndent = nodeIndent + tmp - 1; + detectedIndent = true; + } else { + throwError(state, 'repeat of an indentation width identifier'); + } + + } else { + break; + } + } + + if (is_WHITE_SPACE(ch)) { + do { ch = state.input.charCodeAt(++state.position); } + while (is_WHITE_SPACE(ch)); + + if (ch === 0x23/* # */) { + do { ch = state.input.charCodeAt(++state.position); } + while (!is_EOL(ch) && (ch !== 0)); + } + } + + while (ch !== 0) { + readLineBreak(state); + state.lineIndent = 0; + + ch = state.input.charCodeAt(state.position); + + while ((!detectedIndent || state.lineIndent < textIndent) && + (ch === 0x20/* Space */)) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); + } + + if (!detectedIndent && state.lineIndent > textIndent) { + textIndent = state.lineIndent; + } + + if (is_EOL(ch)) { + emptyLines++; + continue; + } + + // End of the scalar. + if (state.lineIndent < textIndent) { + + // Perform the chomping. + if (chomping === CHOMPING_KEEP) { + state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + } else if (chomping === CHOMPING_CLIP) { + if (didReadContent) { // i.e. only if the scalar is not empty. + state.result += '\n'; + } + } + + // Break this `while` cycle and go to the funciton's epilogue. + break; + } + + // Folded style: use fancy rules to handle line breaks. + if (folding) { + + // Lines starting with white space characters (more-indented lines) are not folded. + if (is_WHITE_SPACE(ch)) { + atMoreIndented = true; + // except for the first content line (cf. Example 8.1) + state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + + // End of more-indented block. + } else if (atMoreIndented) { + atMoreIndented = false; + state.result += common.repeat('\n', emptyLines + 1); + + // Just one line break - perceive as the same line. + } else if (emptyLines === 0) { + if (didReadContent) { // i.e. only if we have already read some scalar content. + state.result += ' '; + } + + // Several line breaks - perceive as different lines. + } else { + state.result += common.repeat('\n', emptyLines); + } + + // Literal style: just add exact number of line breaks between content lines. + } else { + // Keep all line breaks except the header line break. + state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + } + + didReadContent = true; + detectedIndent = true; + emptyLines = 0; + captureStart = state.position; + + while (!is_EOL(ch) && (ch !== 0)) { + ch = state.input.charCodeAt(++state.position); + } + + captureSegment(state, captureStart, state.position, false); + } + + return true; + } + + function readBlockSequence(state, nodeIndent) { + var _line, + _tag = state.tag, + _anchor = state.anchor, + _result = [], + following, + detected = false, + ch; + + // there is a leading tab before this token, so it can't be a block sequence/mapping; + // it can still be flow sequence/mapping or a scalar + if (state.firstTabInLine !== -1) return false; + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + if (state.firstTabInLine !== -1) { + state.position = state.firstTabInLine; + throwError(state, 'tab characters must not be used in indentation'); + } + + if (ch !== 0x2D/* - */) { + break; + } + + following = state.input.charCodeAt(state.position + 1); + + if (!is_WS_OR_EOL(following)) { + break; + } + + detected = true; + state.position++; + + if (skipSeparationSpace(state, true, -1)) { + if (state.lineIndent <= nodeIndent) { + _result.push(null); + ch = state.input.charCodeAt(state.position); + continue; + } + } + + _line = state.line; + composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); + _result.push(state.result); + skipSeparationSpace(state, true, -1); + + ch = state.input.charCodeAt(state.position); + + if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) { + throwError(state, 'bad indentation of a sequence entry'); + } else if (state.lineIndent < nodeIndent) { + break; + } + } + + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = 'sequence'; + state.result = _result; + return true; + } + return false; + } + + function readBlockMapping(state, nodeIndent, flowIndent) { + var following, + allowCompact, + _line, + _keyLine, + _keyLineStart, + _keyPos, + _tag = state.tag, + _anchor = state.anchor, + _result = {}, + overridableKeys = Object.create(null), + keyTag = null, + keyNode = null, + valueNode = null, + atExplicitKey = false, + detected = false, + ch; + + // there is a leading tab before this token, so it can't be a block sequence/mapping; + // it can still be flow sequence/mapping or a scalar + if (state.firstTabInLine !== -1) return false; + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + if (!atExplicitKey && state.firstTabInLine !== -1) { + state.position = state.firstTabInLine; + throwError(state, 'tab characters must not be used in indentation'); + } + + following = state.input.charCodeAt(state.position + 1); + _line = state.line; // Save the current line. + + // + // Explicit notation case. There are two separate blocks: + // first for the key (denoted by "?") and second for the value (denoted by ":") + // + if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) { + + if (ch === 0x3F/* ? */) { + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + + detected = true; + atExplicitKey = true; + allowCompact = true; + + } else if (atExplicitKey) { + // i.e. 0x3A/* : */ === character after the explicit key. + atExplicitKey = false; + allowCompact = true; + + } else { + throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line'); + } + + state.position += 1; + ch = following; + + // + // Implicit notation case. Flow-style node as the key first, then ":", and the value. + // + } else { + _keyLine = state.line; + _keyLineStart = state.lineStart; + _keyPos = state.position; + + if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { + // Neither implicit nor explicit notation. + // Reading is done. Go to the epilogue. + break; + } + + if (state.line === _line) { + ch = state.input.charCodeAt(state.position); + + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + if (ch === 0x3A/* : */) { + ch = state.input.charCodeAt(++state.position); + + if (!is_WS_OR_EOL(ch)) { + throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); + } + + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + + detected = true; + atExplicitKey = false; + allowCompact = false; + keyTag = state.tag; + keyNode = state.result; + + } else if (detected) { + throwError(state, 'can not read an implicit mapping pair; a colon is missed'); + + } else { + state.tag = _tag; + state.anchor = _anchor; + return true; // Keep the result of `composeNode`. + } + + } else if (detected) { + throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key'); + + } else { + state.tag = _tag; + state.anchor = _anchor; + return true; // Keep the result of `composeNode`. + } + } + + // + // Common reading code for both explicit and implicit notations. + // + if (state.line === _line || state.lineIndent > nodeIndent) { + if (atExplicitKey) { + _keyLine = state.line; + _keyLineStart = state.lineStart; + _keyPos = state.position; + } + + if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { + if (atExplicitKey) { + keyNode = state.result; + } else { + valueNode = state.result; + } + } + + if (!atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + } + + if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) { + throwError(state, 'bad indentation of a mapping entry'); + } else if (state.lineIndent < nodeIndent) { + break; + } + } + + // + // Epilogue. + // + + // Special case: last mapping's node contains only the key in explicit notation. + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + } + + // Expose the resulting mapping. + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = 'mapping'; + state.result = _result; + } + + return detected; + } + + function readTagProperty(state) { + var _position, + isVerbatim = false, + isNamed = false, + tagHandle, + tagName, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x21/* ! */) return false; + + if (state.tag !== null) { + throwError(state, 'duplication of a tag property'); + } + + ch = state.input.charCodeAt(++state.position); + + if (ch === 0x3C/* < */) { + isVerbatim = true; + ch = state.input.charCodeAt(++state.position); + + } else if (ch === 0x21/* ! */) { + isNamed = true; + tagHandle = '!!'; + ch = state.input.charCodeAt(++state.position); + + } else { + tagHandle = '!'; + } + + _position = state.position; + + if (isVerbatim) { + do { ch = state.input.charCodeAt(++state.position); } + while (ch !== 0 && ch !== 0x3E/* > */); + + if (state.position < state.length) { + tagName = state.input.slice(_position, state.position); + ch = state.input.charCodeAt(++state.position); + } else { + throwError(state, 'unexpected end of the stream within a verbatim tag'); + } + } else { + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + + if (ch === 0x21/* ! */) { + if (!isNamed) { + tagHandle = state.input.slice(_position - 1, state.position + 1); + + if (!PATTERN_TAG_HANDLE.test(tagHandle)) { + throwError(state, 'named tag handle cannot contain such characters'); + } + + isNamed = true; + _position = state.position + 1; + } else { + throwError(state, 'tag suffix cannot contain exclamation marks'); + } + } + + ch = state.input.charCodeAt(++state.position); + } + + tagName = state.input.slice(_position, state.position); + + if (PATTERN_FLOW_INDICATORS.test(tagName)) { + throwError(state, 'tag suffix cannot contain flow indicator characters'); + } + } + + if (tagName && !PATTERN_TAG_URI.test(tagName)) { + throwError(state, 'tag name cannot contain such characters: ' + tagName); + } + + try { + tagName = decodeURIComponent(tagName); + } catch (err) { + throwError(state, 'tag name is malformed: ' + tagName); + } + + if (isVerbatim) { + state.tag = tagName; + + } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) { + state.tag = state.tagMap[tagHandle] + tagName; + + } else if (tagHandle === '!') { + state.tag = '!' + tagName; + + } else if (tagHandle === '!!') { + state.tag = 'tag:yaml.org,2002:' + tagName; + + } else { + throwError(state, 'undeclared tag handle "' + tagHandle + '"'); + } + + return true; + } + + function readAnchorProperty(state) { + var _position, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x26/* & */) return false; + + if (state.anchor !== null) { + throwError(state, 'duplication of an anchor property'); + } + + ch = state.input.charCodeAt(++state.position); + _position = state.position; + + while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + if (state.position === _position) { + throwError(state, 'name of an anchor node must contain at least one character'); + } + + state.anchor = state.input.slice(_position, state.position); + return true; + } + + function readAlias(state) { + var _position, alias, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x2A/* * */) return false; + + ch = state.input.charCodeAt(++state.position); + _position = state.position; + + while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + if (state.position === _position) { + throwError(state, 'name of an alias node must contain at least one character'); + } + + alias = state.input.slice(_position, state.position); + + if (!_hasOwnProperty$1.call(state.anchorMap, alias)) { + throwError(state, 'unidentified alias "' + alias + '"'); + } + + state.result = state.anchorMap[alias]; + skipSeparationSpace(state, true, -1); + return true; + } + + function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { + var allowBlockStyles, + allowBlockScalars, + allowBlockCollections, + indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) { + indentStatus = 1; + } else if (state.lineIndent === parentIndent) { + indentStatus = 0; + } else if (state.lineIndent < parentIndent) { + indentStatus = -1; + } + } + } + + if (indentStatus === 1) { + while (readTagProperty(state) || readAnchorProperty(state)) { + if (skipSeparationSpace(state, true, -1)) { + atNewLine = true; + allowBlockCollections = allowBlockStyles; + + if (state.lineIndent > parentIndent) { + indentStatus = 1; + } else if (state.lineIndent === parentIndent) { + indentStatus = 0; + } else if (state.lineIndent < parentIndent) { + indentStatus = -1; + } + } else { + allowBlockCollections = false; + } + } + } + + if (allowBlockCollections) { + allowBlockCollections = atNewLine || allowCompact; + } + + if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { + if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { + flowIndent = parentIndent; + } else { + flowIndent = parentIndent + 1; + } + + blockIndent = state.position - state.lineStart; + + if (indentStatus === 1) { + if (allowBlockCollections && + (readBlockSequence(state, blockIndent) || + readBlockMapping(state, blockIndent, flowIndent)) || + readFlowCollection(state, flowIndent)) { + hasContent = true; + } else { + if ((allowBlockScalars && readBlockScalar(state, flowIndent)) || + readSingleQuotedScalar(state, flowIndent) || + readDoubleQuotedScalar(state, flowIndent)) { + hasContent = true; + + } else if (readAlias(state)) { + hasContent = true; + + if (state.tag !== null || state.anchor !== null) { + throwError(state, 'alias node should not have any properties'); + } + + } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { + hasContent = true; + + if (state.tag === null) { + state.tag = '?'; + } + } + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + } + } else if (indentStatus === 0) { + // Special case: block sequences are allowed to have same indentation level as the parent. + // http://www.yaml.org/spec/1.2/spec.html#id2799784 + hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); + } + } + + if (state.tag === null) { + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + + } else if (state.tag === '?') { + // Implicit resolving is not allowed for non-scalar types, and '?' + // non-specific tag is only automatically assigned to plain scalars. + // + // We only need to check kind conformity in case user explicitly assigns '?' + // tag, for example like this: "! [0]" + // + if (state.result !== null && state.kind !== 'scalar') { + throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); + } + + for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { + type = state.implicitTypes[typeIndex]; + + if (type.resolve(state.result)) { // `state.result` updated in resolver if matched + state.result = type.construct(state.result); + state.tag = type.tag; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + break; + } + } + } else if (state.tag !== '!') { + if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) { + type = state.typeMap[state.kind || 'fallback'][state.tag]; + } else { + // looking for multi type + type = null; + typeList = state.typeMap.multi[state.kind || 'fallback']; + + for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) { + if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) { + type = typeList[typeIndex]; + break; + } + } + } + + if (!type) { + throwError(state, 'unknown tag !<' + state.tag + '>'); + } + + if (state.result !== null && type.kind !== state.kind) { + throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); + } + + if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched + throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); + } else { + state.result = type.construct(state.result, state.tag); + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + } + } + + if (state.listener !== null) { + state.listener('close', state); + } + return state.tag !== null || state.anchor !== null || hasContent; + } + + function readDocument(state) { + var documentStart = state.position, + _position, + directiveName, + directiveArgs, + hasDirectives = false, + ch; + + state.version = null; + state.checkLineBreaks = state.legacy; + state.tagMap = Object.create(null); + state.anchorMap = Object.create(null); + + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + skipSeparationSpace(state, true, -1); + + ch = state.input.charCodeAt(state.position); + + if (state.lineIndent > 0 || ch !== 0x25/* % */) { + break; + } + + hasDirectives = true; + ch = state.input.charCodeAt(++state.position); + _position = state.position; + + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + directiveName = state.input.slice(_position, state.position); + directiveArgs = []; + + if (directiveName.length < 1) { + throwError(state, 'directive name must not be less than one character in length'); + } + + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + if (ch === 0x23/* # */) { + do { ch = state.input.charCodeAt(++state.position); } + while (ch !== 0 && !is_EOL(ch)); + break; + } + + if (is_EOL(ch)) break; + + _position = state.position; + + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + directiveArgs.push(state.input.slice(_position, state.position)); + } + + if (ch !== 0) readLineBreak(state); + + if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) { + directiveHandlers[directiveName](state, directiveName, directiveArgs); + } else { + throwWarning(state, 'unknown document directive "' + directiveName + '"'); + } + } + + skipSeparationSpace(state, true, -1); + + if (state.lineIndent === 0 && + state.input.charCodeAt(state.position) === 0x2D/* - */ && + state.input.charCodeAt(state.position + 1) === 0x2D/* - */ && + state.input.charCodeAt(state.position + 2) === 0x2D/* - */) { + state.position += 3; + skipSeparationSpace(state, true, -1); + + } else if (hasDirectives) { + throwError(state, 'directives end mark is expected'); + } + + composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); + skipSeparationSpace(state, true, -1); + + if (state.checkLineBreaks && + PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { + throwWarning(state, 'non-ASCII line breaks are interpreted as content'); + } + + state.documents.push(state.result); + + if (state.position === state.lineStart && testDocumentSeparator(state)) { + + if (state.input.charCodeAt(state.position) === 0x2E/* . */) { + state.position += 3; + skipSeparationSpace(state, true, -1); + } + return; + } + + if (state.position < (state.length - 1)) { + throwError(state, 'end of the stream or a document separator is expected'); + } else { + return; + } + } + + + function loadDocuments(input, options) { + input = String(input); + options = options || {}; + + if (input.length !== 0) { + + // Add tailing `\n` if not exists + if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ && + input.charCodeAt(input.length - 1) !== 0x0D/* CR */) { + input += '\n'; + } + + // Strip BOM + if (input.charCodeAt(0) === 0xFEFF) { + input = input.slice(1); + } + } + + var state = new State$1(input, options); + + var nullpos = input.indexOf('\0'); + + if (nullpos !== -1) { + state.position = nullpos; + throwError(state, 'null byte is not allowed in input'); + } + + // Use 0 as string terminator. That significantly simplifies bounds check. + state.input += '\0'; + + while (state.input.charCodeAt(state.position) === 0x20/* Space */) { + state.lineIndent += 1; + state.position += 1; + } + + while (state.position < (state.length - 1)) { + readDocument(state); + } + + return state.documents; + } + + + function loadAll$1(input, iterator, options) { + if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') { + options = iterator; + iterator = null; + } + + var documents = loadDocuments(input, options); + + if (typeof iterator !== 'function') { + return documents; + } + + for (var index = 0, length = documents.length; index < length; index += 1) { + iterator(documents[index]); + } + } + + + function load$1(input, options) { + var documents = loadDocuments(input, options); + + if (documents.length === 0) { + /*eslint-disable no-undefined*/ + return undefined; + } else if (documents.length === 1) { + return documents[0]; + } + throw new exception('expected a single document in the stream, but found more'); + } + + + var loadAll_1 = loadAll$1; + var load_1 = load$1; + + var loader = { + loadAll: loadAll_1, + load: load_1 + }; + + /*eslint-disable no-use-before-define*/ + + + + + + var _toString = Object.prototype.toString; + var _hasOwnProperty = Object.prototype.hasOwnProperty; + + var CHAR_BOM = 0xFEFF; + var CHAR_TAB = 0x09; /* Tab */ + var CHAR_LINE_FEED = 0x0A; /* LF */ + var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */ + var CHAR_SPACE = 0x20; /* Space */ + var CHAR_EXCLAMATION = 0x21; /* ! */ + var CHAR_DOUBLE_QUOTE = 0x22; /* " */ + var CHAR_SHARP = 0x23; /* # */ + var CHAR_PERCENT = 0x25; /* % */ + var CHAR_AMPERSAND = 0x26; /* & */ + var CHAR_SINGLE_QUOTE = 0x27; /* ' */ + var CHAR_ASTERISK = 0x2A; /* * */ + var CHAR_COMMA = 0x2C; /* , */ + var CHAR_MINUS = 0x2D; /* - */ + var CHAR_COLON = 0x3A; /* : */ + var CHAR_EQUALS = 0x3D; /* = */ + var CHAR_GREATER_THAN = 0x3E; /* > */ + var CHAR_QUESTION = 0x3F; /* ? */ + var CHAR_COMMERCIAL_AT = 0x40; /* @ */ + var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */ + var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */ + var CHAR_GRAVE_ACCENT = 0x60; /* ` */ + var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */ + var CHAR_VERTICAL_LINE = 0x7C; /* | */ + var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */ + + var ESCAPE_SEQUENCES = {}; + + ESCAPE_SEQUENCES[0x00] = '\\0'; + ESCAPE_SEQUENCES[0x07] = '\\a'; + ESCAPE_SEQUENCES[0x08] = '\\b'; + ESCAPE_SEQUENCES[0x09] = '\\t'; + ESCAPE_SEQUENCES[0x0A] = '\\n'; + ESCAPE_SEQUENCES[0x0B] = '\\v'; + ESCAPE_SEQUENCES[0x0C] = '\\f'; + ESCAPE_SEQUENCES[0x0D] = '\\r'; + ESCAPE_SEQUENCES[0x1B] = '\\e'; + ESCAPE_SEQUENCES[0x22] = '\\"'; + ESCAPE_SEQUENCES[0x5C] = '\\\\'; + ESCAPE_SEQUENCES[0x85] = '\\N'; + ESCAPE_SEQUENCES[0xA0] = '\\_'; + ESCAPE_SEQUENCES[0x2028] = '\\L'; + ESCAPE_SEQUENCES[0x2029] = '\\P'; + + var DEPRECATED_BOOLEANS_SYNTAX = [ + 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', + 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF' + ]; + + var DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/; + + function compileStyleMap(schema, map) { + var result, keys, index, length, tag, style, type; + + if (map === null) return {}; + + result = {}; + keys = Object.keys(map); + + for (index = 0, length = keys.length; index < length; index += 1) { + tag = keys[index]; + style = String(map[tag]); + + if (tag.slice(0, 2) === '!!') { + tag = 'tag:yaml.org,2002:' + tag.slice(2); + } + type = schema.compiledTypeMap['fallback'][tag]; + + if (type && _hasOwnProperty.call(type.styleAliases, style)) { + style = type.styleAliases[style]; + } + + result[tag] = style; + } + + return result; + } + + function encodeHex(character) { + var string, handle, length; + + string = character.toString(16).toUpperCase(); + + if (character <= 0xFF) { + handle = 'x'; + length = 2; + } else if (character <= 0xFFFF) { + handle = 'u'; + length = 4; + } else if (character <= 0xFFFFFFFF) { + handle = 'U'; + length = 8; + } else { + throw new exception('code point within a string may not be greater than 0xFFFFFFFF'); + } + + return '\\' + handle + common.repeat('0', length - string.length) + string; + } + + + var QUOTING_TYPE_SINGLE = 1, + QUOTING_TYPE_DOUBLE = 2; + + function State(options) { + this.schema = options['schema'] || _default; + this.indent = Math.max(1, (options['indent'] || 2)); + this.noArrayIndent = options['noArrayIndent'] || false; + this.skipInvalid = options['skipInvalid'] || false; + this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']); + this.styleMap = compileStyleMap(this.schema, options['styles'] || null); + this.sortKeys = options['sortKeys'] || false; + this.lineWidth = options['lineWidth'] || 80; + this.noRefs = options['noRefs'] || false; + this.noCompatMode = options['noCompatMode'] || false; + this.condenseFlow = options['condenseFlow'] || false; + this.quotingType = options['quotingType'] === '"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE; + this.forceQuotes = options['forceQuotes'] || false; + this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null; + + this.implicitTypes = this.schema.compiledImplicit; + this.explicitTypes = this.schema.compiledExplicit; + + this.tag = null; + this.result = ''; + + this.duplicates = []; + this.usedDuplicates = null; + } + + // Indents every line in a string. Empty lines (\n only) are not indented. + function indentString(string, spaces) { + var ind = common.repeat(' ', spaces), + position = 0, + next = -1, + result = '', + line, + length = string.length; + + while (position < length) { + next = string.indexOf('\n', position); + if (next === -1) { + line = string.slice(position); + position = length; + } else { + line = string.slice(position, next + 1); + position = next + 1; + } + + if (line.length && line !== '\n') result += ind; + + result += line; + } + + return result; + } + + function generateNextLine(state, level) { + return '\n' + common.repeat(' ', state.indent * level); + } + + function testImplicitResolving(state, str) { + var index, length, type; + + for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { + type = state.implicitTypes[index]; + + if (type.resolve(str)) { + return true; + } + } + + return false; + } + + // [33] s-white ::= s-space | s-tab + function isWhitespace(c) { + return c === CHAR_SPACE || c === CHAR_TAB; + } + + // Returns true if the character can be printed without escaping. + // From YAML 1.2: "any allowed characters known to be non-printable + // should also be escaped. [However,] This isn’t mandatory" + // Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029. + function isPrintable(c) { + return (0x00020 <= c && c <= 0x00007E) + || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029) + || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM) + || (0x10000 <= c && c <= 0x10FFFF); + } + + // [34] ns-char ::= nb-char - s-white + // [27] nb-char ::= c-printable - b-char - c-byte-order-mark + // [26] b-char ::= b-line-feed | b-carriage-return + // Including s-white (for some reason, examples doesn't match specs in this aspect) + // ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark + function isNsCharOrWhitespace(c) { + return isPrintable(c) + && c !== CHAR_BOM + // - b-char + && c !== CHAR_CARRIAGE_RETURN + && c !== CHAR_LINE_FEED; + } + + // [127] ns-plain-safe(c) ::= c = flow-out ⇒ ns-plain-safe-out + // c = flow-in ⇒ ns-plain-safe-in + // c = block-key ⇒ ns-plain-safe-out + // c = flow-key ⇒ ns-plain-safe-in + // [128] ns-plain-safe-out ::= ns-char + // [129] ns-plain-safe-in ::= ns-char - c-flow-indicator + // [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - “:” - “#” ) + // | ( /* An ns-char preceding */ “#” ) + // | ( “:” /* Followed by an ns-plain-safe(c) */ ) + function isPlainSafe(c, prev, inblock) { + var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c); + var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c); + return ( + // ns-plain-safe + inblock ? // c = flow-in + cIsNsCharOrWhitespace + : cIsNsCharOrWhitespace + // - c-flow-indicator + && c !== CHAR_COMMA + && c !== CHAR_LEFT_SQUARE_BRACKET + && c !== CHAR_RIGHT_SQUARE_BRACKET + && c !== CHAR_LEFT_CURLY_BRACKET + && c !== CHAR_RIGHT_CURLY_BRACKET + ) + // ns-plain-char + && c !== CHAR_SHARP // false on '#' + && !(prev === CHAR_COLON && !cIsNsChar) // false on ': ' + || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#' + || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]' + } + + // Simplified test for values allowed as the first character in plain style. + function isPlainSafeFirst(c) { + // Uses a subset of ns-char - c-indicator + // where ns-char = nb-char - s-white. + // No support of ( ( “?” | “:” | “-” ) /* Followed by an ns-plain-safe(c)) */ ) part + return isPrintable(c) && c !== CHAR_BOM + && !isWhitespace(c) // - s-white + // - (c-indicator ::= + // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}” + && c !== CHAR_MINUS + && c !== CHAR_QUESTION + && c !== CHAR_COLON + && c !== CHAR_COMMA + && c !== CHAR_LEFT_SQUARE_BRACKET + && c !== CHAR_RIGHT_SQUARE_BRACKET + && c !== CHAR_LEFT_CURLY_BRACKET + && c !== CHAR_RIGHT_CURLY_BRACKET + // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"” + && c !== CHAR_SHARP + && c !== CHAR_AMPERSAND + && c !== CHAR_ASTERISK + && c !== CHAR_EXCLAMATION + && c !== CHAR_VERTICAL_LINE + && c !== CHAR_EQUALS + && c !== CHAR_GREATER_THAN + && c !== CHAR_SINGLE_QUOTE + && c !== CHAR_DOUBLE_QUOTE + // | “%” | “@” | “`”) + && c !== CHAR_PERCENT + && c !== CHAR_COMMERCIAL_AT + && c !== CHAR_GRAVE_ACCENT; + } + + // Simplified test for values allowed as the last character in plain style. + function isPlainSafeLast(c) { + // just not whitespace or colon, it will be checked to be plain character later + return !isWhitespace(c) && c !== CHAR_COLON; + } + + // Same as 'string'.codePointAt(pos), but works in older browsers. + function codePointAt(string, pos) { + var first = string.charCodeAt(pos), second; + if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) { + second = string.charCodeAt(pos + 1); + if (second >= 0xDC00 && second <= 0xDFFF) { + // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000; + } + } + return first; + } + + // Determines whether block indentation indicator is required. + function needIndentIndicator(string) { + var leadingSpaceRe = /^\n* /; + return leadingSpaceRe.test(string); + } + + var STYLE_PLAIN = 1, + STYLE_SINGLE = 2, + STYLE_LITERAL = 3, + STYLE_FOLDED = 4, + STYLE_DOUBLE = 5; + + // Determines which scalar styles are possible and returns the preferred style. + // lineWidth = -1 => no limit. + // Pre-conditions: str.length > 0. + // Post-conditions: + // STYLE_PLAIN or STYLE_SINGLE => no \n are in the string. + // STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1). + // STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1). + function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, + testAmbiguousType, quotingType, forceQuotes, inblock) { + + var i; + var char = 0; + var prevChar = null; + var hasLineBreak = false; + var hasFoldableLine = false; // only checked if shouldTrackWidth + var shouldTrackWidth = lineWidth !== -1; + var previousLineBreak = -1; // count the first line correctly + var plain = isPlainSafeFirst(codePointAt(string, 0)) + && isPlainSafeLast(codePointAt(string, string.length - 1)); + + if (singleLineOnly || forceQuotes) { + // Case: no block styles. + // Check for disallowed characters to rule out plain and single. + for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { + char = codePointAt(string, i); + if (!isPrintable(char)) { + return STYLE_DOUBLE; + } + plain = plain && isPlainSafe(char, prevChar, inblock); + prevChar = char; + } + } else { + // Case: block styles permitted. + for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { + char = codePointAt(string, i); + if (char === CHAR_LINE_FEED) { + hasLineBreak = true; + // Check if any line can be folded. + if (shouldTrackWidth) { + hasFoldableLine = hasFoldableLine || + // Foldable line = too long, and not more-indented. + (i - previousLineBreak - 1 > lineWidth && + string[previousLineBreak + 1] !== ' '); + previousLineBreak = i; + } + } else if (!isPrintable(char)) { + return STYLE_DOUBLE; + } + plain = plain && isPlainSafe(char, prevChar, inblock); + prevChar = char; + } + // in case the end is missing a \n + hasFoldableLine = hasFoldableLine || (shouldTrackWidth && + (i - previousLineBreak - 1 > lineWidth && + string[previousLineBreak + 1] !== ' ')); + } + // Although every style can represent \n without escaping, prefer block styles + // for multiline, since they're more readable and they don't add empty lines. + // Also prefer folding a super-long line. + if (!hasLineBreak && !hasFoldableLine) { + // Strings interpretable as another type have to be quoted; + // e.g. the string 'true' vs. the boolean true. + if (plain && !forceQuotes && !testAmbiguousType(string)) { + return STYLE_PLAIN; + } + return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; + } + // Edge case: block indentation indicator can only have one digit. + if (indentPerLevel > 9 && needIndentIndicator(string)) { + return STYLE_DOUBLE; + } + // At this point we know block styles are valid. + // Prefer literal style unless we want to fold. + if (!forceQuotes) { + return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; + } + return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; + } + + // Note: line breaking/folding is implemented for only the folded style. + // NB. We drop the last trailing newline (if any) of a returned block scalar + // since the dumper adds its own newline. This always works: + // • No ending newline => unaffected; already using strip "-" chomping. + // • Ending newline => removed then restored. + // Importantly, this keeps the "+" chomp indicator from gaining an extra line. + function writeScalar(state, string, level, iskey, inblock) { + state.dump = (function () { + if (string.length === 0) { + return state.quotingType === QUOTING_TYPE_DOUBLE ? '""' : "''"; + } + if (!state.noCompatMode) { + if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) { + return state.quotingType === QUOTING_TYPE_DOUBLE ? ('"' + string + '"') : ("'" + string + "'"); + } + } + + var indent = state.indent * Math.max(1, level); // no 0-indent scalars + // As indentation gets deeper, let the width decrease monotonically + // to the lower bound min(state.lineWidth, 40). + // Note that this implies + // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound. + // state.lineWidth > 40 + state.indent: width decreases until the lower bound. + // This behaves better than a constant minimum width which disallows narrower options, + // or an indent threshold which causes the width to suddenly increase. + var lineWidth = state.lineWidth === -1 + ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); + + // Without knowing if keys are implicit/explicit, assume implicit for safety. + var singleLineOnly = iskey + // No block styles in flow mode. + || (state.flowLevel > -1 && level >= state.flowLevel); + function testAmbiguity(string) { + return testImplicitResolving(state, string); + } + + switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, + testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) { + + case STYLE_PLAIN: + return string; + case STYLE_SINGLE: + return "'" + string.replace(/'/g, "''") + "'"; + case STYLE_LITERAL: + return '|' + blockHeader(string, state.indent) + + dropEndingNewline(indentString(string, indent)); + case STYLE_FOLDED: + return '>' + blockHeader(string, state.indent) + + dropEndingNewline(indentString(foldString(string, lineWidth), indent)); + case STYLE_DOUBLE: + return '"' + escapeString(string) + '"'; + default: + throw new exception('impossible error: invalid scalar style'); + } + }()); + } + + // Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9. + function blockHeader(string, indentPerLevel) { + var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ''; + + // note the special case: the string '\n' counts as a "trailing" empty line. + var clip = string[string.length - 1] === '\n'; + var keep = clip && (string[string.length - 2] === '\n' || string === '\n'); + var chomp = keep ? '+' : (clip ? '' : '-'); + + return indentIndicator + chomp + '\n'; + } + + // (See the note for writeScalar.) + function dropEndingNewline(string) { + return string[string.length - 1] === '\n' ? string.slice(0, -1) : string; + } + + // Note: a long line without a suitable break point will exceed the width limit. + // Pre-conditions: every char in str isPrintable, str.length > 0, width > 0. + function foldString(string, width) { + // In folded style, $k$ consecutive newlines output as $k+1$ newlines— + // unless they're before or after a more-indented line, or at the very + // beginning or end, in which case $k$ maps to $k$. + // Therefore, parse each chunk as newline(s) followed by a content line. + var lineRe = /(\n+)([^\n]*)/g; + + // first line (possibly an empty line) + var result = (function () { + var nextLF = string.indexOf('\n'); + nextLF = nextLF !== -1 ? nextLF : string.length; + lineRe.lastIndex = nextLF; + return foldLine(string.slice(0, nextLF), width); + }()); + // If we haven't reached the first content line yet, don't add an extra \n. + var prevMoreIndented = string[0] === '\n' || string[0] === ' '; + var moreIndented; + + // rest of the lines + var match; + while ((match = lineRe.exec(string))) { + var prefix = match[1], line = match[2]; + moreIndented = (line[0] === ' '); + result += prefix + + (!prevMoreIndented && !moreIndented && line !== '' + ? '\n' : '') + + foldLine(line, width); + prevMoreIndented = moreIndented; + } + + return result; + } + + // Greedy line breaking. + // Picks the longest line under the limit each time, + // otherwise settles for the shortest line over the limit. + // NB. More-indented lines *cannot* be folded, as that would add an extra \n. + function foldLine(line, width) { + if (line === '' || line[0] === ' ') return line; + + // Since a more-indented line adds a \n, breaks can't be followed by a space. + var breakRe = / [^ ]/g; // note: the match index will always be <= length-2. + var match; + // start is an inclusive index. end, curr, and next are exclusive. + var start = 0, end, curr = 0, next = 0; + var result = ''; + + // Invariants: 0 <= start <= length-1. + // 0 <= curr <= next <= max(0, length-2). curr - start <= width. + // Inside the loop: + // A match implies length >= 2, so curr and next are <= length-2. + while ((match = breakRe.exec(line))) { + next = match.index; + // maintain invariant: curr - start <= width + if (next - start > width) { + end = (curr > start) ? curr : next; // derive end <= length-2 + result += '\n' + line.slice(start, end); + // skip the space that was output as \n + start = end + 1; // derive start <= length-1 + } + curr = next; + } + + // By the invariants, start <= length-1, so there is something left over. + // It is either the whole string or a part starting from non-whitespace. + result += '\n'; + // Insert a break if the remainder is too long and there is a break available. + if (line.length - start > width && curr > start) { + result += line.slice(start, curr) + '\n' + line.slice(curr + 1); + } else { + result += line.slice(start); + } + + return result.slice(1); // drop extra \n joiner + } + + // Escapes a double-quoted string. + function escapeString(string) { + var result = ''; + var char = 0; + var escapeSeq; + + for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { + char = codePointAt(string, i); + escapeSeq = ESCAPE_SEQUENCES[char]; + + if (!escapeSeq && isPrintable(char)) { + result += string[i]; + if (char >= 0x10000) result += string[i + 1]; + } else { + result += escapeSeq || encodeHex(char); + } + } + + return result; + } + + function writeFlowSequence(state, level, object) { + var _result = '', + _tag = state.tag, + index, + length, + value; + + for (index = 0, length = object.length; index < length; index += 1) { + value = object[index]; + + if (state.replacer) { + value = state.replacer.call(object, String(index), value); + } + + // Write only valid elements, put null instead of invalid elements. + if (writeNode(state, level, value, false, false) || + (typeof value === 'undefined' && + writeNode(state, level, null, false, false))) { + + if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : ''); + _result += state.dump; + } + } + + state.tag = _tag; + state.dump = '[' + _result + ']'; + } + + function writeBlockSequence(state, level, object, compact) { + var _result = '', + _tag = state.tag, + index, + length, + value; + + for (index = 0, length = object.length; index < length; index += 1) { + value = object[index]; + + if (state.replacer) { + value = state.replacer.call(object, String(index), value); + } + + // Write only valid elements, put null instead of invalid elements. + if (writeNode(state, level + 1, value, true, true, false, true) || + (typeof value === 'undefined' && + writeNode(state, level + 1, null, true, true, false, true))) { + + if (!compact || _result !== '') { + _result += generateNextLine(state, level); + } + + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + _result += '-'; + } else { + _result += '- '; + } + + _result += state.dump; + } + } + + state.tag = _tag; + state.dump = _result || '[]'; // Empty sequence if no valid values. + } + + function writeFlowMapping(state, level, object) { + var _result = '', + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + pairBuffer; + + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + + pairBuffer = ''; + if (_result !== '') pairBuffer += ', '; + + if (state.condenseFlow) pairBuffer += '"'; + + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + + if (state.replacer) { + objectValue = state.replacer.call(object, objectKey, objectValue); + } + + if (!writeNode(state, level, objectKey, false, false)) { + continue; // Skip this pair because of invalid key; + } + + if (state.dump.length > 1024) pairBuffer += '? '; + + pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' '); + + if (!writeNode(state, level, objectValue, false, false)) { + continue; // Skip this pair because of invalid value. + } + + pairBuffer += state.dump; + + // Both key and value are valid. + _result += pairBuffer; + } + + state.tag = _tag; + state.dump = '{' + _result + '}'; + } + + function writeBlockMapping(state, level, object, compact) { + var _result = '', + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + explicitPair, + pairBuffer; + + // Allow sorting keys so that the output file is deterministic + if (state.sortKeys === true) { + // Default sorting + objectKeyList.sort(); + } else if (typeof state.sortKeys === 'function') { + // Custom sort function + objectKeyList.sort(state.sortKeys); + } else if (state.sortKeys) { + // Something is wrong + throw new exception('sortKeys must be a boolean or a function'); + } + + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + pairBuffer = ''; + + if (!compact || _result !== '') { + pairBuffer += generateNextLine(state, level); + } + + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + + if (state.replacer) { + objectValue = state.replacer.call(object, objectKey, objectValue); + } + + if (!writeNode(state, level + 1, objectKey, true, true, true)) { + continue; // Skip this pair because of invalid key. + } + + explicitPair = (state.tag !== null && state.tag !== '?') || + (state.dump && state.dump.length > 1024); + + if (explicitPair) { + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + pairBuffer += '?'; + } else { + pairBuffer += '? '; + } + } + + pairBuffer += state.dump; + + if (explicitPair) { + pairBuffer += generateNextLine(state, level); + } + + if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { + continue; // Skip this pair because of invalid value. + } + + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + pairBuffer += ':'; + } else { + pairBuffer += ': '; + } + + pairBuffer += state.dump; + + // Both key and value are valid. + _result += pairBuffer; + } + + state.tag = _tag; + state.dump = _result || '{}'; // Empty mapping if no valid pairs. + } + + function detectType(state, object, explicit) { + var _result, typeList, index, length, type, style; + + typeList = explicit ? state.explicitTypes : state.implicitTypes; + + for (index = 0, length = typeList.length; index < length; index += 1) { + type = typeList[index]; + + if ((type.instanceOf || type.predicate) && + (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) && + (!type.predicate || type.predicate(object))) { + + if (explicit) { + if (type.multi && type.representName) { + state.tag = type.representName(object); + } else { + state.tag = type.tag; + } + } else { + state.tag = '?'; + } + + if (type.represent) { + style = state.styleMap[type.tag] || type.defaultStyle; + + if (_toString.call(type.represent) === '[object Function]') { + _result = type.represent(object, style); + } else if (_hasOwnProperty.call(type.represent, style)) { + _result = type.represent[style](object, style); + } else { + throw new exception('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); + } + + state.dump = _result; + } + + return true; + } + } + + return false; + } + + // Serializes `object` and writes it to global `result`. + // Returns true on success, or false on invalid object. + // + function writeNode(state, level, object, block, compact, iskey, isblockseq) { + state.tag = null; + state.dump = object; + + if (!detectType(state, object, false)) { + detectType(state, object, true); + } + + var type = _toString.call(state.dump); + var inblock = block; + var tagStr; + + if (block) { + block = (state.flowLevel < 0 || state.flowLevel > level); + } + + var objectOrArray = type === '[object Object]' || type === '[object Array]', + duplicateIndex, + duplicate; + + if (objectOrArray) { + duplicateIndex = state.duplicates.indexOf(object); + duplicate = duplicateIndex !== -1; + } + + if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) { + compact = false; + } + + if (duplicate && state.usedDuplicates[duplicateIndex]) { + state.dump = '*ref_' + duplicateIndex; + } else { + if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { + state.usedDuplicates[duplicateIndex] = true; + } + if (type === '[object Object]') { + if (block && (Object.keys(state.dump).length !== 0)) { + writeBlockMapping(state, level, state.dump, compact); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + state.dump; + } + } else { + writeFlowMapping(state, level, state.dump); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; + } + } + } else if (type === '[object Array]') { + if (block && (state.dump.length !== 0)) { + if (state.noArrayIndent && !isblockseq && level > 0) { + writeBlockSequence(state, level - 1, state.dump, compact); + } else { + writeBlockSequence(state, level, state.dump, compact); + } + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + state.dump; + } + } else { + writeFlowSequence(state, level, state.dump); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; + } + } + } else if (type === '[object String]') { + if (state.tag !== '?') { + writeScalar(state, state.dump, level, iskey, inblock); + } + } else if (type === '[object Undefined]') { + return false; + } else { + if (state.skipInvalid) return false; + throw new exception('unacceptable kind of an object to dump ' + type); + } + + if (state.tag !== null && state.tag !== '?') { + // Need to encode all characters except those allowed by the spec: + // + // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */ + // [36] ns-hex-digit ::= ns-dec-digit + // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */ + // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */ + // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | “-” + // [39] ns-uri-char ::= “%” ns-hex-digit ns-hex-digit | ns-word-char | “#” + // | “;” | “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,” + // | “_” | “.” | “!” | “~” | “*” | “'” | “(” | “)” | “[” | “]” + // + // Also need to encode '!' because it has special meaning (end of tag prefix). + // + tagStr = encodeURI( + state.tag[0] === '!' ? state.tag.slice(1) : state.tag + ).replace(/!/g, '%21'); + + if (state.tag[0] === '!') { + tagStr = '!' + tagStr; + } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') { + tagStr = '!!' + tagStr.slice(18); + } else { + tagStr = '!<' + tagStr + '>'; + } + + state.dump = tagStr + ' ' + state.dump; + } + } + + return true; + } + + function getDuplicateReferences(object, state) { + var objects = [], + duplicatesIndexes = [], + index, + length; + + inspectNode(object, objects, duplicatesIndexes); + + for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { + state.duplicates.push(objects[duplicatesIndexes[index]]); + } + state.usedDuplicates = new Array(length); + } + + function inspectNode(object, objects, duplicatesIndexes) { + var objectKeyList, + index, + length; + + if (object !== null && typeof object === 'object') { + index = objects.indexOf(object); + if (index !== -1) { + if (duplicatesIndexes.indexOf(index) === -1) { + duplicatesIndexes.push(index); + } + } else { + objects.push(object); + + if (Array.isArray(object)) { + for (index = 0, length = object.length; index < length; index += 1) { + inspectNode(object[index], objects, duplicatesIndexes); + } + } else { + objectKeyList = Object.keys(object); + + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); + } + } + } + } + } + + function dump$1(input, options) { + options = options || {}; + + var state = new State(options); + + if (!state.noRefs) getDuplicateReferences(input, state); + + var value = input; + + if (state.replacer) { + value = state.replacer.call({ '': value }, '', value); + } + + if (writeNode(state, 0, value, true, true)) return state.dump + '\n'; + + return ''; + } + + var dump_1 = dump$1; + + var dumper = { + dump: dump_1 + }; + + function renamed(from, to) { + return function () { + throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' + + 'Use yaml.' + to + ' instead, which is now safe by default.'); + }; + } + + + var Type = type; + var Schema = schema; + var FAILSAFE_SCHEMA = failsafe; + var JSON_SCHEMA = json; + var CORE_SCHEMA = core; + var DEFAULT_SCHEMA = _default; + var load = loader.load; + var loadAll = loader.loadAll; + var dump = dumper.dump; + var YAMLException = exception; + + // Re-export all types in case user wants to create custom schema + var types = { + binary: binary, + float: float, + map: map, + null: _null, + pairs: pairs, + set: set, + timestamp: timestamp, + bool: bool, + int: int, + merge: merge, + omap: omap, + seq: seq, + str: str + }; + + // Removed functions from JS-YAML 3.0.x + var safeLoad = renamed('safeLoad', 'load'); + var safeLoadAll = renamed('safeLoadAll', 'loadAll'); + var safeDump = renamed('safeDump', 'dump'); + + var jsYaml = { + Type: Type, + Schema: Schema, + FAILSAFE_SCHEMA: FAILSAFE_SCHEMA, + JSON_SCHEMA: JSON_SCHEMA, + CORE_SCHEMA: CORE_SCHEMA, + DEFAULT_SCHEMA: DEFAULT_SCHEMA, + load: load, + loadAll: loadAll, + dump: dump, + YAMLException: YAMLException, + types: types, + safeLoad: safeLoad, + safeLoadAll: safeLoadAll, + safeDump: safeDump + }; + + exports.CORE_SCHEMA = CORE_SCHEMA; + exports.DEFAULT_SCHEMA = DEFAULT_SCHEMA; + exports.FAILSAFE_SCHEMA = FAILSAFE_SCHEMA; + exports.JSON_SCHEMA = JSON_SCHEMA; + exports.Schema = Schema; + exports.Type = Type; + exports.YAMLException = YAMLException; + exports.default = jsYaml; + exports.dump = dump; + exports.load = load; + exports.loadAll = loadAll; + exports.safeDump = safeDump; + exports.safeLoad = safeLoad; + exports.safeLoadAll = safeLoadAll; + exports.types = types; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/dist/js-yaml.min.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/dist/js-yaml.min.js new file mode 100644 index 0000000..bdd8eef --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/dist/js-yaml.min.js @@ -0,0 +1,2 @@ +/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).jsyaml={})}(this,(function(e){"use strict";function t(e){return null==e}var n={isNothing:t,isObject:function(e){return"object"==typeof e&&null!==e},toArray:function(e){return Array.isArray(e)?e:t(e)?[]:[e]},repeat:function(e,t){var n,i="";for(n=0;nl&&(t=i-l+(o=" ... ").length),n-i>l&&(n=i+l-(a=" ...").length),{str:o+e.slice(t,n).replace(/\t/g,"→")+a,pos:i-t+o.length}}function l(e,t){return n.repeat(" ",t-e.length)+e}var c=function(e,t){if(t=Object.create(t||null),!e.buffer)return null;t.maxLength||(t.maxLength=79),"number"!=typeof t.indent&&(t.indent=1),"number"!=typeof t.linesBefore&&(t.linesBefore=3),"number"!=typeof t.linesAfter&&(t.linesAfter=2);for(var i,r=/\r?\n|\r|\0/g,o=[0],c=[],s=-1;i=r.exec(e.buffer);)c.push(i.index),o.push(i.index+i[0].length),e.position<=i.index&&s<0&&(s=o.length-2);s<0&&(s=o.length-1);var u,p,f="",d=Math.min(e.line+t.linesAfter,c.length).toString().length,h=t.maxLength-(t.indent+d+3);for(u=1;u<=t.linesBefore&&!(s-u<0);u++)p=a(e.buffer,o[s-u],c[s-u],e.position-(o[s]-o[s-u]),h),f=n.repeat(" ",t.indent)+l((e.line-u+1).toString(),d)+" | "+p.str+"\n"+f;for(p=a(e.buffer,o[s],c[s],e.position,h),f+=n.repeat(" ",t.indent)+l((e.line+1).toString(),d)+" | "+p.str+"\n",f+=n.repeat("-",t.indent+d+3+p.pos)+"^\n",u=1;u<=t.linesAfter&&!(s+u>=c.length);u++)p=a(e.buffer,o[s+u],c[s+u],e.position-(o[s]-o[s+u]),h),f+=n.repeat(" ",t.indent)+l((e.line+u+1).toString(),d)+" | "+p.str+"\n";return f.replace(/\n$/,"")},s=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],u=["scalar","sequence","mapping"];var p=function(e,t){if(t=t||{},Object.keys(t).forEach((function(t){if(-1===s.indexOf(t))throw new o('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.options=t,this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.representName=t.representName||null,this.defaultStyle=t.defaultStyle||null,this.multi=t.multi||!1,this.styleAliases=function(e){var t={};return null!==e&&Object.keys(e).forEach((function(n){e[n].forEach((function(e){t[String(e)]=n}))})),t}(t.styleAliases||null),-1===u.indexOf(this.kind))throw new o('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')};function f(e,t){var n=[];return e[t].forEach((function(e){var t=n.length;n.forEach((function(n,i){n.tag===e.tag&&n.kind===e.kind&&n.multi===e.multi&&(t=i)})),n[t]=e})),n}function d(e){return this.extend(e)}d.prototype.extend=function(e){var t=[],n=[];if(e instanceof p)n.push(e);else if(Array.isArray(e))n=n.concat(e);else{if(!e||!Array.isArray(e.implicit)&&!Array.isArray(e.explicit))throw new o("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");e.implicit&&(t=t.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit))}t.forEach((function(e){if(!(e instanceof p))throw new o("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(e.loadKind&&"scalar"!==e.loadKind)throw new o("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(e.multi)throw new o("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")})),n.forEach((function(e){if(!(e instanceof p))throw new o("Specified list of YAML types (or a single Type object) contains a non-Type object.")}));var i=Object.create(d.prototype);return i.implicit=(this.implicit||[]).concat(t),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=f(i,"implicit"),i.compiledExplicit=f(i,"explicit"),i.compiledTypeMap=function(){var e,t,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function i(e){e.multi?(n.multi[e.kind].push(e),n.multi.fallback.push(e)):n[e.kind][e.tag]=n.fallback[e.tag]=e}for(e=0,t=arguments.length;e=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),x=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var I=/^[-+]?[0-9]+e/;var S=new p("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!x.test(e)||"_"===e[e.length-1])},construct:function(e){var t,n;return n="-"===(t=e.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?NaN:n*parseFloat(t,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||n.isNegativeZero(e))},represent:function(e,t){var i;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(n.isNegativeZero(e))return"-0.0";return i=e.toString(10),I.test(i)?i.replace("e",".e"):i},defaultStyle:"lowercase"}),O=b.extend({implicit:[A,v,C,S]}),j=O,T=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),N=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var F=new p("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(e){return null!==e&&(null!==T.exec(e)||null!==N.exec(e))},construct:function(e){var t,n,i,r,o,a,l,c,s=0,u=null;if(null===(t=T.exec(e))&&(t=N.exec(e)),null===t)throw new Error("Date resolve error");if(n=+t[1],i=+t[2]-1,r=+t[3],!t[4])return new Date(Date.UTC(n,i,r));if(o=+t[4],a=+t[5],l=+t[6],t[7]){for(s=t[7].slice(0,3);s.length<3;)s+="0";s=+s}return t[9]&&(u=6e4*(60*+t[10]+ +(t[11]||0)),"-"===t[9]&&(u=-u)),c=new Date(Date.UTC(n,i,r,o,a,l,s)),u&&c.setTime(c.getTime()-u),c},instanceOf:Date,represent:function(e){return e.toISOString()}});var E=new p("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}}),M="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var L=new p("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,i=0,r=e.length,o=M;for(n=0;n64)){if(t<0)return!1;i+=6}return i%8==0},construct:function(e){var t,n,i=e.replace(/[\r\n=]/g,""),r=i.length,o=M,a=0,l=[];for(t=0;t>16&255),l.push(a>>8&255),l.push(255&a)),a=a<<6|o.indexOf(i.charAt(t));return 0===(n=r%4*6)?(l.push(a>>16&255),l.push(a>>8&255),l.push(255&a)):18===n?(l.push(a>>10&255),l.push(a>>2&255)):12===n&&l.push(a>>4&255),new Uint8Array(l)},predicate:function(e){return"[object Uint8Array]"===Object.prototype.toString.call(e)},represent:function(e){var t,n,i="",r=0,o=e.length,a=M;for(t=0;t>18&63],i+=a[r>>12&63],i+=a[r>>6&63],i+=a[63&r]),r=(r<<8)+e[t];return 0===(n=o%3)?(i+=a[r>>18&63],i+=a[r>>12&63],i+=a[r>>6&63],i+=a[63&r]):2===n?(i+=a[r>>10&63],i+=a[r>>4&63],i+=a[r<<2&63],i+=a[64]):1===n&&(i+=a[r>>2&63],i+=a[r<<4&63],i+=a[64],i+=a[64]),i}}),_=Object.prototype.hasOwnProperty,D=Object.prototype.toString;var U=new p("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,n,i,r,o,a=[],l=e;for(t=0,n=l.length;t>10),56320+(e-65536&1023))}for(var ie=new Array(256),re=new Array(256),oe=0;oe<256;oe++)ie[oe]=te(oe)?1:0,re[oe]=te(oe);function ae(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||K,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function le(e,t){var n={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return n.snippet=c(n),new o(t,n)}function ce(e,t){throw le(e,t)}function se(e,t){e.onWarning&&e.onWarning.call(null,le(e,t))}var ue={YAML:function(e,t,n){var i,r,o;null!==e.version&&ce(e,"duplication of %YAML directive"),1!==n.length&&ce(e,"YAML directive accepts exactly one argument"),null===(i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&ce(e,"ill-formed argument of the YAML directive"),r=parseInt(i[1],10),o=parseInt(i[2],10),1!==r&&ce(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=o<2,1!==o&&2!==o&&se(e,"unsupported YAML version of the document")},TAG:function(e,t,n){var i,r;2!==n.length&&ce(e,"TAG directive accepts exactly two arguments"),i=n[0],r=n[1],G.test(i)||ce(e,"ill-formed tag handle (first argument) of the TAG directive"),P.call(e.tagMap,i)&&ce(e,'there is a previously declared suffix for "'+i+'" tag handle'),V.test(r)||ce(e,"ill-formed tag prefix (second argument) of the TAG directive");try{r=decodeURIComponent(r)}catch(t){ce(e,"tag prefix is malformed: "+r)}e.tagMap[i]=r}};function pe(e,t,n,i){var r,o,a,l;if(t1&&(e.result+=n.repeat("\n",t-1))}function be(e,t){var n,i,r=e.tag,o=e.anchor,a=[],l=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=a),i=e.input.charCodeAt(e.position);0!==i&&(-1!==e.firstTabInLine&&(e.position=e.firstTabInLine,ce(e,"tab characters must not be used in indentation")),45===i)&&z(e.input.charCodeAt(e.position+1));)if(l=!0,e.position++,ge(e,!0,-1)&&e.lineIndent<=t)a.push(null),i=e.input.charCodeAt(e.position);else if(n=e.line,we(e,t,3,!1,!0),a.push(e.result),ge(e,!0,-1),i=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==i)ce(e,"bad indentation of a sequence entry");else if(e.lineIndentt?g=1:e.lineIndent===t?g=0:e.lineIndentt?g=1:e.lineIndent===t?g=0:e.lineIndentt)&&(y&&(a=e.line,l=e.lineStart,c=e.position),we(e,t,4,!0,r)&&(y?g=e.result:m=e.result),y||(de(e,f,d,h,g,m,a,l,c),h=g=m=null),ge(e,!0,-1),s=e.input.charCodeAt(e.position)),(e.line===o||e.lineIndent>t)&&0!==s)ce(e,"bad indentation of a mapping entry");else if(e.lineIndent=0))break;0===o?ce(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):u?ce(e,"repeat of an indentation width identifier"):(p=t+o-1,u=!0)}if(Q(a)){do{a=e.input.charCodeAt(++e.position)}while(Q(a));if(35===a)do{a=e.input.charCodeAt(++e.position)}while(!J(a)&&0!==a)}for(;0!==a;){for(he(e),e.lineIndent=0,a=e.input.charCodeAt(e.position);(!u||e.lineIndentp&&(p=e.lineIndent),J(a))f++;else{if(e.lineIndent0){for(r=a,o=0;r>0;r--)(a=ee(l=e.input.charCodeAt(++e.position)))>=0?o=(o<<4)+a:ce(e,"expected hexadecimal character");e.result+=ne(o),e.position++}else ce(e,"unknown escape sequence");n=i=e.position}else J(l)?(pe(e,n,i,!0),ye(e,ge(e,!1,t)),n=i=e.position):e.position===e.lineStart&&me(e)?ce(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}ce(e,"unexpected end of the stream within a double quoted scalar")}(e,d)?y=!0:!function(e){var t,n,i;if(42!==(i=e.input.charCodeAt(e.position)))return!1;for(i=e.input.charCodeAt(++e.position),t=e.position;0!==i&&!z(i)&&!X(i);)i=e.input.charCodeAt(++e.position);return e.position===t&&ce(e,"name of an alias node must contain at least one character"),n=e.input.slice(t,e.position),P.call(e.anchorMap,n)||ce(e,'unidentified alias "'+n+'"'),e.result=e.anchorMap[n],ge(e,!0,-1),!0}(e)?function(e,t,n){var i,r,o,a,l,c,s,u,p=e.kind,f=e.result;if(z(u=e.input.charCodeAt(e.position))||X(u)||35===u||38===u||42===u||33===u||124===u||62===u||39===u||34===u||37===u||64===u||96===u)return!1;if((63===u||45===u)&&(z(i=e.input.charCodeAt(e.position+1))||n&&X(i)))return!1;for(e.kind="scalar",e.result="",r=o=e.position,a=!1;0!==u;){if(58===u){if(z(i=e.input.charCodeAt(e.position+1))||n&&X(i))break}else if(35===u){if(z(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&me(e)||n&&X(u))break;if(J(u)){if(l=e.line,c=e.lineStart,s=e.lineIndent,ge(e,!1,-1),e.lineIndent>=t){a=!0,u=e.input.charCodeAt(e.position);continue}e.position=o,e.line=l,e.lineStart=c,e.lineIndent=s;break}}a&&(pe(e,r,o,!1),ye(e,e.line-l),r=o=e.position,a=!1),Q(u)||(o=e.position+1),u=e.input.charCodeAt(++e.position)}return pe(e,r,o,!1),!!e.result||(e.kind=p,e.result=f,!1)}(e,d,1===i)&&(y=!0,null===e.tag&&(e.tag="?")):(y=!0,null===e.tag&&null===e.anchor||ce(e,"alias node should not have any properties")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===g&&(y=c&&be(e,h))),null===e.tag)null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);else if("?"===e.tag){for(null!==e.result&&"scalar"!==e.kind&&ce(e,'unacceptable node kind for ! tag; it should be "scalar", not "'+e.kind+'"'),s=0,u=e.implicitTypes.length;s"),null!==e.result&&f.kind!==e.kind&&ce(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+f.kind+'", not "'+e.kind+'"'),f.resolve(e.result,e.tag)?(e.result=f.construct(e.result,e.tag),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):ce(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")}return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||y}function ke(e){var t,n,i,r,o=e.position,a=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);0!==(r=e.input.charCodeAt(e.position))&&(ge(e,!0,-1),r=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==r));){for(a=!0,r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!z(r);)r=e.input.charCodeAt(++e.position);for(i=[],(n=e.input.slice(t,e.position)).length<1&&ce(e,"directive name must not be less than one character in length");0!==r;){for(;Q(r);)r=e.input.charCodeAt(++e.position);if(35===r){do{r=e.input.charCodeAt(++e.position)}while(0!==r&&!J(r));break}if(J(r))break;for(t=e.position;0!==r&&!z(r);)r=e.input.charCodeAt(++e.position);i.push(e.input.slice(t,e.position))}0!==r&&he(e),P.call(ue,n)?ue[n](e,n,i):se(e,'unknown document directive "'+n+'"')}ge(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,ge(e,!0,-1)):a&&ce(e,"directives end mark is expected"),we(e,e.lineIndent-1,4,!1,!0),ge(e,!0,-1),e.checkLineBreaks&&H.test(e.input.slice(o,e.position))&&se(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&me(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,ge(e,!0,-1)):e.position=55296&&i<=56319&&t+1=56320&&n<=57343?1024*(i-55296)+n-56320+65536:i}function Re(e){return/^\n* /.test(e)}function Be(e,t,n,i,r,o,a,l){var c,s,u=0,p=null,f=!1,d=!1,h=-1!==i,g=-1,m=De(s=Ye(e,0))&&s!==Oe&&!_e(s)&&45!==s&&63!==s&&58!==s&&44!==s&&91!==s&&93!==s&&123!==s&&125!==s&&35!==s&&38!==s&&42!==s&&33!==s&&124!==s&&61!==s&&62!==s&&39!==s&&34!==s&&37!==s&&64!==s&&96!==s&&function(e){return!_e(e)&&58!==e}(Ye(e,e.length-1));if(t||a)for(c=0;c=65536?c+=2:c++){if(!De(u=Ye(e,c)))return 5;m=m&&qe(u,p,l),p=u}else{for(c=0;c=65536?c+=2:c++){if(10===(u=Ye(e,c)))f=!0,h&&(d=d||c-g-1>i&&" "!==e[g+1],g=c);else if(!De(u))return 5;m=m&&qe(u,p,l),p=u}d=d||h&&c-g-1>i&&" "!==e[g+1]}return f||d?n>9&&Re(e)?5:a?2===o?5:2:d?4:3:!m||a||r(e)?2===o?5:2:1}function Ke(e,t,n,i,r){e.dump=function(){if(0===t.length)return 2===e.quotingType?'""':"''";if(!e.noCompatMode&&(-1!==Te.indexOf(t)||Ne.test(t)))return 2===e.quotingType?'"'+t+'"':"'"+t+"'";var a=e.indent*Math.max(1,n),l=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-a),c=i||e.flowLevel>-1&&n>=e.flowLevel;switch(Be(t,c,e.indent,l,(function(t){return function(e,t){var n,i;for(n=0,i=e.implicitTypes.length;n"+Pe(t,e.indent)+We(Me(function(e,t){var n,i,r=/(\n+)([^\n]*)/g,o=(l=e.indexOf("\n"),l=-1!==l?l:e.length,r.lastIndex=l,He(e.slice(0,l),t)),a="\n"===e[0]||" "===e[0];var l;for(;i=r.exec(e);){var c=i[1],s=i[2];n=" "===s[0],o+=c+(a||n||""===s?"":"\n")+He(s,t),a=n}return o}(t,l),a));case 5:return'"'+function(e){for(var t,n="",i=0,r=0;r=65536?r+=2:r++)i=Ye(e,r),!(t=je[i])&&De(i)?(n+=e[r],i>=65536&&(n+=e[r+1])):n+=t||Fe(i);return n}(t)+'"';default:throw new o("impossible error: invalid scalar style")}}()}function Pe(e,t){var n=Re(e)?String(t):"",i="\n"===e[e.length-1];return n+(i&&("\n"===e[e.length-2]||"\n"===e)?"+":i?"":"-")+"\n"}function We(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function He(e,t){if(""===e||" "===e[0])return e;for(var n,i,r=/ [^ ]/g,o=0,a=0,l=0,c="";n=r.exec(e);)(l=n.index)-o>t&&(i=a>o?a:l,c+="\n"+e.slice(o,i),o=i+1),a=l;return c+="\n",e.length-o>t&&a>o?c+=e.slice(o,a)+"\n"+e.slice(a+1):c+=e.slice(o),c.slice(1)}function $e(e,t,n,i){var r,o,a,l="",c=e.tag;for(r=0,o=n.length;r tag resolver accepts not "'+s+'" style');i=c.represent[s](t,s)}e.dump=i}return!0}return!1}function Ve(e,t,n,i,r,a,l){e.tag=null,e.dump=n,Ge(e,n,!1)||Ge(e,n,!0);var c,s=Ie.call(e.dump),u=i;i&&(i=e.flowLevel<0||e.flowLevel>t);var p,f,d="[object Object]"===s||"[object Array]"===s;if(d&&(f=-1!==(p=e.duplicates.indexOf(n))),(null!==e.tag&&"?"!==e.tag||f||2!==e.indent&&t>0)&&(r=!1),f&&e.usedDuplicates[p])e.dump="*ref_"+p;else{if(d&&f&&!e.usedDuplicates[p]&&(e.usedDuplicates[p]=!0),"[object Object]"===s)i&&0!==Object.keys(e.dump).length?(!function(e,t,n,i){var r,a,l,c,s,u,p="",f=e.tag,d=Object.keys(n);if(!0===e.sortKeys)d.sort();else if("function"==typeof e.sortKeys)d.sort(e.sortKeys);else if(e.sortKeys)throw new o("sortKeys must be a boolean or a function");for(r=0,a=d.length;r1024)&&(e.dump&&10===e.dump.charCodeAt(0)?u+="?":u+="? "),u+=e.dump,s&&(u+=Le(e,t)),Ve(e,t+1,c,!0,s)&&(e.dump&&10===e.dump.charCodeAt(0)?u+=":":u+=": ",p+=u+=e.dump));e.tag=f,e.dump=p||"{}"}(e,t,e.dump,r),f&&(e.dump="&ref_"+p+e.dump)):(!function(e,t,n){var i,r,o,a,l,c="",s=e.tag,u=Object.keys(n);for(i=0,r=u.length;i1024&&(l+="? "),l+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),Ve(e,t,a,!1,!1)&&(c+=l+=e.dump));e.tag=s,e.dump="{"+c+"}"}(e,t,e.dump),f&&(e.dump="&ref_"+p+" "+e.dump));else if("[object Array]"===s)i&&0!==e.dump.length?(e.noArrayIndent&&!l&&t>0?$e(e,t-1,e.dump,r):$e(e,t,e.dump,r),f&&(e.dump="&ref_"+p+e.dump)):(!function(e,t,n){var i,r,o,a="",l=e.tag;for(i=0,r=n.length;i",e.dump=c+" "+e.dump)}return!0}function Ze(e,t){var n,i,r=[],o=[];for(Je(e,r,o),n=0,i=o.length;n maxHalfLength) { + head = ' ... '; + lineStart = position - maxHalfLength + head.length; + } + + if (lineEnd - position > maxHalfLength) { + tail = ' ...'; + lineEnd = position + maxHalfLength - tail.length; + } + + return { + str: head + buffer.slice(lineStart, lineEnd).replace(/\t/g, '→') + tail, + pos: position - lineStart + head.length // relative position + }; +} + + +function padStart(string, max) { + return common.repeat(' ', max - string.length) + string; +} + + +function makeSnippet(mark, options) { + options = Object.create(options || null); + + if (!mark.buffer) return null; + + if (!options.maxLength) options.maxLength = 79; + if (typeof options.indent !== 'number') options.indent = 1; + if (typeof options.linesBefore !== 'number') options.linesBefore = 3; + if (typeof options.linesAfter !== 'number') options.linesAfter = 2; + + var re = /\r?\n|\r|\0/g; + var lineStarts = [ 0 ]; + var lineEnds = []; + var match; + var foundLineNo = -1; + + while ((match = re.exec(mark.buffer))) { + lineEnds.push(match.index); + lineStarts.push(match.index + match[0].length); + + if (mark.position <= match.index && foundLineNo < 0) { + foundLineNo = lineStarts.length - 2; + } + } + + if (foundLineNo < 0) foundLineNo = lineStarts.length - 1; + + var result = '', i, line; + var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length; + var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3); + + for (i = 1; i <= options.linesBefore; i++) { + if (foundLineNo - i < 0) break; + line = getLine( + mark.buffer, + lineStarts[foundLineNo - i], + lineEnds[foundLineNo - i], + mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]), + maxLineLength + ); + result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) + + ' | ' + line.str + '\n' + result; + } + + line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength); + result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) + + ' | ' + line.str + '\n'; + result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\n'; + + for (i = 1; i <= options.linesAfter; i++) { + if (foundLineNo + i >= lineEnds.length) break; + line = getLine( + mark.buffer, + lineStarts[foundLineNo + i], + lineEnds[foundLineNo + i], + mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]), + maxLineLength + ); + result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) + + ' | ' + line.str + '\n'; + } + + return result.replace(/\n$/, ''); +} + + +var snippet = makeSnippet; + +var TYPE_CONSTRUCTOR_OPTIONS = [ + 'kind', + 'multi', + 'resolve', + 'construct', + 'instanceOf', + 'predicate', + 'represent', + 'representName', + 'defaultStyle', + 'styleAliases' +]; + +var YAML_NODE_KINDS = [ + 'scalar', + 'sequence', + 'mapping' +]; + +function compileStyleAliases(map) { + var result = {}; + + if (map !== null) { + Object.keys(map).forEach(function (style) { + map[style].forEach(function (alias) { + result[String(alias)] = style; + }); + }); + } + + return result; +} + +function Type$1(tag, options) { + options = options || {}; + + Object.keys(options).forEach(function (name) { + if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { + throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); + } + }); + + // TODO: Add tag format check. + this.options = options; // keep original options in case user wants to extend this type later + this.tag = tag; + this.kind = options['kind'] || null; + this.resolve = options['resolve'] || function () { return true; }; + this.construct = options['construct'] || function (data) { return data; }; + this.instanceOf = options['instanceOf'] || null; + this.predicate = options['predicate'] || null; + this.represent = options['represent'] || null; + this.representName = options['representName'] || null; + this.defaultStyle = options['defaultStyle'] || null; + this.multi = options['multi'] || false; + this.styleAliases = compileStyleAliases(options['styleAliases'] || null); + + if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { + throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); + } +} + +var type = Type$1; + +/*eslint-disable max-len*/ + + + + + +function compileList(schema, name) { + var result = []; + + schema[name].forEach(function (currentType) { + var newIndex = result.length; + + result.forEach(function (previousType, previousIndex) { + if (previousType.tag === currentType.tag && + previousType.kind === currentType.kind && + previousType.multi === currentType.multi) { + + newIndex = previousIndex; + } + }); + + result[newIndex] = currentType; + }); + + return result; +} + + +function compileMap(/* lists... */) { + var result = { + scalar: {}, + sequence: {}, + mapping: {}, + fallback: {}, + multi: { + scalar: [], + sequence: [], + mapping: [], + fallback: [] + } + }, index, length; + + function collectType(type) { + if (type.multi) { + result.multi[type.kind].push(type); + result.multi['fallback'].push(type); + } else { + result[type.kind][type.tag] = result['fallback'][type.tag] = type; + } + } + + for (index = 0, length = arguments.length; index < length; index += 1) { + arguments[index].forEach(collectType); + } + return result; +} + + +function Schema$1(definition) { + return this.extend(definition); +} + + +Schema$1.prototype.extend = function extend(definition) { + var implicit = []; + var explicit = []; + + if (definition instanceof type) { + // Schema.extend(type) + explicit.push(definition); + + } else if (Array.isArray(definition)) { + // Schema.extend([ type1, type2, ... ]) + explicit = explicit.concat(definition); + + } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) { + // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] }) + if (definition.implicit) implicit = implicit.concat(definition.implicit); + if (definition.explicit) explicit = explicit.concat(definition.explicit); + + } else { + throw new exception('Schema.extend argument should be a Type, [ Type ], ' + + 'or a schema definition ({ implicit: [...], explicit: [...] })'); + } + + implicit.forEach(function (type$1) { + if (!(type$1 instanceof type)) { + throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.'); + } + + if (type$1.loadKind && type$1.loadKind !== 'scalar') { + throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.'); + } + + if (type$1.multi) { + throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.'); + } + }); + + explicit.forEach(function (type$1) { + if (!(type$1 instanceof type)) { + throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.'); + } + }); + + var result = Object.create(Schema$1.prototype); + + result.implicit = (this.implicit || []).concat(implicit); + result.explicit = (this.explicit || []).concat(explicit); + + result.compiledImplicit = compileList(result, 'implicit'); + result.compiledExplicit = compileList(result, 'explicit'); + result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit); + + return result; +}; + + +var schema = Schema$1; + +var str = new type('tag:yaml.org,2002:str', { + kind: 'scalar', + construct: function (data) { return data !== null ? data : ''; } +}); + +var seq = new type('tag:yaml.org,2002:seq', { + kind: 'sequence', + construct: function (data) { return data !== null ? data : []; } +}); + +var map = new type('tag:yaml.org,2002:map', { + kind: 'mapping', + construct: function (data) { return data !== null ? data : {}; } +}); + +var failsafe = new schema({ + explicit: [ + str, + seq, + map + ] +}); + +function resolveYamlNull(data) { + if (data === null) return true; + + var max = data.length; + + return (max === 1 && data === '~') || + (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL')); +} + +function constructYamlNull() { + return null; +} + +function isNull(object) { + return object === null; +} + +var _null = new type('tag:yaml.org,2002:null', { + kind: 'scalar', + resolve: resolveYamlNull, + construct: constructYamlNull, + predicate: isNull, + represent: { + canonical: function () { return '~'; }, + lowercase: function () { return 'null'; }, + uppercase: function () { return 'NULL'; }, + camelcase: function () { return 'Null'; }, + empty: function () { return ''; } + }, + defaultStyle: 'lowercase' +}); + +function resolveYamlBoolean(data) { + if (data === null) return false; + + var max = data.length; + + return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) || + (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE')); +} + +function constructYamlBoolean(data) { + return data === 'true' || + data === 'True' || + data === 'TRUE'; +} + +function isBoolean(object) { + return Object.prototype.toString.call(object) === '[object Boolean]'; +} + +var bool = new type('tag:yaml.org,2002:bool', { + kind: 'scalar', + resolve: resolveYamlBoolean, + construct: constructYamlBoolean, + predicate: isBoolean, + represent: { + lowercase: function (object) { return object ? 'true' : 'false'; }, + uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; }, + camelcase: function (object) { return object ? 'True' : 'False'; } + }, + defaultStyle: 'lowercase' +}); + +function isHexCode(c) { + return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) || + ((0x41/* A */ <= c) && (c <= 0x46/* F */)) || + ((0x61/* a */ <= c) && (c <= 0x66/* f */)); +} + +function isOctCode(c) { + return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */)); +} + +function isDecCode(c) { + return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)); +} + +function resolveYamlInteger(data) { + if (data === null) return false; + + var max = data.length, + index = 0, + hasDigits = false, + ch; + + if (!max) return false; + + ch = data[index]; + + // sign + if (ch === '-' || ch === '+') { + ch = data[++index]; + } + + if (ch === '0') { + // 0 + if (index + 1 === max) return true; + ch = data[++index]; + + // base 2, base 8, base 16 + + if (ch === 'b') { + // base 2 + index++; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (ch !== '0' && ch !== '1') return false; + hasDigits = true; + } + return hasDigits && ch !== '_'; + } + + + if (ch === 'x') { + // base 16 + index++; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (!isHexCode(data.charCodeAt(index))) return false; + hasDigits = true; + } + return hasDigits && ch !== '_'; + } + + + if (ch === 'o') { + // base 8 + index++; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (!isOctCode(data.charCodeAt(index))) return false; + hasDigits = true; + } + return hasDigits && ch !== '_'; + } + } + + // base 10 (except 0) + + // value should not start with `_`; + if (ch === '_') return false; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (!isDecCode(data.charCodeAt(index))) { + return false; + } + hasDigits = true; + } + + // Should have digits and should not end with `_` + if (!hasDigits || ch === '_') return false; + + return true; +} + +function constructYamlInteger(data) { + var value = data, sign = 1, ch; + + if (value.indexOf('_') !== -1) { + value = value.replace(/_/g, ''); + } + + ch = value[0]; + + if (ch === '-' || ch === '+') { + if (ch === '-') sign = -1; + value = value.slice(1); + ch = value[0]; + } + + if (value === '0') return 0; + + if (ch === '0') { + if (value[1] === 'b') return sign * parseInt(value.slice(2), 2); + if (value[1] === 'x') return sign * parseInt(value.slice(2), 16); + if (value[1] === 'o') return sign * parseInt(value.slice(2), 8); + } + + return sign * parseInt(value, 10); +} + +function isInteger(object) { + return (Object.prototype.toString.call(object)) === '[object Number]' && + (object % 1 === 0 && !common.isNegativeZero(object)); +} + +var int = new type('tag:yaml.org,2002:int', { + kind: 'scalar', + resolve: resolveYamlInteger, + construct: constructYamlInteger, + predicate: isInteger, + represent: { + binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); }, + octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); }, + decimal: function (obj) { return obj.toString(10); }, + /* eslint-disable max-len */ + hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); } + }, + defaultStyle: 'decimal', + styleAliases: { + binary: [ 2, 'bin' ], + octal: [ 8, 'oct' ], + decimal: [ 10, 'dec' ], + hexadecimal: [ 16, 'hex' ] + } +}); + +var YAML_FLOAT_PATTERN = new RegExp( + // 2.5e4, 2.5 and integers + '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + + // .2e4, .2 + // special case, seems not from spec + '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + + // .inf + '|[-+]?\\.(?:inf|Inf|INF)' + + // .nan + '|\\.(?:nan|NaN|NAN))$'); + +function resolveYamlFloat(data) { + if (data === null) return false; + + if (!YAML_FLOAT_PATTERN.test(data) || + // Quick hack to not allow integers end with `_` + // Probably should update regexp & check speed + data[data.length - 1] === '_') { + return false; + } + + return true; +} + +function constructYamlFloat(data) { + var value, sign; + + value = data.replace(/_/g, '').toLowerCase(); + sign = value[0] === '-' ? -1 : 1; + + if ('+-'.indexOf(value[0]) >= 0) { + value = value.slice(1); + } + + if (value === '.inf') { + return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; + + } else if (value === '.nan') { + return NaN; + } + return sign * parseFloat(value, 10); +} + + +var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; + +function representYamlFloat(object, style) { + var res; + + if (isNaN(object)) { + switch (style) { + case 'lowercase': return '.nan'; + case 'uppercase': return '.NAN'; + case 'camelcase': return '.NaN'; + } + } else if (Number.POSITIVE_INFINITY === object) { + switch (style) { + case 'lowercase': return '.inf'; + case 'uppercase': return '.INF'; + case 'camelcase': return '.Inf'; + } + } else if (Number.NEGATIVE_INFINITY === object) { + switch (style) { + case 'lowercase': return '-.inf'; + case 'uppercase': return '-.INF'; + case 'camelcase': return '-.Inf'; + } + } else if (common.isNegativeZero(object)) { + return '-0.0'; + } + + res = object.toString(10); + + // JS stringifier can build scientific format without dots: 5e-100, + // while YAML requres dot: 5.e-100. Fix it with simple hack + + return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res; +} + +function isFloat(object) { + return (Object.prototype.toString.call(object) === '[object Number]') && + (object % 1 !== 0 || common.isNegativeZero(object)); +} + +var float = new type('tag:yaml.org,2002:float', { + kind: 'scalar', + resolve: resolveYamlFloat, + construct: constructYamlFloat, + predicate: isFloat, + represent: representYamlFloat, + defaultStyle: 'lowercase' +}); + +var json = failsafe.extend({ + implicit: [ + _null, + bool, + int, + float + ] +}); + +var core = json; + +var YAML_DATE_REGEXP = new RegExp( + '^([0-9][0-9][0-9][0-9])' + // [1] year + '-([0-9][0-9])' + // [2] month + '-([0-9][0-9])$'); // [3] day + +var YAML_TIMESTAMP_REGEXP = new RegExp( + '^([0-9][0-9][0-9][0-9])' + // [1] year + '-([0-9][0-9]?)' + // [2] month + '-([0-9][0-9]?)' + // [3] day + '(?:[Tt]|[ \\t]+)' + // ... + '([0-9][0-9]?)' + // [4] hour + ':([0-9][0-9])' + // [5] minute + ':([0-9][0-9])' + // [6] second + '(?:\\.([0-9]*))?' + // [7] fraction + '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour + '(?::([0-9][0-9]))?))?$'); // [11] tz_minute + +function resolveYamlTimestamp(data) { + if (data === null) return false; + if (YAML_DATE_REGEXP.exec(data) !== null) return true; + if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; + return false; +} + +function constructYamlTimestamp(data) { + var match, year, month, day, hour, minute, second, fraction = 0, + delta = null, tz_hour, tz_minute, date; + + match = YAML_DATE_REGEXP.exec(data); + if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); + + if (match === null) throw new Error('Date resolve error'); + + // match: [1] year [2] month [3] day + + year = +(match[1]); + month = +(match[2]) - 1; // JS month starts with 0 + day = +(match[3]); + + if (!match[4]) { // no hour + return new Date(Date.UTC(year, month, day)); + } + + // match: [4] hour [5] minute [6] second [7] fraction + + hour = +(match[4]); + minute = +(match[5]); + second = +(match[6]); + + if (match[7]) { + fraction = match[7].slice(0, 3); + while (fraction.length < 3) { // milli-seconds + fraction += '0'; + } + fraction = +fraction; + } + + // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute + + if (match[9]) { + tz_hour = +(match[10]); + tz_minute = +(match[11] || 0); + delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds + if (match[9] === '-') delta = -delta; + } + + date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); + + if (delta) date.setTime(date.getTime() - delta); + + return date; +} + +function representYamlTimestamp(object /*, style*/) { + return object.toISOString(); +} + +var timestamp = new type('tag:yaml.org,2002:timestamp', { + kind: 'scalar', + resolve: resolveYamlTimestamp, + construct: constructYamlTimestamp, + instanceOf: Date, + represent: representYamlTimestamp +}); + +function resolveYamlMerge(data) { + return data === '<<' || data === null; +} + +var merge = new type('tag:yaml.org,2002:merge', { + kind: 'scalar', + resolve: resolveYamlMerge +}); + +/*eslint-disable no-bitwise*/ + + + + + +// [ 64, 65, 66 ] -> [ padding, CR, LF ] +var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; + + +function resolveYamlBinary(data) { + if (data === null) return false; + + var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP; + + // Convert one by one. + for (idx = 0; idx < max; idx++) { + code = map.indexOf(data.charAt(idx)); + + // Skip CR/LF + if (code > 64) continue; + + // Fail on illegal characters + if (code < 0) return false; + + bitlen += 6; + } + + // If there are any bits left, source was corrupted + return (bitlen % 8) === 0; +} + +function constructYamlBinary(data) { + var idx, tailbits, + input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan + max = input.length, + map = BASE64_MAP, + bits = 0, + result = []; + + // Collect by 6*4 bits (3 bytes) + + for (idx = 0; idx < max; idx++) { + if ((idx % 4 === 0) && idx) { + result.push((bits >> 16) & 0xFF); + result.push((bits >> 8) & 0xFF); + result.push(bits & 0xFF); + } + + bits = (bits << 6) | map.indexOf(input.charAt(idx)); + } + + // Dump tail + + tailbits = (max % 4) * 6; + + if (tailbits === 0) { + result.push((bits >> 16) & 0xFF); + result.push((bits >> 8) & 0xFF); + result.push(bits & 0xFF); + } else if (tailbits === 18) { + result.push((bits >> 10) & 0xFF); + result.push((bits >> 2) & 0xFF); + } else if (tailbits === 12) { + result.push((bits >> 4) & 0xFF); + } + + return new Uint8Array(result); +} + +function representYamlBinary(object /*, style*/) { + var result = '', bits = 0, idx, tail, + max = object.length, + map = BASE64_MAP; + + // Convert every three bytes to 4 ASCII characters. + + for (idx = 0; idx < max; idx++) { + if ((idx % 3 === 0) && idx) { + result += map[(bits >> 18) & 0x3F]; + result += map[(bits >> 12) & 0x3F]; + result += map[(bits >> 6) & 0x3F]; + result += map[bits & 0x3F]; + } + + bits = (bits << 8) + object[idx]; + } + + // Dump tail + + tail = max % 3; + + if (tail === 0) { + result += map[(bits >> 18) & 0x3F]; + result += map[(bits >> 12) & 0x3F]; + result += map[(bits >> 6) & 0x3F]; + result += map[bits & 0x3F]; + } else if (tail === 2) { + result += map[(bits >> 10) & 0x3F]; + result += map[(bits >> 4) & 0x3F]; + result += map[(bits << 2) & 0x3F]; + result += map[64]; + } else if (tail === 1) { + result += map[(bits >> 2) & 0x3F]; + result += map[(bits << 4) & 0x3F]; + result += map[64]; + result += map[64]; + } + + return result; +} + +function isBinary(obj) { + return Object.prototype.toString.call(obj) === '[object Uint8Array]'; +} + +var binary = new type('tag:yaml.org,2002:binary', { + kind: 'scalar', + resolve: resolveYamlBinary, + construct: constructYamlBinary, + predicate: isBinary, + represent: representYamlBinary +}); + +var _hasOwnProperty$3 = Object.prototype.hasOwnProperty; +var _toString$2 = Object.prototype.toString; + +function resolveYamlOmap(data) { + if (data === null) return true; + + var objectKeys = [], index, length, pair, pairKey, pairHasKey, + object = data; + + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + pairHasKey = false; + + if (_toString$2.call(pair) !== '[object Object]') return false; + + for (pairKey in pair) { + if (_hasOwnProperty$3.call(pair, pairKey)) { + if (!pairHasKey) pairHasKey = true; + else return false; + } + } + + if (!pairHasKey) return false; + + if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey); + else return false; + } + + return true; +} + +function constructYamlOmap(data) { + return data !== null ? data : []; +} + +var omap = new type('tag:yaml.org,2002:omap', { + kind: 'sequence', + resolve: resolveYamlOmap, + construct: constructYamlOmap +}); + +var _toString$1 = Object.prototype.toString; + +function resolveYamlPairs(data) { + if (data === null) return true; + + var index, length, pair, keys, result, + object = data; + + result = new Array(object.length); + + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + + if (_toString$1.call(pair) !== '[object Object]') return false; + + keys = Object.keys(pair); + + if (keys.length !== 1) return false; + + result[index] = [ keys[0], pair[keys[0]] ]; + } + + return true; +} + +function constructYamlPairs(data) { + if (data === null) return []; + + var index, length, pair, keys, result, + object = data; + + result = new Array(object.length); + + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + + keys = Object.keys(pair); + + result[index] = [ keys[0], pair[keys[0]] ]; + } + + return result; +} + +var pairs = new type('tag:yaml.org,2002:pairs', { + kind: 'sequence', + resolve: resolveYamlPairs, + construct: constructYamlPairs +}); + +var _hasOwnProperty$2 = Object.prototype.hasOwnProperty; + +function resolveYamlSet(data) { + if (data === null) return true; + + var key, object = data; + + for (key in object) { + if (_hasOwnProperty$2.call(object, key)) { + if (object[key] !== null) return false; + } + } + + return true; +} + +function constructYamlSet(data) { + return data !== null ? data : {}; +} + +var set = new type('tag:yaml.org,2002:set', { + kind: 'mapping', + resolve: resolveYamlSet, + construct: constructYamlSet +}); + +var _default = core.extend({ + implicit: [ + timestamp, + merge + ], + explicit: [ + binary, + omap, + pairs, + set + ] +}); + +/*eslint-disable max-len,no-use-before-define*/ + + + + + + + +var _hasOwnProperty$1 = Object.prototype.hasOwnProperty; + + +var CONTEXT_FLOW_IN = 1; +var CONTEXT_FLOW_OUT = 2; +var CONTEXT_BLOCK_IN = 3; +var CONTEXT_BLOCK_OUT = 4; + + +var CHOMPING_CLIP = 1; +var CHOMPING_STRIP = 2; +var CHOMPING_KEEP = 3; + + +var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; +var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; +var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; +var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; +var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; + + +function _class(obj) { return Object.prototype.toString.call(obj); } + +function is_EOL(c) { + return (c === 0x0A/* LF */) || (c === 0x0D/* CR */); +} + +function is_WHITE_SPACE(c) { + return (c === 0x09/* Tab */) || (c === 0x20/* Space */); +} + +function is_WS_OR_EOL(c) { + return (c === 0x09/* Tab */) || + (c === 0x20/* Space */) || + (c === 0x0A/* LF */) || + (c === 0x0D/* CR */); +} + +function is_FLOW_INDICATOR(c) { + return c === 0x2C/* , */ || + c === 0x5B/* [ */ || + c === 0x5D/* ] */ || + c === 0x7B/* { */ || + c === 0x7D/* } */; +} + +function fromHexCode(c) { + var lc; + + if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { + return c - 0x30; + } + + /*eslint-disable no-bitwise*/ + lc = c | 0x20; + + if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) { + return lc - 0x61 + 10; + } + + return -1; +} + +function escapedHexLen(c) { + if (c === 0x78/* x */) { return 2; } + if (c === 0x75/* u */) { return 4; } + if (c === 0x55/* U */) { return 8; } + return 0; +} + +function fromDecimalCode(c) { + if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { + return c - 0x30; + } + + return -1; +} + +function simpleEscapeSequence(c) { + /* eslint-disable indent */ + return (c === 0x30/* 0 */) ? '\x00' : + (c === 0x61/* a */) ? '\x07' : + (c === 0x62/* b */) ? '\x08' : + (c === 0x74/* t */) ? '\x09' : + (c === 0x09/* Tab */) ? '\x09' : + (c === 0x6E/* n */) ? '\x0A' : + (c === 0x76/* v */) ? '\x0B' : + (c === 0x66/* f */) ? '\x0C' : + (c === 0x72/* r */) ? '\x0D' : + (c === 0x65/* e */) ? '\x1B' : + (c === 0x20/* Space */) ? ' ' : + (c === 0x22/* " */) ? '\x22' : + (c === 0x2F/* / */) ? '/' : + (c === 0x5C/* \ */) ? '\x5C' : + (c === 0x4E/* N */) ? '\x85' : + (c === 0x5F/* _ */) ? '\xA0' : + (c === 0x4C/* L */) ? '\u2028' : + (c === 0x50/* P */) ? '\u2029' : ''; +} + +function charFromCodepoint(c) { + if (c <= 0xFFFF) { + return String.fromCharCode(c); + } + // Encode UTF-16 surrogate pair + // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF + return String.fromCharCode( + ((c - 0x010000) >> 10) + 0xD800, + ((c - 0x010000) & 0x03FF) + 0xDC00 + ); +} + +var simpleEscapeCheck = new Array(256); // integer, for fast access +var simpleEscapeMap = new Array(256); +for (var i = 0; i < 256; i++) { + simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; + simpleEscapeMap[i] = simpleEscapeSequence(i); +} + + +function State$1(input, options) { + this.input = input; + + this.filename = options['filename'] || null; + this.schema = options['schema'] || _default; + this.onWarning = options['onWarning'] || null; + // (Hidden) Remove? makes the loader to expect YAML 1.1 documents + // if such documents have no explicit %YAML directive + this.legacy = options['legacy'] || false; + + this.json = options['json'] || false; + this.listener = options['listener'] || null; + + this.implicitTypes = this.schema.compiledImplicit; + this.typeMap = this.schema.compiledTypeMap; + + this.length = input.length; + this.position = 0; + this.line = 0; + this.lineStart = 0; + this.lineIndent = 0; + + // position of first leading tab in the current line, + // used to make sure there are no tabs in the indentation + this.firstTabInLine = -1; + + this.documents = []; + + /* + this.version; + this.checkLineBreaks; + this.tagMap; + this.anchorMap; + this.tag; + this.anchor; + this.kind; + this.result;*/ + +} + + +function generateError(state, message) { + var mark = { + name: state.filename, + buffer: state.input.slice(0, -1), // omit trailing \0 + position: state.position, + line: state.line, + column: state.position - state.lineStart + }; + + mark.snippet = snippet(mark); + + return new exception(message, mark); +} + +function throwError(state, message) { + throw generateError(state, message); +} + +function throwWarning(state, message) { + if (state.onWarning) { + state.onWarning.call(null, generateError(state, message)); + } +} + + +var directiveHandlers = { + + YAML: function handleYamlDirective(state, name, args) { + + var match, major, minor; + + if (state.version !== null) { + throwError(state, 'duplication of %YAML directive'); + } + + if (args.length !== 1) { + throwError(state, 'YAML directive accepts exactly one argument'); + } + + match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); + + if (match === null) { + throwError(state, 'ill-formed argument of the YAML directive'); + } + + major = parseInt(match[1], 10); + minor = parseInt(match[2], 10); + + if (major !== 1) { + throwError(state, 'unacceptable YAML version of the document'); + } + + state.version = args[0]; + state.checkLineBreaks = (minor < 2); + + if (minor !== 1 && minor !== 2) { + throwWarning(state, 'unsupported YAML version of the document'); + } + }, + + TAG: function handleTagDirective(state, name, args) { + + var handle, prefix; + + if (args.length !== 2) { + throwError(state, 'TAG directive accepts exactly two arguments'); + } + + handle = args[0]; + prefix = args[1]; + + if (!PATTERN_TAG_HANDLE.test(handle)) { + throwError(state, 'ill-formed tag handle (first argument) of the TAG directive'); + } + + if (_hasOwnProperty$1.call(state.tagMap, handle)) { + throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); + } + + if (!PATTERN_TAG_URI.test(prefix)) { + throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive'); + } + + try { + prefix = decodeURIComponent(prefix); + } catch (err) { + throwError(state, 'tag prefix is malformed: ' + prefix); + } + + state.tagMap[handle] = prefix; + } +}; + + +function captureSegment(state, start, end, checkJson) { + var _position, _length, _character, _result; + + if (start < end) { + _result = state.input.slice(start, end); + + if (checkJson) { + for (_position = 0, _length = _result.length; _position < _length; _position += 1) { + _character = _result.charCodeAt(_position); + if (!(_character === 0x09 || + (0x20 <= _character && _character <= 0x10FFFF))) { + throwError(state, 'expected valid JSON character'); + } + } + } else if (PATTERN_NON_PRINTABLE.test(_result)) { + throwError(state, 'the stream contains non-printable characters'); + } + + state.result += _result; + } +} + +function mergeMappings(state, destination, source, overridableKeys) { + var sourceKeys, key, index, quantity; + + if (!common.isObject(source)) { + throwError(state, 'cannot merge mappings; the provided source object is unacceptable'); + } + + sourceKeys = Object.keys(source); + + for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { + key = sourceKeys[index]; + + if (!_hasOwnProperty$1.call(destination, key)) { + destination[key] = source[key]; + overridableKeys[key] = true; + } + } +} + +function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, + startLine, startLineStart, startPos) { + + var index, quantity; + + // The output is a plain object here, so keys can only be strings. + // We need to convert keyNode to a string, but doing so can hang the process + // (deeply nested arrays that explode exponentially using aliases). + if (Array.isArray(keyNode)) { + keyNode = Array.prototype.slice.call(keyNode); + + for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { + if (Array.isArray(keyNode[index])) { + throwError(state, 'nested arrays are not supported inside keys'); + } + + if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') { + keyNode[index] = '[object Object]'; + } + } + } + + // Avoid code execution in load() via toString property + // (still use its own toString for arrays, timestamps, + // and whatever user schema extensions happen to have @@toStringTag) + if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') { + keyNode = '[object Object]'; + } + + + keyNode = String(keyNode); + + if (_result === null) { + _result = {}; + } + + if (keyTag === 'tag:yaml.org,2002:merge') { + if (Array.isArray(valueNode)) { + for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { + mergeMappings(state, _result, valueNode[index], overridableKeys); + } + } else { + mergeMappings(state, _result, valueNode, overridableKeys); + } + } else { + if (!state.json && + !_hasOwnProperty$1.call(overridableKeys, keyNode) && + _hasOwnProperty$1.call(_result, keyNode)) { + state.line = startLine || state.line; + state.lineStart = startLineStart || state.lineStart; + state.position = startPos || state.position; + throwError(state, 'duplicated mapping key'); + } + + // used for this specific key only because Object.defineProperty is slow + if (keyNode === '__proto__') { + Object.defineProperty(_result, keyNode, { + configurable: true, + enumerable: true, + writable: true, + value: valueNode + }); + } else { + _result[keyNode] = valueNode; + } + delete overridableKeys[keyNode]; + } + + return _result; +} + +function readLineBreak(state) { + var ch; + + ch = state.input.charCodeAt(state.position); + + if (ch === 0x0A/* LF */) { + state.position++; + } else if (ch === 0x0D/* CR */) { + state.position++; + if (state.input.charCodeAt(state.position) === 0x0A/* LF */) { + state.position++; + } + } else { + throwError(state, 'a line break is expected'); + } + + state.line += 1; + state.lineStart = state.position; + state.firstTabInLine = -1; +} + +function skipSeparationSpace(state, allowComments, checkIndent) { + var lineBreaks = 0, + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) { + state.firstTabInLine = state.position; + } + ch = state.input.charCodeAt(++state.position); + } + + if (allowComments && ch === 0x23/* # */) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0); + } + + if (is_EOL(ch)) { + readLineBreak(state); + + ch = state.input.charCodeAt(state.position); + lineBreaks++; + state.lineIndent = 0; + + while (ch === 0x20/* Space */) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); + } + } else { + break; + } + } + + if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { + throwWarning(state, 'deficient indentation'); + } + + return lineBreaks; +} + +function testDocumentSeparator(state) { + var _position = state.position, + ch; + + ch = state.input.charCodeAt(_position); + + // Condition state.position === state.lineStart is tested + // in parent on each call, for efficiency. No needs to test here again. + if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) && + ch === state.input.charCodeAt(_position + 1) && + ch === state.input.charCodeAt(_position + 2)) { + + _position += 3; + + ch = state.input.charCodeAt(_position); + + if (ch === 0 || is_WS_OR_EOL(ch)) { + return true; + } + } + + return false; +} + +function writeFoldedLines(state, count) { + if (count === 1) { + state.result += ' '; + } else if (count > 1) { + state.result += common.repeat('\n', count - 1); + } +} + + +function readPlainScalar(state, nodeIndent, withinFlowCollection) { + var preceding, + following, + captureStart, + captureEnd, + hasPendingContent, + _line, + _lineStart, + _lineIndent, + _kind = state.kind, + _result = state.result, + ch; + + ch = state.input.charCodeAt(state.position); + + if (is_WS_OR_EOL(ch) || + is_FLOW_INDICATOR(ch) || + ch === 0x23/* # */ || + ch === 0x26/* & */ || + ch === 0x2A/* * */ || + ch === 0x21/* ! */ || + ch === 0x7C/* | */ || + ch === 0x3E/* > */ || + ch === 0x27/* ' */ || + ch === 0x22/* " */ || + ch === 0x25/* % */ || + ch === 0x40/* @ */ || + ch === 0x60/* ` */) { + return false; + } + + if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) { + following = state.input.charCodeAt(state.position + 1); + + if (is_WS_OR_EOL(following) || + withinFlowCollection && is_FLOW_INDICATOR(following)) { + return false; + } + } + + state.kind = 'scalar'; + state.result = ''; + captureStart = captureEnd = state.position; + hasPendingContent = false; + + while (ch !== 0) { + if (ch === 0x3A/* : */) { + following = state.input.charCodeAt(state.position + 1); + + if (is_WS_OR_EOL(following) || + withinFlowCollection && is_FLOW_INDICATOR(following)) { + break; + } + + } else if (ch === 0x23/* # */) { + preceding = state.input.charCodeAt(state.position - 1); + + if (is_WS_OR_EOL(preceding)) { + break; + } + + } else if ((state.position === state.lineStart && testDocumentSeparator(state)) || + withinFlowCollection && is_FLOW_INDICATOR(ch)) { + break; + + } else if (is_EOL(ch)) { + _line = state.line; + _lineStart = state.lineStart; + _lineIndent = state.lineIndent; + skipSeparationSpace(state, false, -1); + + if (state.lineIndent >= nodeIndent) { + hasPendingContent = true; + ch = state.input.charCodeAt(state.position); + continue; + } else { + state.position = captureEnd; + state.line = _line; + state.lineStart = _lineStart; + state.lineIndent = _lineIndent; + break; + } + } + + if (hasPendingContent) { + captureSegment(state, captureStart, captureEnd, false); + writeFoldedLines(state, state.line - _line); + captureStart = captureEnd = state.position; + hasPendingContent = false; + } + + if (!is_WHITE_SPACE(ch)) { + captureEnd = state.position + 1; + } + + ch = state.input.charCodeAt(++state.position); + } + + captureSegment(state, captureStart, captureEnd, false); + + if (state.result) { + return true; + } + + state.kind = _kind; + state.result = _result; + return false; +} + +function readSingleQuotedScalar(state, nodeIndent) { + var ch, + captureStart, captureEnd; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x27/* ' */) { + return false; + } + + state.kind = 'scalar'; + state.result = ''; + state.position++; + captureStart = captureEnd = state.position; + + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + if (ch === 0x27/* ' */) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + + if (ch === 0x27/* ' */) { + captureStart = state.position; + state.position++; + captureEnd = state.position; + } else { + return true; + } + + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, 'unexpected end of the document within a single quoted scalar'); + + } else { + state.position++; + captureEnd = state.position; + } + } + + throwError(state, 'unexpected end of the stream within a single quoted scalar'); +} + +function readDoubleQuotedScalar(state, nodeIndent) { + var captureStart, + captureEnd, + hexLength, + hexResult, + tmp, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x22/* " */) { + return false; + } + + state.kind = 'scalar'; + state.result = ''; + state.position++; + captureStart = captureEnd = state.position; + + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + if (ch === 0x22/* " */) { + captureSegment(state, captureStart, state.position, true); + state.position++; + return true; + + } else if (ch === 0x5C/* \ */) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + + if (is_EOL(ch)) { + skipSeparationSpace(state, false, nodeIndent); + + // TODO: rework to inline fn with no type cast? + } else if (ch < 256 && simpleEscapeCheck[ch]) { + state.result += simpleEscapeMap[ch]; + state.position++; + + } else if ((tmp = escapedHexLen(ch)) > 0) { + hexLength = tmp; + hexResult = 0; + + for (; hexLength > 0; hexLength--) { + ch = state.input.charCodeAt(++state.position); + + if ((tmp = fromHexCode(ch)) >= 0) { + hexResult = (hexResult << 4) + tmp; + + } else { + throwError(state, 'expected hexadecimal character'); + } + } + + state.result += charFromCodepoint(hexResult); + + state.position++; + + } else { + throwError(state, 'unknown escape sequence'); + } + + captureStart = captureEnd = state.position; + + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, 'unexpected end of the document within a double quoted scalar'); + + } else { + state.position++; + captureEnd = state.position; + } + } + + throwError(state, 'unexpected end of the stream within a double quoted scalar'); +} + +function readFlowCollection(state, nodeIndent) { + var readNext = true, + _line, + _lineStart, + _pos, + _tag = state.tag, + _result, + _anchor = state.anchor, + following, + terminator, + isPair, + isExplicitPair, + isMapping, + overridableKeys = Object.create(null), + keyNode, + keyTag, + valueNode, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch === 0x5B/* [ */) { + terminator = 0x5D;/* ] */ + isMapping = false; + _result = []; + } else if (ch === 0x7B/* { */) { + terminator = 0x7D;/* } */ + isMapping = true; + _result = {}; + } else { + return false; + } + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + + ch = state.input.charCodeAt(++state.position); + + while (ch !== 0) { + skipSeparationSpace(state, true, nodeIndent); + + ch = state.input.charCodeAt(state.position); + + if (ch === terminator) { + state.position++; + state.tag = _tag; + state.anchor = _anchor; + state.kind = isMapping ? 'mapping' : 'sequence'; + state.result = _result; + return true; + } else if (!readNext) { + throwError(state, 'missed comma between flow collection entries'); + } else if (ch === 0x2C/* , */) { + // "flow collection entries can never be completely empty", as per YAML 1.2, section 7.4 + throwError(state, "expected the node content, but found ','"); + } + + keyTag = keyNode = valueNode = null; + isPair = isExplicitPair = false; + + if (ch === 0x3F/* ? */) { + following = state.input.charCodeAt(state.position + 1); + + if (is_WS_OR_EOL(following)) { + isPair = isExplicitPair = true; + state.position++; + skipSeparationSpace(state, true, nodeIndent); + } + } + + _line = state.line; // Save the current line. + _lineStart = state.lineStart; + _pos = state.position; + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + keyTag = state.tag; + keyNode = state.result; + skipSeparationSpace(state, true, nodeIndent); + + ch = state.input.charCodeAt(state.position); + + if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) { + isPair = true; + ch = state.input.charCodeAt(++state.position); + skipSeparationSpace(state, true, nodeIndent); + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + valueNode = state.result; + } + + if (isMapping) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos); + } else if (isPair) { + _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos)); + } else { + _result.push(keyNode); + } + + skipSeparationSpace(state, true, nodeIndent); + + ch = state.input.charCodeAt(state.position); + + if (ch === 0x2C/* , */) { + readNext = true; + ch = state.input.charCodeAt(++state.position); + } else { + readNext = false; + } + } + + throwError(state, 'unexpected end of the stream within a flow collection'); +} + +function readBlockScalar(state, nodeIndent) { + var captureStart, + folding, + chomping = CHOMPING_CLIP, + didReadContent = false, + detectedIndent = false, + textIndent = nodeIndent, + emptyLines = 0, + atMoreIndented = false, + tmp, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch === 0x7C/* | */) { + folding = false; + } else if (ch === 0x3E/* > */) { + folding = true; + } else { + return false; + } + + state.kind = 'scalar'; + state.result = ''; + + while (ch !== 0) { + ch = state.input.charCodeAt(++state.position); + + if (ch === 0x2B/* + */ || ch === 0x2D/* - */) { + if (CHOMPING_CLIP === chomping) { + chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP; + } else { + throwError(state, 'repeat of a chomping mode identifier'); + } + + } else if ((tmp = fromDecimalCode(ch)) >= 0) { + if (tmp === 0) { + throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one'); + } else if (!detectedIndent) { + textIndent = nodeIndent + tmp - 1; + detectedIndent = true; + } else { + throwError(state, 'repeat of an indentation width identifier'); + } + + } else { + break; + } + } + + if (is_WHITE_SPACE(ch)) { + do { ch = state.input.charCodeAt(++state.position); } + while (is_WHITE_SPACE(ch)); + + if (ch === 0x23/* # */) { + do { ch = state.input.charCodeAt(++state.position); } + while (!is_EOL(ch) && (ch !== 0)); + } + } + + while (ch !== 0) { + readLineBreak(state); + state.lineIndent = 0; + + ch = state.input.charCodeAt(state.position); + + while ((!detectedIndent || state.lineIndent < textIndent) && + (ch === 0x20/* Space */)) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); + } + + if (!detectedIndent && state.lineIndent > textIndent) { + textIndent = state.lineIndent; + } + + if (is_EOL(ch)) { + emptyLines++; + continue; + } + + // End of the scalar. + if (state.lineIndent < textIndent) { + + // Perform the chomping. + if (chomping === CHOMPING_KEEP) { + state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + } else if (chomping === CHOMPING_CLIP) { + if (didReadContent) { // i.e. only if the scalar is not empty. + state.result += '\n'; + } + } + + // Break this `while` cycle and go to the funciton's epilogue. + break; + } + + // Folded style: use fancy rules to handle line breaks. + if (folding) { + + // Lines starting with white space characters (more-indented lines) are not folded. + if (is_WHITE_SPACE(ch)) { + atMoreIndented = true; + // except for the first content line (cf. Example 8.1) + state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + + // End of more-indented block. + } else if (atMoreIndented) { + atMoreIndented = false; + state.result += common.repeat('\n', emptyLines + 1); + + // Just one line break - perceive as the same line. + } else if (emptyLines === 0) { + if (didReadContent) { // i.e. only if we have already read some scalar content. + state.result += ' '; + } + + // Several line breaks - perceive as different lines. + } else { + state.result += common.repeat('\n', emptyLines); + } + + // Literal style: just add exact number of line breaks between content lines. + } else { + // Keep all line breaks except the header line break. + state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + } + + didReadContent = true; + detectedIndent = true; + emptyLines = 0; + captureStart = state.position; + + while (!is_EOL(ch) && (ch !== 0)) { + ch = state.input.charCodeAt(++state.position); + } + + captureSegment(state, captureStart, state.position, false); + } + + return true; +} + +function readBlockSequence(state, nodeIndent) { + var _line, + _tag = state.tag, + _anchor = state.anchor, + _result = [], + following, + detected = false, + ch; + + // there is a leading tab before this token, so it can't be a block sequence/mapping; + // it can still be flow sequence/mapping or a scalar + if (state.firstTabInLine !== -1) return false; + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + if (state.firstTabInLine !== -1) { + state.position = state.firstTabInLine; + throwError(state, 'tab characters must not be used in indentation'); + } + + if (ch !== 0x2D/* - */) { + break; + } + + following = state.input.charCodeAt(state.position + 1); + + if (!is_WS_OR_EOL(following)) { + break; + } + + detected = true; + state.position++; + + if (skipSeparationSpace(state, true, -1)) { + if (state.lineIndent <= nodeIndent) { + _result.push(null); + ch = state.input.charCodeAt(state.position); + continue; + } + } + + _line = state.line; + composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); + _result.push(state.result); + skipSeparationSpace(state, true, -1); + + ch = state.input.charCodeAt(state.position); + + if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) { + throwError(state, 'bad indentation of a sequence entry'); + } else if (state.lineIndent < nodeIndent) { + break; + } + } + + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = 'sequence'; + state.result = _result; + return true; + } + return false; +} + +function readBlockMapping(state, nodeIndent, flowIndent) { + var following, + allowCompact, + _line, + _keyLine, + _keyLineStart, + _keyPos, + _tag = state.tag, + _anchor = state.anchor, + _result = {}, + overridableKeys = Object.create(null), + keyTag = null, + keyNode = null, + valueNode = null, + atExplicitKey = false, + detected = false, + ch; + + // there is a leading tab before this token, so it can't be a block sequence/mapping; + // it can still be flow sequence/mapping or a scalar + if (state.firstTabInLine !== -1) return false; + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + if (!atExplicitKey && state.firstTabInLine !== -1) { + state.position = state.firstTabInLine; + throwError(state, 'tab characters must not be used in indentation'); + } + + following = state.input.charCodeAt(state.position + 1); + _line = state.line; // Save the current line. + + // + // Explicit notation case. There are two separate blocks: + // first for the key (denoted by "?") and second for the value (denoted by ":") + // + if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) { + + if (ch === 0x3F/* ? */) { + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + + detected = true; + atExplicitKey = true; + allowCompact = true; + + } else if (atExplicitKey) { + // i.e. 0x3A/* : */ === character after the explicit key. + atExplicitKey = false; + allowCompact = true; + + } else { + throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line'); + } + + state.position += 1; + ch = following; + + // + // Implicit notation case. Flow-style node as the key first, then ":", and the value. + // + } else { + _keyLine = state.line; + _keyLineStart = state.lineStart; + _keyPos = state.position; + + if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { + // Neither implicit nor explicit notation. + // Reading is done. Go to the epilogue. + break; + } + + if (state.line === _line) { + ch = state.input.charCodeAt(state.position); + + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + if (ch === 0x3A/* : */) { + ch = state.input.charCodeAt(++state.position); + + if (!is_WS_OR_EOL(ch)) { + throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); + } + + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + + detected = true; + atExplicitKey = false; + allowCompact = false; + keyTag = state.tag; + keyNode = state.result; + + } else if (detected) { + throwError(state, 'can not read an implicit mapping pair; a colon is missed'); + + } else { + state.tag = _tag; + state.anchor = _anchor; + return true; // Keep the result of `composeNode`. + } + + } else if (detected) { + throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key'); + + } else { + state.tag = _tag; + state.anchor = _anchor; + return true; // Keep the result of `composeNode`. + } + } + + // + // Common reading code for both explicit and implicit notations. + // + if (state.line === _line || state.lineIndent > nodeIndent) { + if (atExplicitKey) { + _keyLine = state.line; + _keyLineStart = state.lineStart; + _keyPos = state.position; + } + + if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { + if (atExplicitKey) { + keyNode = state.result; + } else { + valueNode = state.result; + } + } + + if (!atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + } + + if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) { + throwError(state, 'bad indentation of a mapping entry'); + } else if (state.lineIndent < nodeIndent) { + break; + } + } + + // + // Epilogue. + // + + // Special case: last mapping's node contains only the key in explicit notation. + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + } + + // Expose the resulting mapping. + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = 'mapping'; + state.result = _result; + } + + return detected; +} + +function readTagProperty(state) { + var _position, + isVerbatim = false, + isNamed = false, + tagHandle, + tagName, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x21/* ! */) return false; + + if (state.tag !== null) { + throwError(state, 'duplication of a tag property'); + } + + ch = state.input.charCodeAt(++state.position); + + if (ch === 0x3C/* < */) { + isVerbatim = true; + ch = state.input.charCodeAt(++state.position); + + } else if (ch === 0x21/* ! */) { + isNamed = true; + tagHandle = '!!'; + ch = state.input.charCodeAt(++state.position); + + } else { + tagHandle = '!'; + } + + _position = state.position; + + if (isVerbatim) { + do { ch = state.input.charCodeAt(++state.position); } + while (ch !== 0 && ch !== 0x3E/* > */); + + if (state.position < state.length) { + tagName = state.input.slice(_position, state.position); + ch = state.input.charCodeAt(++state.position); + } else { + throwError(state, 'unexpected end of the stream within a verbatim tag'); + } + } else { + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + + if (ch === 0x21/* ! */) { + if (!isNamed) { + tagHandle = state.input.slice(_position - 1, state.position + 1); + + if (!PATTERN_TAG_HANDLE.test(tagHandle)) { + throwError(state, 'named tag handle cannot contain such characters'); + } + + isNamed = true; + _position = state.position + 1; + } else { + throwError(state, 'tag suffix cannot contain exclamation marks'); + } + } + + ch = state.input.charCodeAt(++state.position); + } + + tagName = state.input.slice(_position, state.position); + + if (PATTERN_FLOW_INDICATORS.test(tagName)) { + throwError(state, 'tag suffix cannot contain flow indicator characters'); + } + } + + if (tagName && !PATTERN_TAG_URI.test(tagName)) { + throwError(state, 'tag name cannot contain such characters: ' + tagName); + } + + try { + tagName = decodeURIComponent(tagName); + } catch (err) { + throwError(state, 'tag name is malformed: ' + tagName); + } + + if (isVerbatim) { + state.tag = tagName; + + } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) { + state.tag = state.tagMap[tagHandle] + tagName; + + } else if (tagHandle === '!') { + state.tag = '!' + tagName; + + } else if (tagHandle === '!!') { + state.tag = 'tag:yaml.org,2002:' + tagName; + + } else { + throwError(state, 'undeclared tag handle "' + tagHandle + '"'); + } + + return true; +} + +function readAnchorProperty(state) { + var _position, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x26/* & */) return false; + + if (state.anchor !== null) { + throwError(state, 'duplication of an anchor property'); + } + + ch = state.input.charCodeAt(++state.position); + _position = state.position; + + while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + if (state.position === _position) { + throwError(state, 'name of an anchor node must contain at least one character'); + } + + state.anchor = state.input.slice(_position, state.position); + return true; +} + +function readAlias(state) { + var _position, alias, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x2A/* * */) return false; + + ch = state.input.charCodeAt(++state.position); + _position = state.position; + + while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + if (state.position === _position) { + throwError(state, 'name of an alias node must contain at least one character'); + } + + alias = state.input.slice(_position, state.position); + + if (!_hasOwnProperty$1.call(state.anchorMap, alias)) { + throwError(state, 'unidentified alias "' + alias + '"'); + } + + state.result = state.anchorMap[alias]; + skipSeparationSpace(state, true, -1); + return true; +} + +function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { + var allowBlockStyles, + allowBlockScalars, + allowBlockCollections, + indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) { + indentStatus = 1; + } else if (state.lineIndent === parentIndent) { + indentStatus = 0; + } else if (state.lineIndent < parentIndent) { + indentStatus = -1; + } + } + } + + if (indentStatus === 1) { + while (readTagProperty(state) || readAnchorProperty(state)) { + if (skipSeparationSpace(state, true, -1)) { + atNewLine = true; + allowBlockCollections = allowBlockStyles; + + if (state.lineIndent > parentIndent) { + indentStatus = 1; + } else if (state.lineIndent === parentIndent) { + indentStatus = 0; + } else if (state.lineIndent < parentIndent) { + indentStatus = -1; + } + } else { + allowBlockCollections = false; + } + } + } + + if (allowBlockCollections) { + allowBlockCollections = atNewLine || allowCompact; + } + + if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { + if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { + flowIndent = parentIndent; + } else { + flowIndent = parentIndent + 1; + } + + blockIndent = state.position - state.lineStart; + + if (indentStatus === 1) { + if (allowBlockCollections && + (readBlockSequence(state, blockIndent) || + readBlockMapping(state, blockIndent, flowIndent)) || + readFlowCollection(state, flowIndent)) { + hasContent = true; + } else { + if ((allowBlockScalars && readBlockScalar(state, flowIndent)) || + readSingleQuotedScalar(state, flowIndent) || + readDoubleQuotedScalar(state, flowIndent)) { + hasContent = true; + + } else if (readAlias(state)) { + hasContent = true; + + if (state.tag !== null || state.anchor !== null) { + throwError(state, 'alias node should not have any properties'); + } + + } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { + hasContent = true; + + if (state.tag === null) { + state.tag = '?'; + } + } + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + } + } else if (indentStatus === 0) { + // Special case: block sequences are allowed to have same indentation level as the parent. + // http://www.yaml.org/spec/1.2/spec.html#id2799784 + hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); + } + } + + if (state.tag === null) { + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + + } else if (state.tag === '?') { + // Implicit resolving is not allowed for non-scalar types, and '?' + // non-specific tag is only automatically assigned to plain scalars. + // + // We only need to check kind conformity in case user explicitly assigns '?' + // tag, for example like this: "! [0]" + // + if (state.result !== null && state.kind !== 'scalar') { + throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); + } + + for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { + type = state.implicitTypes[typeIndex]; + + if (type.resolve(state.result)) { // `state.result` updated in resolver if matched + state.result = type.construct(state.result); + state.tag = type.tag; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + break; + } + } + } else if (state.tag !== '!') { + if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) { + type = state.typeMap[state.kind || 'fallback'][state.tag]; + } else { + // looking for multi type + type = null; + typeList = state.typeMap.multi[state.kind || 'fallback']; + + for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) { + if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) { + type = typeList[typeIndex]; + break; + } + } + } + + if (!type) { + throwError(state, 'unknown tag !<' + state.tag + '>'); + } + + if (state.result !== null && type.kind !== state.kind) { + throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); + } + + if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched + throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); + } else { + state.result = type.construct(state.result, state.tag); + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + } + } + + if (state.listener !== null) { + state.listener('close', state); + } + return state.tag !== null || state.anchor !== null || hasContent; +} + +function readDocument(state) { + var documentStart = state.position, + _position, + directiveName, + directiveArgs, + hasDirectives = false, + ch; + + state.version = null; + state.checkLineBreaks = state.legacy; + state.tagMap = Object.create(null); + state.anchorMap = Object.create(null); + + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + skipSeparationSpace(state, true, -1); + + ch = state.input.charCodeAt(state.position); + + if (state.lineIndent > 0 || ch !== 0x25/* % */) { + break; + } + + hasDirectives = true; + ch = state.input.charCodeAt(++state.position); + _position = state.position; + + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + directiveName = state.input.slice(_position, state.position); + directiveArgs = []; + + if (directiveName.length < 1) { + throwError(state, 'directive name must not be less than one character in length'); + } + + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + if (ch === 0x23/* # */) { + do { ch = state.input.charCodeAt(++state.position); } + while (ch !== 0 && !is_EOL(ch)); + break; + } + + if (is_EOL(ch)) break; + + _position = state.position; + + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + directiveArgs.push(state.input.slice(_position, state.position)); + } + + if (ch !== 0) readLineBreak(state); + + if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) { + directiveHandlers[directiveName](state, directiveName, directiveArgs); + } else { + throwWarning(state, 'unknown document directive "' + directiveName + '"'); + } + } + + skipSeparationSpace(state, true, -1); + + if (state.lineIndent === 0 && + state.input.charCodeAt(state.position) === 0x2D/* - */ && + state.input.charCodeAt(state.position + 1) === 0x2D/* - */ && + state.input.charCodeAt(state.position + 2) === 0x2D/* - */) { + state.position += 3; + skipSeparationSpace(state, true, -1); + + } else if (hasDirectives) { + throwError(state, 'directives end mark is expected'); + } + + composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); + skipSeparationSpace(state, true, -1); + + if (state.checkLineBreaks && + PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { + throwWarning(state, 'non-ASCII line breaks are interpreted as content'); + } + + state.documents.push(state.result); + + if (state.position === state.lineStart && testDocumentSeparator(state)) { + + if (state.input.charCodeAt(state.position) === 0x2E/* . */) { + state.position += 3; + skipSeparationSpace(state, true, -1); + } + return; + } + + if (state.position < (state.length - 1)) { + throwError(state, 'end of the stream or a document separator is expected'); + } else { + return; + } +} + + +function loadDocuments(input, options) { + input = String(input); + options = options || {}; + + if (input.length !== 0) { + + // Add tailing `\n` if not exists + if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ && + input.charCodeAt(input.length - 1) !== 0x0D/* CR */) { + input += '\n'; + } + + // Strip BOM + if (input.charCodeAt(0) === 0xFEFF) { + input = input.slice(1); + } + } + + var state = new State$1(input, options); + + var nullpos = input.indexOf('\0'); + + if (nullpos !== -1) { + state.position = nullpos; + throwError(state, 'null byte is not allowed in input'); + } + + // Use 0 as string terminator. That significantly simplifies bounds check. + state.input += '\0'; + + while (state.input.charCodeAt(state.position) === 0x20/* Space */) { + state.lineIndent += 1; + state.position += 1; + } + + while (state.position < (state.length - 1)) { + readDocument(state); + } + + return state.documents; +} + + +function loadAll$1(input, iterator, options) { + if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') { + options = iterator; + iterator = null; + } + + var documents = loadDocuments(input, options); + + if (typeof iterator !== 'function') { + return documents; + } + + for (var index = 0, length = documents.length; index < length; index += 1) { + iterator(documents[index]); + } +} + + +function load$1(input, options) { + var documents = loadDocuments(input, options); + + if (documents.length === 0) { + /*eslint-disable no-undefined*/ + return undefined; + } else if (documents.length === 1) { + return documents[0]; + } + throw new exception('expected a single document in the stream, but found more'); +} + + +var loadAll_1 = loadAll$1; +var load_1 = load$1; + +var loader = { + loadAll: loadAll_1, + load: load_1 +}; + +/*eslint-disable no-use-before-define*/ + + + + + +var _toString = Object.prototype.toString; +var _hasOwnProperty = Object.prototype.hasOwnProperty; + +var CHAR_BOM = 0xFEFF; +var CHAR_TAB = 0x09; /* Tab */ +var CHAR_LINE_FEED = 0x0A; /* LF */ +var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */ +var CHAR_SPACE = 0x20; /* Space */ +var CHAR_EXCLAMATION = 0x21; /* ! */ +var CHAR_DOUBLE_QUOTE = 0x22; /* " */ +var CHAR_SHARP = 0x23; /* # */ +var CHAR_PERCENT = 0x25; /* % */ +var CHAR_AMPERSAND = 0x26; /* & */ +var CHAR_SINGLE_QUOTE = 0x27; /* ' */ +var CHAR_ASTERISK = 0x2A; /* * */ +var CHAR_COMMA = 0x2C; /* , */ +var CHAR_MINUS = 0x2D; /* - */ +var CHAR_COLON = 0x3A; /* : */ +var CHAR_EQUALS = 0x3D; /* = */ +var CHAR_GREATER_THAN = 0x3E; /* > */ +var CHAR_QUESTION = 0x3F; /* ? */ +var CHAR_COMMERCIAL_AT = 0x40; /* @ */ +var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */ +var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */ +var CHAR_GRAVE_ACCENT = 0x60; /* ` */ +var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */ +var CHAR_VERTICAL_LINE = 0x7C; /* | */ +var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */ + +var ESCAPE_SEQUENCES = {}; + +ESCAPE_SEQUENCES[0x00] = '\\0'; +ESCAPE_SEQUENCES[0x07] = '\\a'; +ESCAPE_SEQUENCES[0x08] = '\\b'; +ESCAPE_SEQUENCES[0x09] = '\\t'; +ESCAPE_SEQUENCES[0x0A] = '\\n'; +ESCAPE_SEQUENCES[0x0B] = '\\v'; +ESCAPE_SEQUENCES[0x0C] = '\\f'; +ESCAPE_SEQUENCES[0x0D] = '\\r'; +ESCAPE_SEQUENCES[0x1B] = '\\e'; +ESCAPE_SEQUENCES[0x22] = '\\"'; +ESCAPE_SEQUENCES[0x5C] = '\\\\'; +ESCAPE_SEQUENCES[0x85] = '\\N'; +ESCAPE_SEQUENCES[0xA0] = '\\_'; +ESCAPE_SEQUENCES[0x2028] = '\\L'; +ESCAPE_SEQUENCES[0x2029] = '\\P'; + +var DEPRECATED_BOOLEANS_SYNTAX = [ + 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', + 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF' +]; + +var DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/; + +function compileStyleMap(schema, map) { + var result, keys, index, length, tag, style, type; + + if (map === null) return {}; + + result = {}; + keys = Object.keys(map); + + for (index = 0, length = keys.length; index < length; index += 1) { + tag = keys[index]; + style = String(map[tag]); + + if (tag.slice(0, 2) === '!!') { + tag = 'tag:yaml.org,2002:' + tag.slice(2); + } + type = schema.compiledTypeMap['fallback'][tag]; + + if (type && _hasOwnProperty.call(type.styleAliases, style)) { + style = type.styleAliases[style]; + } + + result[tag] = style; + } + + return result; +} + +function encodeHex(character) { + var string, handle, length; + + string = character.toString(16).toUpperCase(); + + if (character <= 0xFF) { + handle = 'x'; + length = 2; + } else if (character <= 0xFFFF) { + handle = 'u'; + length = 4; + } else if (character <= 0xFFFFFFFF) { + handle = 'U'; + length = 8; + } else { + throw new exception('code point within a string may not be greater than 0xFFFFFFFF'); + } + + return '\\' + handle + common.repeat('0', length - string.length) + string; +} + + +var QUOTING_TYPE_SINGLE = 1, + QUOTING_TYPE_DOUBLE = 2; + +function State(options) { + this.schema = options['schema'] || _default; + this.indent = Math.max(1, (options['indent'] || 2)); + this.noArrayIndent = options['noArrayIndent'] || false; + this.skipInvalid = options['skipInvalid'] || false; + this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']); + this.styleMap = compileStyleMap(this.schema, options['styles'] || null); + this.sortKeys = options['sortKeys'] || false; + this.lineWidth = options['lineWidth'] || 80; + this.noRefs = options['noRefs'] || false; + this.noCompatMode = options['noCompatMode'] || false; + this.condenseFlow = options['condenseFlow'] || false; + this.quotingType = options['quotingType'] === '"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE; + this.forceQuotes = options['forceQuotes'] || false; + this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null; + + this.implicitTypes = this.schema.compiledImplicit; + this.explicitTypes = this.schema.compiledExplicit; + + this.tag = null; + this.result = ''; + + this.duplicates = []; + this.usedDuplicates = null; +} + +// Indents every line in a string. Empty lines (\n only) are not indented. +function indentString(string, spaces) { + var ind = common.repeat(' ', spaces), + position = 0, + next = -1, + result = '', + line, + length = string.length; + + while (position < length) { + next = string.indexOf('\n', position); + if (next === -1) { + line = string.slice(position); + position = length; + } else { + line = string.slice(position, next + 1); + position = next + 1; + } + + if (line.length && line !== '\n') result += ind; + + result += line; + } + + return result; +} + +function generateNextLine(state, level) { + return '\n' + common.repeat(' ', state.indent * level); +} + +function testImplicitResolving(state, str) { + var index, length, type; + + for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { + type = state.implicitTypes[index]; + + if (type.resolve(str)) { + return true; + } + } + + return false; +} + +// [33] s-white ::= s-space | s-tab +function isWhitespace(c) { + return c === CHAR_SPACE || c === CHAR_TAB; +} + +// Returns true if the character can be printed without escaping. +// From YAML 1.2: "any allowed characters known to be non-printable +// should also be escaped. [However,] This isn’t mandatory" +// Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029. +function isPrintable(c) { + return (0x00020 <= c && c <= 0x00007E) + || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029) + || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM) + || (0x10000 <= c && c <= 0x10FFFF); +} + +// [34] ns-char ::= nb-char - s-white +// [27] nb-char ::= c-printable - b-char - c-byte-order-mark +// [26] b-char ::= b-line-feed | b-carriage-return +// Including s-white (for some reason, examples doesn't match specs in this aspect) +// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark +function isNsCharOrWhitespace(c) { + return isPrintable(c) + && c !== CHAR_BOM + // - b-char + && c !== CHAR_CARRIAGE_RETURN + && c !== CHAR_LINE_FEED; +} + +// [127] ns-plain-safe(c) ::= c = flow-out ⇒ ns-plain-safe-out +// c = flow-in ⇒ ns-plain-safe-in +// c = block-key ⇒ ns-plain-safe-out +// c = flow-key ⇒ ns-plain-safe-in +// [128] ns-plain-safe-out ::= ns-char +// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator +// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - “:” - “#” ) +// | ( /* An ns-char preceding */ “#” ) +// | ( “:” /* Followed by an ns-plain-safe(c) */ ) +function isPlainSafe(c, prev, inblock) { + var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c); + var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c); + return ( + // ns-plain-safe + inblock ? // c = flow-in + cIsNsCharOrWhitespace + : cIsNsCharOrWhitespace + // - c-flow-indicator + && c !== CHAR_COMMA + && c !== CHAR_LEFT_SQUARE_BRACKET + && c !== CHAR_RIGHT_SQUARE_BRACKET + && c !== CHAR_LEFT_CURLY_BRACKET + && c !== CHAR_RIGHT_CURLY_BRACKET + ) + // ns-plain-char + && c !== CHAR_SHARP // false on '#' + && !(prev === CHAR_COLON && !cIsNsChar) // false on ': ' + || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#' + || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]' +} + +// Simplified test for values allowed as the first character in plain style. +function isPlainSafeFirst(c) { + // Uses a subset of ns-char - c-indicator + // where ns-char = nb-char - s-white. + // No support of ( ( “?” | “:” | “-” ) /* Followed by an ns-plain-safe(c)) */ ) part + return isPrintable(c) && c !== CHAR_BOM + && !isWhitespace(c) // - s-white + // - (c-indicator ::= + // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}” + && c !== CHAR_MINUS + && c !== CHAR_QUESTION + && c !== CHAR_COLON + && c !== CHAR_COMMA + && c !== CHAR_LEFT_SQUARE_BRACKET + && c !== CHAR_RIGHT_SQUARE_BRACKET + && c !== CHAR_LEFT_CURLY_BRACKET + && c !== CHAR_RIGHT_CURLY_BRACKET + // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"” + && c !== CHAR_SHARP + && c !== CHAR_AMPERSAND + && c !== CHAR_ASTERISK + && c !== CHAR_EXCLAMATION + && c !== CHAR_VERTICAL_LINE + && c !== CHAR_EQUALS + && c !== CHAR_GREATER_THAN + && c !== CHAR_SINGLE_QUOTE + && c !== CHAR_DOUBLE_QUOTE + // | “%” | “@” | “`”) + && c !== CHAR_PERCENT + && c !== CHAR_COMMERCIAL_AT + && c !== CHAR_GRAVE_ACCENT; +} + +// Simplified test for values allowed as the last character in plain style. +function isPlainSafeLast(c) { + // just not whitespace or colon, it will be checked to be plain character later + return !isWhitespace(c) && c !== CHAR_COLON; +} + +// Same as 'string'.codePointAt(pos), but works in older browsers. +function codePointAt(string, pos) { + var first = string.charCodeAt(pos), second; + if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) { + second = string.charCodeAt(pos + 1); + if (second >= 0xDC00 && second <= 0xDFFF) { + // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000; + } + } + return first; +} + +// Determines whether block indentation indicator is required. +function needIndentIndicator(string) { + var leadingSpaceRe = /^\n* /; + return leadingSpaceRe.test(string); +} + +var STYLE_PLAIN = 1, + STYLE_SINGLE = 2, + STYLE_LITERAL = 3, + STYLE_FOLDED = 4, + STYLE_DOUBLE = 5; + +// Determines which scalar styles are possible and returns the preferred style. +// lineWidth = -1 => no limit. +// Pre-conditions: str.length > 0. +// Post-conditions: +// STYLE_PLAIN or STYLE_SINGLE => no \n are in the string. +// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1). +// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1). +function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, + testAmbiguousType, quotingType, forceQuotes, inblock) { + + var i; + var char = 0; + var prevChar = null; + var hasLineBreak = false; + var hasFoldableLine = false; // only checked if shouldTrackWidth + var shouldTrackWidth = lineWidth !== -1; + var previousLineBreak = -1; // count the first line correctly + var plain = isPlainSafeFirst(codePointAt(string, 0)) + && isPlainSafeLast(codePointAt(string, string.length - 1)); + + if (singleLineOnly || forceQuotes) { + // Case: no block styles. + // Check for disallowed characters to rule out plain and single. + for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { + char = codePointAt(string, i); + if (!isPrintable(char)) { + return STYLE_DOUBLE; + } + plain = plain && isPlainSafe(char, prevChar, inblock); + prevChar = char; + } + } else { + // Case: block styles permitted. + for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { + char = codePointAt(string, i); + if (char === CHAR_LINE_FEED) { + hasLineBreak = true; + // Check if any line can be folded. + if (shouldTrackWidth) { + hasFoldableLine = hasFoldableLine || + // Foldable line = too long, and not more-indented. + (i - previousLineBreak - 1 > lineWidth && + string[previousLineBreak + 1] !== ' '); + previousLineBreak = i; + } + } else if (!isPrintable(char)) { + return STYLE_DOUBLE; + } + plain = plain && isPlainSafe(char, prevChar, inblock); + prevChar = char; + } + // in case the end is missing a \n + hasFoldableLine = hasFoldableLine || (shouldTrackWidth && + (i - previousLineBreak - 1 > lineWidth && + string[previousLineBreak + 1] !== ' ')); + } + // Although every style can represent \n without escaping, prefer block styles + // for multiline, since they're more readable and they don't add empty lines. + // Also prefer folding a super-long line. + if (!hasLineBreak && !hasFoldableLine) { + // Strings interpretable as another type have to be quoted; + // e.g. the string 'true' vs. the boolean true. + if (plain && !forceQuotes && !testAmbiguousType(string)) { + return STYLE_PLAIN; + } + return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; + } + // Edge case: block indentation indicator can only have one digit. + if (indentPerLevel > 9 && needIndentIndicator(string)) { + return STYLE_DOUBLE; + } + // At this point we know block styles are valid. + // Prefer literal style unless we want to fold. + if (!forceQuotes) { + return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; + } + return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; +} + +// Note: line breaking/folding is implemented for only the folded style. +// NB. We drop the last trailing newline (if any) of a returned block scalar +// since the dumper adds its own newline. This always works: +// • No ending newline => unaffected; already using strip "-" chomping. +// • Ending newline => removed then restored. +// Importantly, this keeps the "+" chomp indicator from gaining an extra line. +function writeScalar(state, string, level, iskey, inblock) { + state.dump = (function () { + if (string.length === 0) { + return state.quotingType === QUOTING_TYPE_DOUBLE ? '""' : "''"; + } + if (!state.noCompatMode) { + if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) { + return state.quotingType === QUOTING_TYPE_DOUBLE ? ('"' + string + '"') : ("'" + string + "'"); + } + } + + var indent = state.indent * Math.max(1, level); // no 0-indent scalars + // As indentation gets deeper, let the width decrease monotonically + // to the lower bound min(state.lineWidth, 40). + // Note that this implies + // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound. + // state.lineWidth > 40 + state.indent: width decreases until the lower bound. + // This behaves better than a constant minimum width which disallows narrower options, + // or an indent threshold which causes the width to suddenly increase. + var lineWidth = state.lineWidth === -1 + ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); + + // Without knowing if keys are implicit/explicit, assume implicit for safety. + var singleLineOnly = iskey + // No block styles in flow mode. + || (state.flowLevel > -1 && level >= state.flowLevel); + function testAmbiguity(string) { + return testImplicitResolving(state, string); + } + + switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, + testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) { + + case STYLE_PLAIN: + return string; + case STYLE_SINGLE: + return "'" + string.replace(/'/g, "''") + "'"; + case STYLE_LITERAL: + return '|' + blockHeader(string, state.indent) + + dropEndingNewline(indentString(string, indent)); + case STYLE_FOLDED: + return '>' + blockHeader(string, state.indent) + + dropEndingNewline(indentString(foldString(string, lineWidth), indent)); + case STYLE_DOUBLE: + return '"' + escapeString(string) + '"'; + default: + throw new exception('impossible error: invalid scalar style'); + } + }()); +} + +// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9. +function blockHeader(string, indentPerLevel) { + var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ''; + + // note the special case: the string '\n' counts as a "trailing" empty line. + var clip = string[string.length - 1] === '\n'; + var keep = clip && (string[string.length - 2] === '\n' || string === '\n'); + var chomp = keep ? '+' : (clip ? '' : '-'); + + return indentIndicator + chomp + '\n'; +} + +// (See the note for writeScalar.) +function dropEndingNewline(string) { + return string[string.length - 1] === '\n' ? string.slice(0, -1) : string; +} + +// Note: a long line without a suitable break point will exceed the width limit. +// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0. +function foldString(string, width) { + // In folded style, $k$ consecutive newlines output as $k+1$ newlines— + // unless they're before or after a more-indented line, or at the very + // beginning or end, in which case $k$ maps to $k$. + // Therefore, parse each chunk as newline(s) followed by a content line. + var lineRe = /(\n+)([^\n]*)/g; + + // first line (possibly an empty line) + var result = (function () { + var nextLF = string.indexOf('\n'); + nextLF = nextLF !== -1 ? nextLF : string.length; + lineRe.lastIndex = nextLF; + return foldLine(string.slice(0, nextLF), width); + }()); + // If we haven't reached the first content line yet, don't add an extra \n. + var prevMoreIndented = string[0] === '\n' || string[0] === ' '; + var moreIndented; + + // rest of the lines + var match; + while ((match = lineRe.exec(string))) { + var prefix = match[1], line = match[2]; + moreIndented = (line[0] === ' '); + result += prefix + + (!prevMoreIndented && !moreIndented && line !== '' + ? '\n' : '') + + foldLine(line, width); + prevMoreIndented = moreIndented; + } + + return result; +} + +// Greedy line breaking. +// Picks the longest line under the limit each time, +// otherwise settles for the shortest line over the limit. +// NB. More-indented lines *cannot* be folded, as that would add an extra \n. +function foldLine(line, width) { + if (line === '' || line[0] === ' ') return line; + + // Since a more-indented line adds a \n, breaks can't be followed by a space. + var breakRe = / [^ ]/g; // note: the match index will always be <= length-2. + var match; + // start is an inclusive index. end, curr, and next are exclusive. + var start = 0, end, curr = 0, next = 0; + var result = ''; + + // Invariants: 0 <= start <= length-1. + // 0 <= curr <= next <= max(0, length-2). curr - start <= width. + // Inside the loop: + // A match implies length >= 2, so curr and next are <= length-2. + while ((match = breakRe.exec(line))) { + next = match.index; + // maintain invariant: curr - start <= width + if (next - start > width) { + end = (curr > start) ? curr : next; // derive end <= length-2 + result += '\n' + line.slice(start, end); + // skip the space that was output as \n + start = end + 1; // derive start <= length-1 + } + curr = next; + } + + // By the invariants, start <= length-1, so there is something left over. + // It is either the whole string or a part starting from non-whitespace. + result += '\n'; + // Insert a break if the remainder is too long and there is a break available. + if (line.length - start > width && curr > start) { + result += line.slice(start, curr) + '\n' + line.slice(curr + 1); + } else { + result += line.slice(start); + } + + return result.slice(1); // drop extra \n joiner +} + +// Escapes a double-quoted string. +function escapeString(string) { + var result = ''; + var char = 0; + var escapeSeq; + + for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { + char = codePointAt(string, i); + escapeSeq = ESCAPE_SEQUENCES[char]; + + if (!escapeSeq && isPrintable(char)) { + result += string[i]; + if (char >= 0x10000) result += string[i + 1]; + } else { + result += escapeSeq || encodeHex(char); + } + } + + return result; +} + +function writeFlowSequence(state, level, object) { + var _result = '', + _tag = state.tag, + index, + length, + value; + + for (index = 0, length = object.length; index < length; index += 1) { + value = object[index]; + + if (state.replacer) { + value = state.replacer.call(object, String(index), value); + } + + // Write only valid elements, put null instead of invalid elements. + if (writeNode(state, level, value, false, false) || + (typeof value === 'undefined' && + writeNode(state, level, null, false, false))) { + + if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : ''); + _result += state.dump; + } + } + + state.tag = _tag; + state.dump = '[' + _result + ']'; +} + +function writeBlockSequence(state, level, object, compact) { + var _result = '', + _tag = state.tag, + index, + length, + value; + + for (index = 0, length = object.length; index < length; index += 1) { + value = object[index]; + + if (state.replacer) { + value = state.replacer.call(object, String(index), value); + } + + // Write only valid elements, put null instead of invalid elements. + if (writeNode(state, level + 1, value, true, true, false, true) || + (typeof value === 'undefined' && + writeNode(state, level + 1, null, true, true, false, true))) { + + if (!compact || _result !== '') { + _result += generateNextLine(state, level); + } + + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + _result += '-'; + } else { + _result += '- '; + } + + _result += state.dump; + } + } + + state.tag = _tag; + state.dump = _result || '[]'; // Empty sequence if no valid values. +} + +function writeFlowMapping(state, level, object) { + var _result = '', + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + pairBuffer; + + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + + pairBuffer = ''; + if (_result !== '') pairBuffer += ', '; + + if (state.condenseFlow) pairBuffer += '"'; + + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + + if (state.replacer) { + objectValue = state.replacer.call(object, objectKey, objectValue); + } + + if (!writeNode(state, level, objectKey, false, false)) { + continue; // Skip this pair because of invalid key; + } + + if (state.dump.length > 1024) pairBuffer += '? '; + + pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' '); + + if (!writeNode(state, level, objectValue, false, false)) { + continue; // Skip this pair because of invalid value. + } + + pairBuffer += state.dump; + + // Both key and value are valid. + _result += pairBuffer; + } + + state.tag = _tag; + state.dump = '{' + _result + '}'; +} + +function writeBlockMapping(state, level, object, compact) { + var _result = '', + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + explicitPair, + pairBuffer; + + // Allow sorting keys so that the output file is deterministic + if (state.sortKeys === true) { + // Default sorting + objectKeyList.sort(); + } else if (typeof state.sortKeys === 'function') { + // Custom sort function + objectKeyList.sort(state.sortKeys); + } else if (state.sortKeys) { + // Something is wrong + throw new exception('sortKeys must be a boolean or a function'); + } + + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + pairBuffer = ''; + + if (!compact || _result !== '') { + pairBuffer += generateNextLine(state, level); + } + + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + + if (state.replacer) { + objectValue = state.replacer.call(object, objectKey, objectValue); + } + + if (!writeNode(state, level + 1, objectKey, true, true, true)) { + continue; // Skip this pair because of invalid key. + } + + explicitPair = (state.tag !== null && state.tag !== '?') || + (state.dump && state.dump.length > 1024); + + if (explicitPair) { + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + pairBuffer += '?'; + } else { + pairBuffer += '? '; + } + } + + pairBuffer += state.dump; + + if (explicitPair) { + pairBuffer += generateNextLine(state, level); + } + + if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { + continue; // Skip this pair because of invalid value. + } + + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + pairBuffer += ':'; + } else { + pairBuffer += ': '; + } + + pairBuffer += state.dump; + + // Both key and value are valid. + _result += pairBuffer; + } + + state.tag = _tag; + state.dump = _result || '{}'; // Empty mapping if no valid pairs. +} + +function detectType(state, object, explicit) { + var _result, typeList, index, length, type, style; + + typeList = explicit ? state.explicitTypes : state.implicitTypes; + + for (index = 0, length = typeList.length; index < length; index += 1) { + type = typeList[index]; + + if ((type.instanceOf || type.predicate) && + (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) && + (!type.predicate || type.predicate(object))) { + + if (explicit) { + if (type.multi && type.representName) { + state.tag = type.representName(object); + } else { + state.tag = type.tag; + } + } else { + state.tag = '?'; + } + + if (type.represent) { + style = state.styleMap[type.tag] || type.defaultStyle; + + if (_toString.call(type.represent) === '[object Function]') { + _result = type.represent(object, style); + } else if (_hasOwnProperty.call(type.represent, style)) { + _result = type.represent[style](object, style); + } else { + throw new exception('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); + } + + state.dump = _result; + } + + return true; + } + } + + return false; +} + +// Serializes `object` and writes it to global `result`. +// Returns true on success, or false on invalid object. +// +function writeNode(state, level, object, block, compact, iskey, isblockseq) { + state.tag = null; + state.dump = object; + + if (!detectType(state, object, false)) { + detectType(state, object, true); + } + + var type = _toString.call(state.dump); + var inblock = block; + var tagStr; + + if (block) { + block = (state.flowLevel < 0 || state.flowLevel > level); + } + + var objectOrArray = type === '[object Object]' || type === '[object Array]', + duplicateIndex, + duplicate; + + if (objectOrArray) { + duplicateIndex = state.duplicates.indexOf(object); + duplicate = duplicateIndex !== -1; + } + + if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) { + compact = false; + } + + if (duplicate && state.usedDuplicates[duplicateIndex]) { + state.dump = '*ref_' + duplicateIndex; + } else { + if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { + state.usedDuplicates[duplicateIndex] = true; + } + if (type === '[object Object]') { + if (block && (Object.keys(state.dump).length !== 0)) { + writeBlockMapping(state, level, state.dump, compact); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + state.dump; + } + } else { + writeFlowMapping(state, level, state.dump); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; + } + } + } else if (type === '[object Array]') { + if (block && (state.dump.length !== 0)) { + if (state.noArrayIndent && !isblockseq && level > 0) { + writeBlockSequence(state, level - 1, state.dump, compact); + } else { + writeBlockSequence(state, level, state.dump, compact); + } + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + state.dump; + } + } else { + writeFlowSequence(state, level, state.dump); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; + } + } + } else if (type === '[object String]') { + if (state.tag !== '?') { + writeScalar(state, state.dump, level, iskey, inblock); + } + } else if (type === '[object Undefined]') { + return false; + } else { + if (state.skipInvalid) return false; + throw new exception('unacceptable kind of an object to dump ' + type); + } + + if (state.tag !== null && state.tag !== '?') { + // Need to encode all characters except those allowed by the spec: + // + // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */ + // [36] ns-hex-digit ::= ns-dec-digit + // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */ + // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */ + // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | “-” + // [39] ns-uri-char ::= “%” ns-hex-digit ns-hex-digit | ns-word-char | “#” + // | “;” | “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,” + // | “_” | “.” | “!” | “~” | “*” | “'” | “(” | “)” | “[” | “]” + // + // Also need to encode '!' because it has special meaning (end of tag prefix). + // + tagStr = encodeURI( + state.tag[0] === '!' ? state.tag.slice(1) : state.tag + ).replace(/!/g, '%21'); + + if (state.tag[0] === '!') { + tagStr = '!' + tagStr; + } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') { + tagStr = '!!' + tagStr.slice(18); + } else { + tagStr = '!<' + tagStr + '>'; + } + + state.dump = tagStr + ' ' + state.dump; + } + } + + return true; +} + +function getDuplicateReferences(object, state) { + var objects = [], + duplicatesIndexes = [], + index, + length; + + inspectNode(object, objects, duplicatesIndexes); + + for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { + state.duplicates.push(objects[duplicatesIndexes[index]]); + } + state.usedDuplicates = new Array(length); +} + +function inspectNode(object, objects, duplicatesIndexes) { + var objectKeyList, + index, + length; + + if (object !== null && typeof object === 'object') { + index = objects.indexOf(object); + if (index !== -1) { + if (duplicatesIndexes.indexOf(index) === -1) { + duplicatesIndexes.push(index); + } + } else { + objects.push(object); + + if (Array.isArray(object)) { + for (index = 0, length = object.length; index < length; index += 1) { + inspectNode(object[index], objects, duplicatesIndexes); + } + } else { + objectKeyList = Object.keys(object); + + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); + } + } + } + } +} + +function dump$1(input, options) { + options = options || {}; + + var state = new State(options); + + if (!state.noRefs) getDuplicateReferences(input, state); + + var value = input; + + if (state.replacer) { + value = state.replacer.call({ '': value }, '', value); + } + + if (writeNode(state, 0, value, true, true)) return state.dump + '\n'; + + return ''; +} + +var dump_1 = dump$1; + +var dumper = { + dump: dump_1 +}; + +function renamed(from, to) { + return function () { + throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' + + 'Use yaml.' + to + ' instead, which is now safe by default.'); + }; +} + + +var Type = type; +var Schema = schema; +var FAILSAFE_SCHEMA = failsafe; +var JSON_SCHEMA = json; +var CORE_SCHEMA = core; +var DEFAULT_SCHEMA = _default; +var load = loader.load; +var loadAll = loader.loadAll; +var dump = dumper.dump; +var YAMLException = exception; + +// Re-export all types in case user wants to create custom schema +var types = { + binary: binary, + float: float, + map: map, + null: _null, + pairs: pairs, + set: set, + timestamp: timestamp, + bool: bool, + int: int, + merge: merge, + omap: omap, + seq: seq, + str: str +}; + +// Removed functions from JS-YAML 3.0.x +var safeLoad = renamed('safeLoad', 'load'); +var safeLoadAll = renamed('safeLoadAll', 'loadAll'); +var safeDump = renamed('safeDump', 'dump'); + +var jsYaml = { + Type: Type, + Schema: Schema, + FAILSAFE_SCHEMA: FAILSAFE_SCHEMA, + JSON_SCHEMA: JSON_SCHEMA, + CORE_SCHEMA: CORE_SCHEMA, + DEFAULT_SCHEMA: DEFAULT_SCHEMA, + load: load, + loadAll: loadAll, + dump: dump, + YAMLException: YAMLException, + types: types, + safeLoad: safeLoad, + safeLoadAll: safeLoadAll, + safeDump: safeDump +}; + +export default jsYaml; +export { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types }; diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/index.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/index.js new file mode 100644 index 0000000..bcb7eba --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/index.js @@ -0,0 +1,47 @@ +'use strict'; + + +var loader = require('./lib/loader'); +var dumper = require('./lib/dumper'); + + +function renamed(from, to) { + return function () { + throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' + + 'Use yaml.' + to + ' instead, which is now safe by default.'); + }; +} + + +module.exports.Type = require('./lib/type'); +module.exports.Schema = require('./lib/schema'); +module.exports.FAILSAFE_SCHEMA = require('./lib/schema/failsafe'); +module.exports.JSON_SCHEMA = require('./lib/schema/json'); +module.exports.CORE_SCHEMA = require('./lib/schema/core'); +module.exports.DEFAULT_SCHEMA = require('./lib/schema/default'); +module.exports.load = loader.load; +module.exports.loadAll = loader.loadAll; +module.exports.dump = dumper.dump; +module.exports.YAMLException = require('./lib/exception'); + +// Re-export all types in case user wants to create custom schema +module.exports.types = { + binary: require('./lib/type/binary'), + float: require('./lib/type/float'), + map: require('./lib/type/map'), + null: require('./lib/type/null'), + pairs: require('./lib/type/pairs'), + set: require('./lib/type/set'), + timestamp: require('./lib/type/timestamp'), + bool: require('./lib/type/bool'), + int: require('./lib/type/int'), + merge: require('./lib/type/merge'), + omap: require('./lib/type/omap'), + seq: require('./lib/type/seq'), + str: require('./lib/type/str') +}; + +// Removed functions from JS-YAML 3.0.x +module.exports.safeLoad = renamed('safeLoad', 'load'); +module.exports.safeLoadAll = renamed('safeLoadAll', 'loadAll'); +module.exports.safeDump = renamed('safeDump', 'dump'); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/common.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/common.js new file mode 100644 index 0000000..25ef7d8 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/common.js @@ -0,0 +1,59 @@ +'use strict'; + + +function isNothing(subject) { + return (typeof subject === 'undefined') || (subject === null); +} + + +function isObject(subject) { + return (typeof subject === 'object') && (subject !== null); +} + + +function toArray(sequence) { + if (Array.isArray(sequence)) return sequence; + else if (isNothing(sequence)) return []; + + return [ sequence ]; +} + + +function extend(target, source) { + var index, length, key, sourceKeys; + + if (source) { + sourceKeys = Object.keys(source); + + for (index = 0, length = sourceKeys.length; index < length; index += 1) { + key = sourceKeys[index]; + target[key] = source[key]; + } + } + + return target; +} + + +function repeat(string, count) { + var result = '', cycle; + + for (cycle = 0; cycle < count; cycle += 1) { + result += string; + } + + return result; +} + + +function isNegativeZero(number) { + return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number); +} + + +module.exports.isNothing = isNothing; +module.exports.isObject = isObject; +module.exports.toArray = toArray; +module.exports.repeat = repeat; +module.exports.isNegativeZero = isNegativeZero; +module.exports.extend = extend; diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/dumper.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/dumper.js new file mode 100644 index 0000000..f357a6a --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/dumper.js @@ -0,0 +1,965 @@ +'use strict'; + +/*eslint-disable no-use-before-define*/ + +var common = require('./common'); +var YAMLException = require('./exception'); +var DEFAULT_SCHEMA = require('./schema/default'); + +var _toString = Object.prototype.toString; +var _hasOwnProperty = Object.prototype.hasOwnProperty; + +var CHAR_BOM = 0xFEFF; +var CHAR_TAB = 0x09; /* Tab */ +var CHAR_LINE_FEED = 0x0A; /* LF */ +var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */ +var CHAR_SPACE = 0x20; /* Space */ +var CHAR_EXCLAMATION = 0x21; /* ! */ +var CHAR_DOUBLE_QUOTE = 0x22; /* " */ +var CHAR_SHARP = 0x23; /* # */ +var CHAR_PERCENT = 0x25; /* % */ +var CHAR_AMPERSAND = 0x26; /* & */ +var CHAR_SINGLE_QUOTE = 0x27; /* ' */ +var CHAR_ASTERISK = 0x2A; /* * */ +var CHAR_COMMA = 0x2C; /* , */ +var CHAR_MINUS = 0x2D; /* - */ +var CHAR_COLON = 0x3A; /* : */ +var CHAR_EQUALS = 0x3D; /* = */ +var CHAR_GREATER_THAN = 0x3E; /* > */ +var CHAR_QUESTION = 0x3F; /* ? */ +var CHAR_COMMERCIAL_AT = 0x40; /* @ */ +var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */ +var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */ +var CHAR_GRAVE_ACCENT = 0x60; /* ` */ +var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */ +var CHAR_VERTICAL_LINE = 0x7C; /* | */ +var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */ + +var ESCAPE_SEQUENCES = {}; + +ESCAPE_SEQUENCES[0x00] = '\\0'; +ESCAPE_SEQUENCES[0x07] = '\\a'; +ESCAPE_SEQUENCES[0x08] = '\\b'; +ESCAPE_SEQUENCES[0x09] = '\\t'; +ESCAPE_SEQUENCES[0x0A] = '\\n'; +ESCAPE_SEQUENCES[0x0B] = '\\v'; +ESCAPE_SEQUENCES[0x0C] = '\\f'; +ESCAPE_SEQUENCES[0x0D] = '\\r'; +ESCAPE_SEQUENCES[0x1B] = '\\e'; +ESCAPE_SEQUENCES[0x22] = '\\"'; +ESCAPE_SEQUENCES[0x5C] = '\\\\'; +ESCAPE_SEQUENCES[0x85] = '\\N'; +ESCAPE_SEQUENCES[0xA0] = '\\_'; +ESCAPE_SEQUENCES[0x2028] = '\\L'; +ESCAPE_SEQUENCES[0x2029] = '\\P'; + +var DEPRECATED_BOOLEANS_SYNTAX = [ + 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', + 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF' +]; + +var DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/; + +function compileStyleMap(schema, map) { + var result, keys, index, length, tag, style, type; + + if (map === null) return {}; + + result = {}; + keys = Object.keys(map); + + for (index = 0, length = keys.length; index < length; index += 1) { + tag = keys[index]; + style = String(map[tag]); + + if (tag.slice(0, 2) === '!!') { + tag = 'tag:yaml.org,2002:' + tag.slice(2); + } + type = schema.compiledTypeMap['fallback'][tag]; + + if (type && _hasOwnProperty.call(type.styleAliases, style)) { + style = type.styleAliases[style]; + } + + result[tag] = style; + } + + return result; +} + +function encodeHex(character) { + var string, handle, length; + + string = character.toString(16).toUpperCase(); + + if (character <= 0xFF) { + handle = 'x'; + length = 2; + } else if (character <= 0xFFFF) { + handle = 'u'; + length = 4; + } else if (character <= 0xFFFFFFFF) { + handle = 'U'; + length = 8; + } else { + throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF'); + } + + return '\\' + handle + common.repeat('0', length - string.length) + string; +} + + +var QUOTING_TYPE_SINGLE = 1, + QUOTING_TYPE_DOUBLE = 2; + +function State(options) { + this.schema = options['schema'] || DEFAULT_SCHEMA; + this.indent = Math.max(1, (options['indent'] || 2)); + this.noArrayIndent = options['noArrayIndent'] || false; + this.skipInvalid = options['skipInvalid'] || false; + this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']); + this.styleMap = compileStyleMap(this.schema, options['styles'] || null); + this.sortKeys = options['sortKeys'] || false; + this.lineWidth = options['lineWidth'] || 80; + this.noRefs = options['noRefs'] || false; + this.noCompatMode = options['noCompatMode'] || false; + this.condenseFlow = options['condenseFlow'] || false; + this.quotingType = options['quotingType'] === '"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE; + this.forceQuotes = options['forceQuotes'] || false; + this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null; + + this.implicitTypes = this.schema.compiledImplicit; + this.explicitTypes = this.schema.compiledExplicit; + + this.tag = null; + this.result = ''; + + this.duplicates = []; + this.usedDuplicates = null; +} + +// Indents every line in a string. Empty lines (\n only) are not indented. +function indentString(string, spaces) { + var ind = common.repeat(' ', spaces), + position = 0, + next = -1, + result = '', + line, + length = string.length; + + while (position < length) { + next = string.indexOf('\n', position); + if (next === -1) { + line = string.slice(position); + position = length; + } else { + line = string.slice(position, next + 1); + position = next + 1; + } + + if (line.length && line !== '\n') result += ind; + + result += line; + } + + return result; +} + +function generateNextLine(state, level) { + return '\n' + common.repeat(' ', state.indent * level); +} + +function testImplicitResolving(state, str) { + var index, length, type; + + for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { + type = state.implicitTypes[index]; + + if (type.resolve(str)) { + return true; + } + } + + return false; +} + +// [33] s-white ::= s-space | s-tab +function isWhitespace(c) { + return c === CHAR_SPACE || c === CHAR_TAB; +} + +// Returns true if the character can be printed without escaping. +// From YAML 1.2: "any allowed characters known to be non-printable +// should also be escaped. [However,] This isn’t mandatory" +// Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029. +function isPrintable(c) { + return (0x00020 <= c && c <= 0x00007E) + || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029) + || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM) + || (0x10000 <= c && c <= 0x10FFFF); +} + +// [34] ns-char ::= nb-char - s-white +// [27] nb-char ::= c-printable - b-char - c-byte-order-mark +// [26] b-char ::= b-line-feed | b-carriage-return +// Including s-white (for some reason, examples doesn't match specs in this aspect) +// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark +function isNsCharOrWhitespace(c) { + return isPrintable(c) + && c !== CHAR_BOM + // - b-char + && c !== CHAR_CARRIAGE_RETURN + && c !== CHAR_LINE_FEED; +} + +// [127] ns-plain-safe(c) ::= c = flow-out ⇒ ns-plain-safe-out +// c = flow-in ⇒ ns-plain-safe-in +// c = block-key ⇒ ns-plain-safe-out +// c = flow-key ⇒ ns-plain-safe-in +// [128] ns-plain-safe-out ::= ns-char +// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator +// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - “:” - “#” ) +// | ( /* An ns-char preceding */ “#” ) +// | ( “:” /* Followed by an ns-plain-safe(c) */ ) +function isPlainSafe(c, prev, inblock) { + var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c); + var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c); + return ( + // ns-plain-safe + inblock ? // c = flow-in + cIsNsCharOrWhitespace + : cIsNsCharOrWhitespace + // - c-flow-indicator + && c !== CHAR_COMMA + && c !== CHAR_LEFT_SQUARE_BRACKET + && c !== CHAR_RIGHT_SQUARE_BRACKET + && c !== CHAR_LEFT_CURLY_BRACKET + && c !== CHAR_RIGHT_CURLY_BRACKET + ) + // ns-plain-char + && c !== CHAR_SHARP // false on '#' + && !(prev === CHAR_COLON && !cIsNsChar) // false on ': ' + || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#' + || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]' +} + +// Simplified test for values allowed as the first character in plain style. +function isPlainSafeFirst(c) { + // Uses a subset of ns-char - c-indicator + // where ns-char = nb-char - s-white. + // No support of ( ( “?” | “:” | “-” ) /* Followed by an ns-plain-safe(c)) */ ) part + return isPrintable(c) && c !== CHAR_BOM + && !isWhitespace(c) // - s-white + // - (c-indicator ::= + // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}” + && c !== CHAR_MINUS + && c !== CHAR_QUESTION + && c !== CHAR_COLON + && c !== CHAR_COMMA + && c !== CHAR_LEFT_SQUARE_BRACKET + && c !== CHAR_RIGHT_SQUARE_BRACKET + && c !== CHAR_LEFT_CURLY_BRACKET + && c !== CHAR_RIGHT_CURLY_BRACKET + // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"” + && c !== CHAR_SHARP + && c !== CHAR_AMPERSAND + && c !== CHAR_ASTERISK + && c !== CHAR_EXCLAMATION + && c !== CHAR_VERTICAL_LINE + && c !== CHAR_EQUALS + && c !== CHAR_GREATER_THAN + && c !== CHAR_SINGLE_QUOTE + && c !== CHAR_DOUBLE_QUOTE + // | “%” | “@” | “`”) + && c !== CHAR_PERCENT + && c !== CHAR_COMMERCIAL_AT + && c !== CHAR_GRAVE_ACCENT; +} + +// Simplified test for values allowed as the last character in plain style. +function isPlainSafeLast(c) { + // just not whitespace or colon, it will be checked to be plain character later + return !isWhitespace(c) && c !== CHAR_COLON; +} + +// Same as 'string'.codePointAt(pos), but works in older browsers. +function codePointAt(string, pos) { + var first = string.charCodeAt(pos), second; + if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) { + second = string.charCodeAt(pos + 1); + if (second >= 0xDC00 && second <= 0xDFFF) { + // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000; + } + } + return first; +} + +// Determines whether block indentation indicator is required. +function needIndentIndicator(string) { + var leadingSpaceRe = /^\n* /; + return leadingSpaceRe.test(string); +} + +var STYLE_PLAIN = 1, + STYLE_SINGLE = 2, + STYLE_LITERAL = 3, + STYLE_FOLDED = 4, + STYLE_DOUBLE = 5; + +// Determines which scalar styles are possible and returns the preferred style. +// lineWidth = -1 => no limit. +// Pre-conditions: str.length > 0. +// Post-conditions: +// STYLE_PLAIN or STYLE_SINGLE => no \n are in the string. +// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1). +// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1). +function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, + testAmbiguousType, quotingType, forceQuotes, inblock) { + + var i; + var char = 0; + var prevChar = null; + var hasLineBreak = false; + var hasFoldableLine = false; // only checked if shouldTrackWidth + var shouldTrackWidth = lineWidth !== -1; + var previousLineBreak = -1; // count the first line correctly + var plain = isPlainSafeFirst(codePointAt(string, 0)) + && isPlainSafeLast(codePointAt(string, string.length - 1)); + + if (singleLineOnly || forceQuotes) { + // Case: no block styles. + // Check for disallowed characters to rule out plain and single. + for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { + char = codePointAt(string, i); + if (!isPrintable(char)) { + return STYLE_DOUBLE; + } + plain = plain && isPlainSafe(char, prevChar, inblock); + prevChar = char; + } + } else { + // Case: block styles permitted. + for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { + char = codePointAt(string, i); + if (char === CHAR_LINE_FEED) { + hasLineBreak = true; + // Check if any line can be folded. + if (shouldTrackWidth) { + hasFoldableLine = hasFoldableLine || + // Foldable line = too long, and not more-indented. + (i - previousLineBreak - 1 > lineWidth && + string[previousLineBreak + 1] !== ' '); + previousLineBreak = i; + } + } else if (!isPrintable(char)) { + return STYLE_DOUBLE; + } + plain = plain && isPlainSafe(char, prevChar, inblock); + prevChar = char; + } + // in case the end is missing a \n + hasFoldableLine = hasFoldableLine || (shouldTrackWidth && + (i - previousLineBreak - 1 > lineWidth && + string[previousLineBreak + 1] !== ' ')); + } + // Although every style can represent \n without escaping, prefer block styles + // for multiline, since they're more readable and they don't add empty lines. + // Also prefer folding a super-long line. + if (!hasLineBreak && !hasFoldableLine) { + // Strings interpretable as another type have to be quoted; + // e.g. the string 'true' vs. the boolean true. + if (plain && !forceQuotes && !testAmbiguousType(string)) { + return STYLE_PLAIN; + } + return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; + } + // Edge case: block indentation indicator can only have one digit. + if (indentPerLevel > 9 && needIndentIndicator(string)) { + return STYLE_DOUBLE; + } + // At this point we know block styles are valid. + // Prefer literal style unless we want to fold. + if (!forceQuotes) { + return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; + } + return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; +} + +// Note: line breaking/folding is implemented for only the folded style. +// NB. We drop the last trailing newline (if any) of a returned block scalar +// since the dumper adds its own newline. This always works: +// • No ending newline => unaffected; already using strip "-" chomping. +// • Ending newline => removed then restored. +// Importantly, this keeps the "+" chomp indicator from gaining an extra line. +function writeScalar(state, string, level, iskey, inblock) { + state.dump = (function () { + if (string.length === 0) { + return state.quotingType === QUOTING_TYPE_DOUBLE ? '""' : "''"; + } + if (!state.noCompatMode) { + if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) { + return state.quotingType === QUOTING_TYPE_DOUBLE ? ('"' + string + '"') : ("'" + string + "'"); + } + } + + var indent = state.indent * Math.max(1, level); // no 0-indent scalars + // As indentation gets deeper, let the width decrease monotonically + // to the lower bound min(state.lineWidth, 40). + // Note that this implies + // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound. + // state.lineWidth > 40 + state.indent: width decreases until the lower bound. + // This behaves better than a constant minimum width which disallows narrower options, + // or an indent threshold which causes the width to suddenly increase. + var lineWidth = state.lineWidth === -1 + ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); + + // Without knowing if keys are implicit/explicit, assume implicit for safety. + var singleLineOnly = iskey + // No block styles in flow mode. + || (state.flowLevel > -1 && level >= state.flowLevel); + function testAmbiguity(string) { + return testImplicitResolving(state, string); + } + + switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, + testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) { + + case STYLE_PLAIN: + return string; + case STYLE_SINGLE: + return "'" + string.replace(/'/g, "''") + "'"; + case STYLE_LITERAL: + return '|' + blockHeader(string, state.indent) + + dropEndingNewline(indentString(string, indent)); + case STYLE_FOLDED: + return '>' + blockHeader(string, state.indent) + + dropEndingNewline(indentString(foldString(string, lineWidth), indent)); + case STYLE_DOUBLE: + return '"' + escapeString(string, lineWidth) + '"'; + default: + throw new YAMLException('impossible error: invalid scalar style'); + } + }()); +} + +// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9. +function blockHeader(string, indentPerLevel) { + var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ''; + + // note the special case: the string '\n' counts as a "trailing" empty line. + var clip = string[string.length - 1] === '\n'; + var keep = clip && (string[string.length - 2] === '\n' || string === '\n'); + var chomp = keep ? '+' : (clip ? '' : '-'); + + return indentIndicator + chomp + '\n'; +} + +// (See the note for writeScalar.) +function dropEndingNewline(string) { + return string[string.length - 1] === '\n' ? string.slice(0, -1) : string; +} + +// Note: a long line without a suitable break point will exceed the width limit. +// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0. +function foldString(string, width) { + // In folded style, $k$ consecutive newlines output as $k+1$ newlines— + // unless they're before or after a more-indented line, or at the very + // beginning or end, in which case $k$ maps to $k$. + // Therefore, parse each chunk as newline(s) followed by a content line. + var lineRe = /(\n+)([^\n]*)/g; + + // first line (possibly an empty line) + var result = (function () { + var nextLF = string.indexOf('\n'); + nextLF = nextLF !== -1 ? nextLF : string.length; + lineRe.lastIndex = nextLF; + return foldLine(string.slice(0, nextLF), width); + }()); + // If we haven't reached the first content line yet, don't add an extra \n. + var prevMoreIndented = string[0] === '\n' || string[0] === ' '; + var moreIndented; + + // rest of the lines + var match; + while ((match = lineRe.exec(string))) { + var prefix = match[1], line = match[2]; + moreIndented = (line[0] === ' '); + result += prefix + + (!prevMoreIndented && !moreIndented && line !== '' + ? '\n' : '') + + foldLine(line, width); + prevMoreIndented = moreIndented; + } + + return result; +} + +// Greedy line breaking. +// Picks the longest line under the limit each time, +// otherwise settles for the shortest line over the limit. +// NB. More-indented lines *cannot* be folded, as that would add an extra \n. +function foldLine(line, width) { + if (line === '' || line[0] === ' ') return line; + + // Since a more-indented line adds a \n, breaks can't be followed by a space. + var breakRe = / [^ ]/g; // note: the match index will always be <= length-2. + var match; + // start is an inclusive index. end, curr, and next are exclusive. + var start = 0, end, curr = 0, next = 0; + var result = ''; + + // Invariants: 0 <= start <= length-1. + // 0 <= curr <= next <= max(0, length-2). curr - start <= width. + // Inside the loop: + // A match implies length >= 2, so curr and next are <= length-2. + while ((match = breakRe.exec(line))) { + next = match.index; + // maintain invariant: curr - start <= width + if (next - start > width) { + end = (curr > start) ? curr : next; // derive end <= length-2 + result += '\n' + line.slice(start, end); + // skip the space that was output as \n + start = end + 1; // derive start <= length-1 + } + curr = next; + } + + // By the invariants, start <= length-1, so there is something left over. + // It is either the whole string or a part starting from non-whitespace. + result += '\n'; + // Insert a break if the remainder is too long and there is a break available. + if (line.length - start > width && curr > start) { + result += line.slice(start, curr) + '\n' + line.slice(curr + 1); + } else { + result += line.slice(start); + } + + return result.slice(1); // drop extra \n joiner +} + +// Escapes a double-quoted string. +function escapeString(string) { + var result = ''; + var char = 0; + var escapeSeq; + + for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { + char = codePointAt(string, i); + escapeSeq = ESCAPE_SEQUENCES[char]; + + if (!escapeSeq && isPrintable(char)) { + result += string[i]; + if (char >= 0x10000) result += string[i + 1]; + } else { + result += escapeSeq || encodeHex(char); + } + } + + return result; +} + +function writeFlowSequence(state, level, object) { + var _result = '', + _tag = state.tag, + index, + length, + value; + + for (index = 0, length = object.length; index < length; index += 1) { + value = object[index]; + + if (state.replacer) { + value = state.replacer.call(object, String(index), value); + } + + // Write only valid elements, put null instead of invalid elements. + if (writeNode(state, level, value, false, false) || + (typeof value === 'undefined' && + writeNode(state, level, null, false, false))) { + + if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : ''); + _result += state.dump; + } + } + + state.tag = _tag; + state.dump = '[' + _result + ']'; +} + +function writeBlockSequence(state, level, object, compact) { + var _result = '', + _tag = state.tag, + index, + length, + value; + + for (index = 0, length = object.length; index < length; index += 1) { + value = object[index]; + + if (state.replacer) { + value = state.replacer.call(object, String(index), value); + } + + // Write only valid elements, put null instead of invalid elements. + if (writeNode(state, level + 1, value, true, true, false, true) || + (typeof value === 'undefined' && + writeNode(state, level + 1, null, true, true, false, true))) { + + if (!compact || _result !== '') { + _result += generateNextLine(state, level); + } + + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + _result += '-'; + } else { + _result += '- '; + } + + _result += state.dump; + } + } + + state.tag = _tag; + state.dump = _result || '[]'; // Empty sequence if no valid values. +} + +function writeFlowMapping(state, level, object) { + var _result = '', + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + pairBuffer; + + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + + pairBuffer = ''; + if (_result !== '') pairBuffer += ', '; + + if (state.condenseFlow) pairBuffer += '"'; + + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + + if (state.replacer) { + objectValue = state.replacer.call(object, objectKey, objectValue); + } + + if (!writeNode(state, level, objectKey, false, false)) { + continue; // Skip this pair because of invalid key; + } + + if (state.dump.length > 1024) pairBuffer += '? '; + + pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' '); + + if (!writeNode(state, level, objectValue, false, false)) { + continue; // Skip this pair because of invalid value. + } + + pairBuffer += state.dump; + + // Both key and value are valid. + _result += pairBuffer; + } + + state.tag = _tag; + state.dump = '{' + _result + '}'; +} + +function writeBlockMapping(state, level, object, compact) { + var _result = '', + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + explicitPair, + pairBuffer; + + // Allow sorting keys so that the output file is deterministic + if (state.sortKeys === true) { + // Default sorting + objectKeyList.sort(); + } else if (typeof state.sortKeys === 'function') { + // Custom sort function + objectKeyList.sort(state.sortKeys); + } else if (state.sortKeys) { + // Something is wrong + throw new YAMLException('sortKeys must be a boolean or a function'); + } + + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + pairBuffer = ''; + + if (!compact || _result !== '') { + pairBuffer += generateNextLine(state, level); + } + + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + + if (state.replacer) { + objectValue = state.replacer.call(object, objectKey, objectValue); + } + + if (!writeNode(state, level + 1, objectKey, true, true, true)) { + continue; // Skip this pair because of invalid key. + } + + explicitPair = (state.tag !== null && state.tag !== '?') || + (state.dump && state.dump.length > 1024); + + if (explicitPair) { + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + pairBuffer += '?'; + } else { + pairBuffer += '? '; + } + } + + pairBuffer += state.dump; + + if (explicitPair) { + pairBuffer += generateNextLine(state, level); + } + + if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { + continue; // Skip this pair because of invalid value. + } + + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + pairBuffer += ':'; + } else { + pairBuffer += ': '; + } + + pairBuffer += state.dump; + + // Both key and value are valid. + _result += pairBuffer; + } + + state.tag = _tag; + state.dump = _result || '{}'; // Empty mapping if no valid pairs. +} + +function detectType(state, object, explicit) { + var _result, typeList, index, length, type, style; + + typeList = explicit ? state.explicitTypes : state.implicitTypes; + + for (index = 0, length = typeList.length; index < length; index += 1) { + type = typeList[index]; + + if ((type.instanceOf || type.predicate) && + (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) && + (!type.predicate || type.predicate(object))) { + + if (explicit) { + if (type.multi && type.representName) { + state.tag = type.representName(object); + } else { + state.tag = type.tag; + } + } else { + state.tag = '?'; + } + + if (type.represent) { + style = state.styleMap[type.tag] || type.defaultStyle; + + if (_toString.call(type.represent) === '[object Function]') { + _result = type.represent(object, style); + } else if (_hasOwnProperty.call(type.represent, style)) { + _result = type.represent[style](object, style); + } else { + throw new YAMLException('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); + } + + state.dump = _result; + } + + return true; + } + } + + return false; +} + +// Serializes `object` and writes it to global `result`. +// Returns true on success, or false on invalid object. +// +function writeNode(state, level, object, block, compact, iskey, isblockseq) { + state.tag = null; + state.dump = object; + + if (!detectType(state, object, false)) { + detectType(state, object, true); + } + + var type = _toString.call(state.dump); + var inblock = block; + var tagStr; + + if (block) { + block = (state.flowLevel < 0 || state.flowLevel > level); + } + + var objectOrArray = type === '[object Object]' || type === '[object Array]', + duplicateIndex, + duplicate; + + if (objectOrArray) { + duplicateIndex = state.duplicates.indexOf(object); + duplicate = duplicateIndex !== -1; + } + + if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) { + compact = false; + } + + if (duplicate && state.usedDuplicates[duplicateIndex]) { + state.dump = '*ref_' + duplicateIndex; + } else { + if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { + state.usedDuplicates[duplicateIndex] = true; + } + if (type === '[object Object]') { + if (block && (Object.keys(state.dump).length !== 0)) { + writeBlockMapping(state, level, state.dump, compact); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + state.dump; + } + } else { + writeFlowMapping(state, level, state.dump); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; + } + } + } else if (type === '[object Array]') { + if (block && (state.dump.length !== 0)) { + if (state.noArrayIndent && !isblockseq && level > 0) { + writeBlockSequence(state, level - 1, state.dump, compact); + } else { + writeBlockSequence(state, level, state.dump, compact); + } + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + state.dump; + } + } else { + writeFlowSequence(state, level, state.dump); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; + } + } + } else if (type === '[object String]') { + if (state.tag !== '?') { + writeScalar(state, state.dump, level, iskey, inblock); + } + } else if (type === '[object Undefined]') { + return false; + } else { + if (state.skipInvalid) return false; + throw new YAMLException('unacceptable kind of an object to dump ' + type); + } + + if (state.tag !== null && state.tag !== '?') { + // Need to encode all characters except those allowed by the spec: + // + // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */ + // [36] ns-hex-digit ::= ns-dec-digit + // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */ + // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */ + // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | “-” + // [39] ns-uri-char ::= “%” ns-hex-digit ns-hex-digit | ns-word-char | “#” + // | “;” | “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,” + // | “_” | “.” | “!” | “~” | “*” | “'” | “(” | “)” | “[” | “]” + // + // Also need to encode '!' because it has special meaning (end of tag prefix). + // + tagStr = encodeURI( + state.tag[0] === '!' ? state.tag.slice(1) : state.tag + ).replace(/!/g, '%21'); + + if (state.tag[0] === '!') { + tagStr = '!' + tagStr; + } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') { + tagStr = '!!' + tagStr.slice(18); + } else { + tagStr = '!<' + tagStr + '>'; + } + + state.dump = tagStr + ' ' + state.dump; + } + } + + return true; +} + +function getDuplicateReferences(object, state) { + var objects = [], + duplicatesIndexes = [], + index, + length; + + inspectNode(object, objects, duplicatesIndexes); + + for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { + state.duplicates.push(objects[duplicatesIndexes[index]]); + } + state.usedDuplicates = new Array(length); +} + +function inspectNode(object, objects, duplicatesIndexes) { + var objectKeyList, + index, + length; + + if (object !== null && typeof object === 'object') { + index = objects.indexOf(object); + if (index !== -1) { + if (duplicatesIndexes.indexOf(index) === -1) { + duplicatesIndexes.push(index); + } + } else { + objects.push(object); + + if (Array.isArray(object)) { + for (index = 0, length = object.length; index < length; index += 1) { + inspectNode(object[index], objects, duplicatesIndexes); + } + } else { + objectKeyList = Object.keys(object); + + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); + } + } + } + } +} + +function dump(input, options) { + options = options || {}; + + var state = new State(options); + + if (!state.noRefs) getDuplicateReferences(input, state); + + var value = input; + + if (state.replacer) { + value = state.replacer.call({ '': value }, '', value); + } + + if (writeNode(state, 0, value, true, true)) return state.dump + '\n'; + + return ''; +} + +module.exports.dump = dump; diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/exception.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/exception.js new file mode 100644 index 0000000..7f62daa --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/exception.js @@ -0,0 +1,55 @@ +// YAML error class. http://stackoverflow.com/questions/8458984 +// +'use strict'; + + +function formatError(exception, compact) { + var where = '', message = exception.reason || '(unknown reason)'; + + if (!exception.mark) return message; + + if (exception.mark.name) { + where += 'in "' + exception.mark.name + '" '; + } + + where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')'; + + if (!compact && exception.mark.snippet) { + where += '\n\n' + exception.mark.snippet; + } + + return message + ' ' + where; +} + + +function YAMLException(reason, mark) { + // Super constructor + Error.call(this); + + this.name = 'YAMLException'; + this.reason = reason; + this.mark = mark; + this.message = formatError(this, false); + + // Include stack trace in error object + if (Error.captureStackTrace) { + // Chrome and NodeJS + Error.captureStackTrace(this, this.constructor); + } else { + // FF, IE 10+ and Safari 6+. Fallback for others + this.stack = (new Error()).stack || ''; + } +} + + +// Inherit from Error +YAMLException.prototype = Object.create(Error.prototype); +YAMLException.prototype.constructor = YAMLException; + + +YAMLException.prototype.toString = function toString(compact) { + return this.name + ': ' + formatError(this, compact); +}; + + +module.exports = YAMLException; diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/loader.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/loader.js new file mode 100644 index 0000000..39f13f5 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/loader.js @@ -0,0 +1,1727 @@ +'use strict'; + +/*eslint-disable max-len,no-use-before-define*/ + +var common = require('./common'); +var YAMLException = require('./exception'); +var makeSnippet = require('./snippet'); +var DEFAULT_SCHEMA = require('./schema/default'); + + +var _hasOwnProperty = Object.prototype.hasOwnProperty; + + +var CONTEXT_FLOW_IN = 1; +var CONTEXT_FLOW_OUT = 2; +var CONTEXT_BLOCK_IN = 3; +var CONTEXT_BLOCK_OUT = 4; + + +var CHOMPING_CLIP = 1; +var CHOMPING_STRIP = 2; +var CHOMPING_KEEP = 3; + + +var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; +var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; +var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; +var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; +var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; + + +function _class(obj) { return Object.prototype.toString.call(obj); } + +function is_EOL(c) { + return (c === 0x0A/* LF */) || (c === 0x0D/* CR */); +} + +function is_WHITE_SPACE(c) { + return (c === 0x09/* Tab */) || (c === 0x20/* Space */); +} + +function is_WS_OR_EOL(c) { + return (c === 0x09/* Tab */) || + (c === 0x20/* Space */) || + (c === 0x0A/* LF */) || + (c === 0x0D/* CR */); +} + +function is_FLOW_INDICATOR(c) { + return c === 0x2C/* , */ || + c === 0x5B/* [ */ || + c === 0x5D/* ] */ || + c === 0x7B/* { */ || + c === 0x7D/* } */; +} + +function fromHexCode(c) { + var lc; + + if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { + return c - 0x30; + } + + /*eslint-disable no-bitwise*/ + lc = c | 0x20; + + if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) { + return lc - 0x61 + 10; + } + + return -1; +} + +function escapedHexLen(c) { + if (c === 0x78/* x */) { return 2; } + if (c === 0x75/* u */) { return 4; } + if (c === 0x55/* U */) { return 8; } + return 0; +} + +function fromDecimalCode(c) { + if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { + return c - 0x30; + } + + return -1; +} + +function simpleEscapeSequence(c) { + /* eslint-disable indent */ + return (c === 0x30/* 0 */) ? '\x00' : + (c === 0x61/* a */) ? '\x07' : + (c === 0x62/* b */) ? '\x08' : + (c === 0x74/* t */) ? '\x09' : + (c === 0x09/* Tab */) ? '\x09' : + (c === 0x6E/* n */) ? '\x0A' : + (c === 0x76/* v */) ? '\x0B' : + (c === 0x66/* f */) ? '\x0C' : + (c === 0x72/* r */) ? '\x0D' : + (c === 0x65/* e */) ? '\x1B' : + (c === 0x20/* Space */) ? ' ' : + (c === 0x22/* " */) ? '\x22' : + (c === 0x2F/* / */) ? '/' : + (c === 0x5C/* \ */) ? '\x5C' : + (c === 0x4E/* N */) ? '\x85' : + (c === 0x5F/* _ */) ? '\xA0' : + (c === 0x4C/* L */) ? '\u2028' : + (c === 0x50/* P */) ? '\u2029' : ''; +} + +function charFromCodepoint(c) { + if (c <= 0xFFFF) { + return String.fromCharCode(c); + } + // Encode UTF-16 surrogate pair + // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF + return String.fromCharCode( + ((c - 0x010000) >> 10) + 0xD800, + ((c - 0x010000) & 0x03FF) + 0xDC00 + ); +} + +var simpleEscapeCheck = new Array(256); // integer, for fast access +var simpleEscapeMap = new Array(256); +for (var i = 0; i < 256; i++) { + simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; + simpleEscapeMap[i] = simpleEscapeSequence(i); +} + + +function State(input, options) { + this.input = input; + + this.filename = options['filename'] || null; + this.schema = options['schema'] || DEFAULT_SCHEMA; + this.onWarning = options['onWarning'] || null; + // (Hidden) Remove? makes the loader to expect YAML 1.1 documents + // if such documents have no explicit %YAML directive + this.legacy = options['legacy'] || false; + + this.json = options['json'] || false; + this.listener = options['listener'] || null; + + this.implicitTypes = this.schema.compiledImplicit; + this.typeMap = this.schema.compiledTypeMap; + + this.length = input.length; + this.position = 0; + this.line = 0; + this.lineStart = 0; + this.lineIndent = 0; + + // position of first leading tab in the current line, + // used to make sure there are no tabs in the indentation + this.firstTabInLine = -1; + + this.documents = []; + + /* + this.version; + this.checkLineBreaks; + this.tagMap; + this.anchorMap; + this.tag; + this.anchor; + this.kind; + this.result;*/ + +} + + +function generateError(state, message) { + var mark = { + name: state.filename, + buffer: state.input.slice(0, -1), // omit trailing \0 + position: state.position, + line: state.line, + column: state.position - state.lineStart + }; + + mark.snippet = makeSnippet(mark); + + return new YAMLException(message, mark); +} + +function throwError(state, message) { + throw generateError(state, message); +} + +function throwWarning(state, message) { + if (state.onWarning) { + state.onWarning.call(null, generateError(state, message)); + } +} + + +var directiveHandlers = { + + YAML: function handleYamlDirective(state, name, args) { + + var match, major, minor; + + if (state.version !== null) { + throwError(state, 'duplication of %YAML directive'); + } + + if (args.length !== 1) { + throwError(state, 'YAML directive accepts exactly one argument'); + } + + match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); + + if (match === null) { + throwError(state, 'ill-formed argument of the YAML directive'); + } + + major = parseInt(match[1], 10); + minor = parseInt(match[2], 10); + + if (major !== 1) { + throwError(state, 'unacceptable YAML version of the document'); + } + + state.version = args[0]; + state.checkLineBreaks = (minor < 2); + + if (minor !== 1 && minor !== 2) { + throwWarning(state, 'unsupported YAML version of the document'); + } + }, + + TAG: function handleTagDirective(state, name, args) { + + var handle, prefix; + + if (args.length !== 2) { + throwError(state, 'TAG directive accepts exactly two arguments'); + } + + handle = args[0]; + prefix = args[1]; + + if (!PATTERN_TAG_HANDLE.test(handle)) { + throwError(state, 'ill-formed tag handle (first argument) of the TAG directive'); + } + + if (_hasOwnProperty.call(state.tagMap, handle)) { + throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); + } + + if (!PATTERN_TAG_URI.test(prefix)) { + throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive'); + } + + try { + prefix = decodeURIComponent(prefix); + } catch (err) { + throwError(state, 'tag prefix is malformed: ' + prefix); + } + + state.tagMap[handle] = prefix; + } +}; + + +function captureSegment(state, start, end, checkJson) { + var _position, _length, _character, _result; + + if (start < end) { + _result = state.input.slice(start, end); + + if (checkJson) { + for (_position = 0, _length = _result.length; _position < _length; _position += 1) { + _character = _result.charCodeAt(_position); + if (!(_character === 0x09 || + (0x20 <= _character && _character <= 0x10FFFF))) { + throwError(state, 'expected valid JSON character'); + } + } + } else if (PATTERN_NON_PRINTABLE.test(_result)) { + throwError(state, 'the stream contains non-printable characters'); + } + + state.result += _result; + } +} + +function mergeMappings(state, destination, source, overridableKeys) { + var sourceKeys, key, index, quantity; + + if (!common.isObject(source)) { + throwError(state, 'cannot merge mappings; the provided source object is unacceptable'); + } + + sourceKeys = Object.keys(source); + + for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { + key = sourceKeys[index]; + + if (!_hasOwnProperty.call(destination, key)) { + destination[key] = source[key]; + overridableKeys[key] = true; + } + } +} + +function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, + startLine, startLineStart, startPos) { + + var index, quantity; + + // The output is a plain object here, so keys can only be strings. + // We need to convert keyNode to a string, but doing so can hang the process + // (deeply nested arrays that explode exponentially using aliases). + if (Array.isArray(keyNode)) { + keyNode = Array.prototype.slice.call(keyNode); + + for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { + if (Array.isArray(keyNode[index])) { + throwError(state, 'nested arrays are not supported inside keys'); + } + + if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') { + keyNode[index] = '[object Object]'; + } + } + } + + // Avoid code execution in load() via toString property + // (still use its own toString for arrays, timestamps, + // and whatever user schema extensions happen to have @@toStringTag) + if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') { + keyNode = '[object Object]'; + } + + + keyNode = String(keyNode); + + if (_result === null) { + _result = {}; + } + + if (keyTag === 'tag:yaml.org,2002:merge') { + if (Array.isArray(valueNode)) { + for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { + mergeMappings(state, _result, valueNode[index], overridableKeys); + } + } else { + mergeMappings(state, _result, valueNode, overridableKeys); + } + } else { + if (!state.json && + !_hasOwnProperty.call(overridableKeys, keyNode) && + _hasOwnProperty.call(_result, keyNode)) { + state.line = startLine || state.line; + state.lineStart = startLineStart || state.lineStart; + state.position = startPos || state.position; + throwError(state, 'duplicated mapping key'); + } + + // used for this specific key only because Object.defineProperty is slow + if (keyNode === '__proto__') { + Object.defineProperty(_result, keyNode, { + configurable: true, + enumerable: true, + writable: true, + value: valueNode + }); + } else { + _result[keyNode] = valueNode; + } + delete overridableKeys[keyNode]; + } + + return _result; +} + +function readLineBreak(state) { + var ch; + + ch = state.input.charCodeAt(state.position); + + if (ch === 0x0A/* LF */) { + state.position++; + } else if (ch === 0x0D/* CR */) { + state.position++; + if (state.input.charCodeAt(state.position) === 0x0A/* LF */) { + state.position++; + } + } else { + throwError(state, 'a line break is expected'); + } + + state.line += 1; + state.lineStart = state.position; + state.firstTabInLine = -1; +} + +function skipSeparationSpace(state, allowComments, checkIndent) { + var lineBreaks = 0, + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) { + state.firstTabInLine = state.position; + } + ch = state.input.charCodeAt(++state.position); + } + + if (allowComments && ch === 0x23/* # */) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0); + } + + if (is_EOL(ch)) { + readLineBreak(state); + + ch = state.input.charCodeAt(state.position); + lineBreaks++; + state.lineIndent = 0; + + while (ch === 0x20/* Space */) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); + } + } else { + break; + } + } + + if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { + throwWarning(state, 'deficient indentation'); + } + + return lineBreaks; +} + +function testDocumentSeparator(state) { + var _position = state.position, + ch; + + ch = state.input.charCodeAt(_position); + + // Condition state.position === state.lineStart is tested + // in parent on each call, for efficiency. No needs to test here again. + if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) && + ch === state.input.charCodeAt(_position + 1) && + ch === state.input.charCodeAt(_position + 2)) { + + _position += 3; + + ch = state.input.charCodeAt(_position); + + if (ch === 0 || is_WS_OR_EOL(ch)) { + return true; + } + } + + return false; +} + +function writeFoldedLines(state, count) { + if (count === 1) { + state.result += ' '; + } else if (count > 1) { + state.result += common.repeat('\n', count - 1); + } +} + + +function readPlainScalar(state, nodeIndent, withinFlowCollection) { + var preceding, + following, + captureStart, + captureEnd, + hasPendingContent, + _line, + _lineStart, + _lineIndent, + _kind = state.kind, + _result = state.result, + ch; + + ch = state.input.charCodeAt(state.position); + + if (is_WS_OR_EOL(ch) || + is_FLOW_INDICATOR(ch) || + ch === 0x23/* # */ || + ch === 0x26/* & */ || + ch === 0x2A/* * */ || + ch === 0x21/* ! */ || + ch === 0x7C/* | */ || + ch === 0x3E/* > */ || + ch === 0x27/* ' */ || + ch === 0x22/* " */ || + ch === 0x25/* % */ || + ch === 0x40/* @ */ || + ch === 0x60/* ` */) { + return false; + } + + if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) { + following = state.input.charCodeAt(state.position + 1); + + if (is_WS_OR_EOL(following) || + withinFlowCollection && is_FLOW_INDICATOR(following)) { + return false; + } + } + + state.kind = 'scalar'; + state.result = ''; + captureStart = captureEnd = state.position; + hasPendingContent = false; + + while (ch !== 0) { + if (ch === 0x3A/* : */) { + following = state.input.charCodeAt(state.position + 1); + + if (is_WS_OR_EOL(following) || + withinFlowCollection && is_FLOW_INDICATOR(following)) { + break; + } + + } else if (ch === 0x23/* # */) { + preceding = state.input.charCodeAt(state.position - 1); + + if (is_WS_OR_EOL(preceding)) { + break; + } + + } else if ((state.position === state.lineStart && testDocumentSeparator(state)) || + withinFlowCollection && is_FLOW_INDICATOR(ch)) { + break; + + } else if (is_EOL(ch)) { + _line = state.line; + _lineStart = state.lineStart; + _lineIndent = state.lineIndent; + skipSeparationSpace(state, false, -1); + + if (state.lineIndent >= nodeIndent) { + hasPendingContent = true; + ch = state.input.charCodeAt(state.position); + continue; + } else { + state.position = captureEnd; + state.line = _line; + state.lineStart = _lineStart; + state.lineIndent = _lineIndent; + break; + } + } + + if (hasPendingContent) { + captureSegment(state, captureStart, captureEnd, false); + writeFoldedLines(state, state.line - _line); + captureStart = captureEnd = state.position; + hasPendingContent = false; + } + + if (!is_WHITE_SPACE(ch)) { + captureEnd = state.position + 1; + } + + ch = state.input.charCodeAt(++state.position); + } + + captureSegment(state, captureStart, captureEnd, false); + + if (state.result) { + return true; + } + + state.kind = _kind; + state.result = _result; + return false; +} + +function readSingleQuotedScalar(state, nodeIndent) { + var ch, + captureStart, captureEnd; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x27/* ' */) { + return false; + } + + state.kind = 'scalar'; + state.result = ''; + state.position++; + captureStart = captureEnd = state.position; + + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + if (ch === 0x27/* ' */) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + + if (ch === 0x27/* ' */) { + captureStart = state.position; + state.position++; + captureEnd = state.position; + } else { + return true; + } + + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, 'unexpected end of the document within a single quoted scalar'); + + } else { + state.position++; + captureEnd = state.position; + } + } + + throwError(state, 'unexpected end of the stream within a single quoted scalar'); +} + +function readDoubleQuotedScalar(state, nodeIndent) { + var captureStart, + captureEnd, + hexLength, + hexResult, + tmp, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x22/* " */) { + return false; + } + + state.kind = 'scalar'; + state.result = ''; + state.position++; + captureStart = captureEnd = state.position; + + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + if (ch === 0x22/* " */) { + captureSegment(state, captureStart, state.position, true); + state.position++; + return true; + + } else if (ch === 0x5C/* \ */) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + + if (is_EOL(ch)) { + skipSeparationSpace(state, false, nodeIndent); + + // TODO: rework to inline fn with no type cast? + } else if (ch < 256 && simpleEscapeCheck[ch]) { + state.result += simpleEscapeMap[ch]; + state.position++; + + } else if ((tmp = escapedHexLen(ch)) > 0) { + hexLength = tmp; + hexResult = 0; + + for (; hexLength > 0; hexLength--) { + ch = state.input.charCodeAt(++state.position); + + if ((tmp = fromHexCode(ch)) >= 0) { + hexResult = (hexResult << 4) + tmp; + + } else { + throwError(state, 'expected hexadecimal character'); + } + } + + state.result += charFromCodepoint(hexResult); + + state.position++; + + } else { + throwError(state, 'unknown escape sequence'); + } + + captureStart = captureEnd = state.position; + + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, 'unexpected end of the document within a double quoted scalar'); + + } else { + state.position++; + captureEnd = state.position; + } + } + + throwError(state, 'unexpected end of the stream within a double quoted scalar'); +} + +function readFlowCollection(state, nodeIndent) { + var readNext = true, + _line, + _lineStart, + _pos, + _tag = state.tag, + _result, + _anchor = state.anchor, + following, + terminator, + isPair, + isExplicitPair, + isMapping, + overridableKeys = Object.create(null), + keyNode, + keyTag, + valueNode, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch === 0x5B/* [ */) { + terminator = 0x5D;/* ] */ + isMapping = false; + _result = []; + } else if (ch === 0x7B/* { */) { + terminator = 0x7D;/* } */ + isMapping = true; + _result = {}; + } else { + return false; + } + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + + ch = state.input.charCodeAt(++state.position); + + while (ch !== 0) { + skipSeparationSpace(state, true, nodeIndent); + + ch = state.input.charCodeAt(state.position); + + if (ch === terminator) { + state.position++; + state.tag = _tag; + state.anchor = _anchor; + state.kind = isMapping ? 'mapping' : 'sequence'; + state.result = _result; + return true; + } else if (!readNext) { + throwError(state, 'missed comma between flow collection entries'); + } else if (ch === 0x2C/* , */) { + // "flow collection entries can never be completely empty", as per YAML 1.2, section 7.4 + throwError(state, "expected the node content, but found ','"); + } + + keyTag = keyNode = valueNode = null; + isPair = isExplicitPair = false; + + if (ch === 0x3F/* ? */) { + following = state.input.charCodeAt(state.position + 1); + + if (is_WS_OR_EOL(following)) { + isPair = isExplicitPair = true; + state.position++; + skipSeparationSpace(state, true, nodeIndent); + } + } + + _line = state.line; // Save the current line. + _lineStart = state.lineStart; + _pos = state.position; + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + keyTag = state.tag; + keyNode = state.result; + skipSeparationSpace(state, true, nodeIndent); + + ch = state.input.charCodeAt(state.position); + + if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) { + isPair = true; + ch = state.input.charCodeAt(++state.position); + skipSeparationSpace(state, true, nodeIndent); + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + valueNode = state.result; + } + + if (isMapping) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos); + } else if (isPair) { + _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos)); + } else { + _result.push(keyNode); + } + + skipSeparationSpace(state, true, nodeIndent); + + ch = state.input.charCodeAt(state.position); + + if (ch === 0x2C/* , */) { + readNext = true; + ch = state.input.charCodeAt(++state.position); + } else { + readNext = false; + } + } + + throwError(state, 'unexpected end of the stream within a flow collection'); +} + +function readBlockScalar(state, nodeIndent) { + var captureStart, + folding, + chomping = CHOMPING_CLIP, + didReadContent = false, + detectedIndent = false, + textIndent = nodeIndent, + emptyLines = 0, + atMoreIndented = false, + tmp, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch === 0x7C/* | */) { + folding = false; + } else if (ch === 0x3E/* > */) { + folding = true; + } else { + return false; + } + + state.kind = 'scalar'; + state.result = ''; + + while (ch !== 0) { + ch = state.input.charCodeAt(++state.position); + + if (ch === 0x2B/* + */ || ch === 0x2D/* - */) { + if (CHOMPING_CLIP === chomping) { + chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP; + } else { + throwError(state, 'repeat of a chomping mode identifier'); + } + + } else if ((tmp = fromDecimalCode(ch)) >= 0) { + if (tmp === 0) { + throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one'); + } else if (!detectedIndent) { + textIndent = nodeIndent + tmp - 1; + detectedIndent = true; + } else { + throwError(state, 'repeat of an indentation width identifier'); + } + + } else { + break; + } + } + + if (is_WHITE_SPACE(ch)) { + do { ch = state.input.charCodeAt(++state.position); } + while (is_WHITE_SPACE(ch)); + + if (ch === 0x23/* # */) { + do { ch = state.input.charCodeAt(++state.position); } + while (!is_EOL(ch) && (ch !== 0)); + } + } + + while (ch !== 0) { + readLineBreak(state); + state.lineIndent = 0; + + ch = state.input.charCodeAt(state.position); + + while ((!detectedIndent || state.lineIndent < textIndent) && + (ch === 0x20/* Space */)) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); + } + + if (!detectedIndent && state.lineIndent > textIndent) { + textIndent = state.lineIndent; + } + + if (is_EOL(ch)) { + emptyLines++; + continue; + } + + // End of the scalar. + if (state.lineIndent < textIndent) { + + // Perform the chomping. + if (chomping === CHOMPING_KEEP) { + state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + } else if (chomping === CHOMPING_CLIP) { + if (didReadContent) { // i.e. only if the scalar is not empty. + state.result += '\n'; + } + } + + // Break this `while` cycle and go to the funciton's epilogue. + break; + } + + // Folded style: use fancy rules to handle line breaks. + if (folding) { + + // Lines starting with white space characters (more-indented lines) are not folded. + if (is_WHITE_SPACE(ch)) { + atMoreIndented = true; + // except for the first content line (cf. Example 8.1) + state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + + // End of more-indented block. + } else if (atMoreIndented) { + atMoreIndented = false; + state.result += common.repeat('\n', emptyLines + 1); + + // Just one line break - perceive as the same line. + } else if (emptyLines === 0) { + if (didReadContent) { // i.e. only if we have already read some scalar content. + state.result += ' '; + } + + // Several line breaks - perceive as different lines. + } else { + state.result += common.repeat('\n', emptyLines); + } + + // Literal style: just add exact number of line breaks between content lines. + } else { + // Keep all line breaks except the header line break. + state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + } + + didReadContent = true; + detectedIndent = true; + emptyLines = 0; + captureStart = state.position; + + while (!is_EOL(ch) && (ch !== 0)) { + ch = state.input.charCodeAt(++state.position); + } + + captureSegment(state, captureStart, state.position, false); + } + + return true; +} + +function readBlockSequence(state, nodeIndent) { + var _line, + _tag = state.tag, + _anchor = state.anchor, + _result = [], + following, + detected = false, + ch; + + // there is a leading tab before this token, so it can't be a block sequence/mapping; + // it can still be flow sequence/mapping or a scalar + if (state.firstTabInLine !== -1) return false; + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + if (state.firstTabInLine !== -1) { + state.position = state.firstTabInLine; + throwError(state, 'tab characters must not be used in indentation'); + } + + if (ch !== 0x2D/* - */) { + break; + } + + following = state.input.charCodeAt(state.position + 1); + + if (!is_WS_OR_EOL(following)) { + break; + } + + detected = true; + state.position++; + + if (skipSeparationSpace(state, true, -1)) { + if (state.lineIndent <= nodeIndent) { + _result.push(null); + ch = state.input.charCodeAt(state.position); + continue; + } + } + + _line = state.line; + composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); + _result.push(state.result); + skipSeparationSpace(state, true, -1); + + ch = state.input.charCodeAt(state.position); + + if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) { + throwError(state, 'bad indentation of a sequence entry'); + } else if (state.lineIndent < nodeIndent) { + break; + } + } + + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = 'sequence'; + state.result = _result; + return true; + } + return false; +} + +function readBlockMapping(state, nodeIndent, flowIndent) { + var following, + allowCompact, + _line, + _keyLine, + _keyLineStart, + _keyPos, + _tag = state.tag, + _anchor = state.anchor, + _result = {}, + overridableKeys = Object.create(null), + keyTag = null, + keyNode = null, + valueNode = null, + atExplicitKey = false, + detected = false, + ch; + + // there is a leading tab before this token, so it can't be a block sequence/mapping; + // it can still be flow sequence/mapping or a scalar + if (state.firstTabInLine !== -1) return false; + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + if (!atExplicitKey && state.firstTabInLine !== -1) { + state.position = state.firstTabInLine; + throwError(state, 'tab characters must not be used in indentation'); + } + + following = state.input.charCodeAt(state.position + 1); + _line = state.line; // Save the current line. + + // + // Explicit notation case. There are two separate blocks: + // first for the key (denoted by "?") and second for the value (denoted by ":") + // + if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) { + + if (ch === 0x3F/* ? */) { + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + + detected = true; + atExplicitKey = true; + allowCompact = true; + + } else if (atExplicitKey) { + // i.e. 0x3A/* : */ === character after the explicit key. + atExplicitKey = false; + allowCompact = true; + + } else { + throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line'); + } + + state.position += 1; + ch = following; + + // + // Implicit notation case. Flow-style node as the key first, then ":", and the value. + // + } else { + _keyLine = state.line; + _keyLineStart = state.lineStart; + _keyPos = state.position; + + if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { + // Neither implicit nor explicit notation. + // Reading is done. Go to the epilogue. + break; + } + + if (state.line === _line) { + ch = state.input.charCodeAt(state.position); + + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + if (ch === 0x3A/* : */) { + ch = state.input.charCodeAt(++state.position); + + if (!is_WS_OR_EOL(ch)) { + throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); + } + + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + + detected = true; + atExplicitKey = false; + allowCompact = false; + keyTag = state.tag; + keyNode = state.result; + + } else if (detected) { + throwError(state, 'can not read an implicit mapping pair; a colon is missed'); + + } else { + state.tag = _tag; + state.anchor = _anchor; + return true; // Keep the result of `composeNode`. + } + + } else if (detected) { + throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key'); + + } else { + state.tag = _tag; + state.anchor = _anchor; + return true; // Keep the result of `composeNode`. + } + } + + // + // Common reading code for both explicit and implicit notations. + // + if (state.line === _line || state.lineIndent > nodeIndent) { + if (atExplicitKey) { + _keyLine = state.line; + _keyLineStart = state.lineStart; + _keyPos = state.position; + } + + if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { + if (atExplicitKey) { + keyNode = state.result; + } else { + valueNode = state.result; + } + } + + if (!atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + } + + if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) { + throwError(state, 'bad indentation of a mapping entry'); + } else if (state.lineIndent < nodeIndent) { + break; + } + } + + // + // Epilogue. + // + + // Special case: last mapping's node contains only the key in explicit notation. + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + } + + // Expose the resulting mapping. + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = 'mapping'; + state.result = _result; + } + + return detected; +} + +function readTagProperty(state) { + var _position, + isVerbatim = false, + isNamed = false, + tagHandle, + tagName, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x21/* ! */) return false; + + if (state.tag !== null) { + throwError(state, 'duplication of a tag property'); + } + + ch = state.input.charCodeAt(++state.position); + + if (ch === 0x3C/* < */) { + isVerbatim = true; + ch = state.input.charCodeAt(++state.position); + + } else if (ch === 0x21/* ! */) { + isNamed = true; + tagHandle = '!!'; + ch = state.input.charCodeAt(++state.position); + + } else { + tagHandle = '!'; + } + + _position = state.position; + + if (isVerbatim) { + do { ch = state.input.charCodeAt(++state.position); } + while (ch !== 0 && ch !== 0x3E/* > */); + + if (state.position < state.length) { + tagName = state.input.slice(_position, state.position); + ch = state.input.charCodeAt(++state.position); + } else { + throwError(state, 'unexpected end of the stream within a verbatim tag'); + } + } else { + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + + if (ch === 0x21/* ! */) { + if (!isNamed) { + tagHandle = state.input.slice(_position - 1, state.position + 1); + + if (!PATTERN_TAG_HANDLE.test(tagHandle)) { + throwError(state, 'named tag handle cannot contain such characters'); + } + + isNamed = true; + _position = state.position + 1; + } else { + throwError(state, 'tag suffix cannot contain exclamation marks'); + } + } + + ch = state.input.charCodeAt(++state.position); + } + + tagName = state.input.slice(_position, state.position); + + if (PATTERN_FLOW_INDICATORS.test(tagName)) { + throwError(state, 'tag suffix cannot contain flow indicator characters'); + } + } + + if (tagName && !PATTERN_TAG_URI.test(tagName)) { + throwError(state, 'tag name cannot contain such characters: ' + tagName); + } + + try { + tagName = decodeURIComponent(tagName); + } catch (err) { + throwError(state, 'tag name is malformed: ' + tagName); + } + + if (isVerbatim) { + state.tag = tagName; + + } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) { + state.tag = state.tagMap[tagHandle] + tagName; + + } else if (tagHandle === '!') { + state.tag = '!' + tagName; + + } else if (tagHandle === '!!') { + state.tag = 'tag:yaml.org,2002:' + tagName; + + } else { + throwError(state, 'undeclared tag handle "' + tagHandle + '"'); + } + + return true; +} + +function readAnchorProperty(state) { + var _position, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x26/* & */) return false; + + if (state.anchor !== null) { + throwError(state, 'duplication of an anchor property'); + } + + ch = state.input.charCodeAt(++state.position); + _position = state.position; + + while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + if (state.position === _position) { + throwError(state, 'name of an anchor node must contain at least one character'); + } + + state.anchor = state.input.slice(_position, state.position); + return true; +} + +function readAlias(state) { + var _position, alias, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch !== 0x2A/* * */) return false; + + ch = state.input.charCodeAt(++state.position); + _position = state.position; + + while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + if (state.position === _position) { + throwError(state, 'name of an alias node must contain at least one character'); + } + + alias = state.input.slice(_position, state.position); + + if (!_hasOwnProperty.call(state.anchorMap, alias)) { + throwError(state, 'unidentified alias "' + alias + '"'); + } + + state.result = state.anchorMap[alias]; + skipSeparationSpace(state, true, -1); + return true; +} + +function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { + var allowBlockStyles, + allowBlockScalars, + allowBlockCollections, + indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) { + indentStatus = 1; + } else if (state.lineIndent === parentIndent) { + indentStatus = 0; + } else if (state.lineIndent < parentIndent) { + indentStatus = -1; + } + } + } + + if (indentStatus === 1) { + while (readTagProperty(state) || readAnchorProperty(state)) { + if (skipSeparationSpace(state, true, -1)) { + atNewLine = true; + allowBlockCollections = allowBlockStyles; + + if (state.lineIndent > parentIndent) { + indentStatus = 1; + } else if (state.lineIndent === parentIndent) { + indentStatus = 0; + } else if (state.lineIndent < parentIndent) { + indentStatus = -1; + } + } else { + allowBlockCollections = false; + } + } + } + + if (allowBlockCollections) { + allowBlockCollections = atNewLine || allowCompact; + } + + if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { + if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { + flowIndent = parentIndent; + } else { + flowIndent = parentIndent + 1; + } + + blockIndent = state.position - state.lineStart; + + if (indentStatus === 1) { + if (allowBlockCollections && + (readBlockSequence(state, blockIndent) || + readBlockMapping(state, blockIndent, flowIndent)) || + readFlowCollection(state, flowIndent)) { + hasContent = true; + } else { + if ((allowBlockScalars && readBlockScalar(state, flowIndent)) || + readSingleQuotedScalar(state, flowIndent) || + readDoubleQuotedScalar(state, flowIndent)) { + hasContent = true; + + } else if (readAlias(state)) { + hasContent = true; + + if (state.tag !== null || state.anchor !== null) { + throwError(state, 'alias node should not have any properties'); + } + + } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { + hasContent = true; + + if (state.tag === null) { + state.tag = '?'; + } + } + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + } + } else if (indentStatus === 0) { + // Special case: block sequences are allowed to have same indentation level as the parent. + // http://www.yaml.org/spec/1.2/spec.html#id2799784 + hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); + } + } + + if (state.tag === null) { + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + + } else if (state.tag === '?') { + // Implicit resolving is not allowed for non-scalar types, and '?' + // non-specific tag is only automatically assigned to plain scalars. + // + // We only need to check kind conformity in case user explicitly assigns '?' + // tag, for example like this: "! [0]" + // + if (state.result !== null && state.kind !== 'scalar') { + throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); + } + + for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { + type = state.implicitTypes[typeIndex]; + + if (type.resolve(state.result)) { // `state.result` updated in resolver if matched + state.result = type.construct(state.result); + state.tag = type.tag; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + break; + } + } + } else if (state.tag !== '!') { + if (_hasOwnProperty.call(state.typeMap[state.kind || 'fallback'], state.tag)) { + type = state.typeMap[state.kind || 'fallback'][state.tag]; + } else { + // looking for multi type + type = null; + typeList = state.typeMap.multi[state.kind || 'fallback']; + + for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) { + if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) { + type = typeList[typeIndex]; + break; + } + } + } + + if (!type) { + throwError(state, 'unknown tag !<' + state.tag + '>'); + } + + if (state.result !== null && type.kind !== state.kind) { + throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); + } + + if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched + throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); + } else { + state.result = type.construct(state.result, state.tag); + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + } + } + + if (state.listener !== null) { + state.listener('close', state); + } + return state.tag !== null || state.anchor !== null || hasContent; +} + +function readDocument(state) { + var documentStart = state.position, + _position, + directiveName, + directiveArgs, + hasDirectives = false, + ch; + + state.version = null; + state.checkLineBreaks = state.legacy; + state.tagMap = Object.create(null); + state.anchorMap = Object.create(null); + + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + skipSeparationSpace(state, true, -1); + + ch = state.input.charCodeAt(state.position); + + if (state.lineIndent > 0 || ch !== 0x25/* % */) { + break; + } + + hasDirectives = true; + ch = state.input.charCodeAt(++state.position); + _position = state.position; + + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + directiveName = state.input.slice(_position, state.position); + directiveArgs = []; + + if (directiveName.length < 1) { + throwError(state, 'directive name must not be less than one character in length'); + } + + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + if (ch === 0x23/* # */) { + do { ch = state.input.charCodeAt(++state.position); } + while (ch !== 0 && !is_EOL(ch)); + break; + } + + if (is_EOL(ch)) break; + + _position = state.position; + + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + ch = state.input.charCodeAt(++state.position); + } + + directiveArgs.push(state.input.slice(_position, state.position)); + } + + if (ch !== 0) readLineBreak(state); + + if (_hasOwnProperty.call(directiveHandlers, directiveName)) { + directiveHandlers[directiveName](state, directiveName, directiveArgs); + } else { + throwWarning(state, 'unknown document directive "' + directiveName + '"'); + } + } + + skipSeparationSpace(state, true, -1); + + if (state.lineIndent === 0 && + state.input.charCodeAt(state.position) === 0x2D/* - */ && + state.input.charCodeAt(state.position + 1) === 0x2D/* - */ && + state.input.charCodeAt(state.position + 2) === 0x2D/* - */) { + state.position += 3; + skipSeparationSpace(state, true, -1); + + } else if (hasDirectives) { + throwError(state, 'directives end mark is expected'); + } + + composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); + skipSeparationSpace(state, true, -1); + + if (state.checkLineBreaks && + PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { + throwWarning(state, 'non-ASCII line breaks are interpreted as content'); + } + + state.documents.push(state.result); + + if (state.position === state.lineStart && testDocumentSeparator(state)) { + + if (state.input.charCodeAt(state.position) === 0x2E/* . */) { + state.position += 3; + skipSeparationSpace(state, true, -1); + } + return; + } + + if (state.position < (state.length - 1)) { + throwError(state, 'end of the stream or a document separator is expected'); + } else { + return; + } +} + + +function loadDocuments(input, options) { + input = String(input); + options = options || {}; + + if (input.length !== 0) { + + // Add tailing `\n` if not exists + if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ && + input.charCodeAt(input.length - 1) !== 0x0D/* CR */) { + input += '\n'; + } + + // Strip BOM + if (input.charCodeAt(0) === 0xFEFF) { + input = input.slice(1); + } + } + + var state = new State(input, options); + + var nullpos = input.indexOf('\0'); + + if (nullpos !== -1) { + state.position = nullpos; + throwError(state, 'null byte is not allowed in input'); + } + + // Use 0 as string terminator. That significantly simplifies bounds check. + state.input += '\0'; + + while (state.input.charCodeAt(state.position) === 0x20/* Space */) { + state.lineIndent += 1; + state.position += 1; + } + + while (state.position < (state.length - 1)) { + readDocument(state); + } + + return state.documents; +} + + +function loadAll(input, iterator, options) { + if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') { + options = iterator; + iterator = null; + } + + var documents = loadDocuments(input, options); + + if (typeof iterator !== 'function') { + return documents; + } + + for (var index = 0, length = documents.length; index < length; index += 1) { + iterator(documents[index]); + } +} + + +function load(input, options) { + var documents = loadDocuments(input, options); + + if (documents.length === 0) { + /*eslint-disable no-undefined*/ + return undefined; + } else if (documents.length === 1) { + return documents[0]; + } + throw new YAMLException('expected a single document in the stream, but found more'); +} + + +module.exports.loadAll = loadAll; +module.exports.load = load; diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema.js new file mode 100644 index 0000000..65b41f4 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema.js @@ -0,0 +1,121 @@ +'use strict'; + +/*eslint-disable max-len*/ + +var YAMLException = require('./exception'); +var Type = require('./type'); + + +function compileList(schema, name) { + var result = []; + + schema[name].forEach(function (currentType) { + var newIndex = result.length; + + result.forEach(function (previousType, previousIndex) { + if (previousType.tag === currentType.tag && + previousType.kind === currentType.kind && + previousType.multi === currentType.multi) { + + newIndex = previousIndex; + } + }); + + result[newIndex] = currentType; + }); + + return result; +} + + +function compileMap(/* lists... */) { + var result = { + scalar: {}, + sequence: {}, + mapping: {}, + fallback: {}, + multi: { + scalar: [], + sequence: [], + mapping: [], + fallback: [] + } + }, index, length; + + function collectType(type) { + if (type.multi) { + result.multi[type.kind].push(type); + result.multi['fallback'].push(type); + } else { + result[type.kind][type.tag] = result['fallback'][type.tag] = type; + } + } + + for (index = 0, length = arguments.length; index < length; index += 1) { + arguments[index].forEach(collectType); + } + return result; +} + + +function Schema(definition) { + return this.extend(definition); +} + + +Schema.prototype.extend = function extend(definition) { + var implicit = []; + var explicit = []; + + if (definition instanceof Type) { + // Schema.extend(type) + explicit.push(definition); + + } else if (Array.isArray(definition)) { + // Schema.extend([ type1, type2, ... ]) + explicit = explicit.concat(definition); + + } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) { + // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] }) + if (definition.implicit) implicit = implicit.concat(definition.implicit); + if (definition.explicit) explicit = explicit.concat(definition.explicit); + + } else { + throw new YAMLException('Schema.extend argument should be a Type, [ Type ], ' + + 'or a schema definition ({ implicit: [...], explicit: [...] })'); + } + + implicit.forEach(function (type) { + if (!(type instanceof Type)) { + throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.'); + } + + if (type.loadKind && type.loadKind !== 'scalar') { + throw new YAMLException('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.'); + } + + if (type.multi) { + throw new YAMLException('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.'); + } + }); + + explicit.forEach(function (type) { + if (!(type instanceof Type)) { + throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.'); + } + }); + + var result = Object.create(Schema.prototype); + + result.implicit = (this.implicit || []).concat(implicit); + result.explicit = (this.explicit || []).concat(explicit); + + result.compiledImplicit = compileList(result, 'implicit'); + result.compiledExplicit = compileList(result, 'explicit'); + result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit); + + return result; +}; + + +module.exports = Schema; diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/core.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/core.js new file mode 100644 index 0000000..608b26d --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/core.js @@ -0,0 +1,11 @@ +// Standard YAML's Core schema. +// http://www.yaml.org/spec/1.2/spec.html#id2804923 +// +// NOTE: JS-YAML does not support schema-specific tag resolution restrictions. +// So, Core schema has no distinctions from JSON schema is JS-YAML. + + +'use strict'; + + +module.exports = require('./json'); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/default.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/default.js new file mode 100644 index 0000000..3af0520 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/default.js @@ -0,0 +1,22 @@ +// JS-YAML's default schema for `safeLoad` function. +// It is not described in the YAML specification. +// +// This schema is based on standard YAML's Core schema and includes most of +// extra types described at YAML tag repository. (http://yaml.org/type/) + + +'use strict'; + + +module.exports = require('./core').extend({ + implicit: [ + require('../type/timestamp'), + require('../type/merge') + ], + explicit: [ + require('../type/binary'), + require('../type/omap'), + require('../type/pairs'), + require('../type/set') + ] +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/failsafe.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/failsafe.js new file mode 100644 index 0000000..b7a33eb --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/failsafe.js @@ -0,0 +1,17 @@ +// Standard YAML's Failsafe schema. +// http://www.yaml.org/spec/1.2/spec.html#id2802346 + + +'use strict'; + + +var Schema = require('../schema'); + + +module.exports = new Schema({ + explicit: [ + require('../type/str'), + require('../type/seq'), + require('../type/map') + ] +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/json.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/json.js new file mode 100644 index 0000000..b73df78 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/schema/json.js @@ -0,0 +1,19 @@ +// Standard YAML's JSON schema. +// http://www.yaml.org/spec/1.2/spec.html#id2803231 +// +// NOTE: JS-YAML does not support schema-specific tag resolution restrictions. +// So, this schema is not such strict as defined in the YAML specification. +// It allows numbers in binary notaion, use `Null` and `NULL` as `null`, etc. + + +'use strict'; + + +module.exports = require('./failsafe').extend({ + implicit: [ + require('../type/null'), + require('../type/bool'), + require('../type/int'), + require('../type/float') + ] +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/snippet.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/snippet.js new file mode 100644 index 0000000..00e2133 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/snippet.js @@ -0,0 +1,101 @@ +'use strict'; + + +var common = require('./common'); + + +// get snippet for a single line, respecting maxLength +function getLine(buffer, lineStart, lineEnd, position, maxLineLength) { + var head = ''; + var tail = ''; + var maxHalfLength = Math.floor(maxLineLength / 2) - 1; + + if (position - lineStart > maxHalfLength) { + head = ' ... '; + lineStart = position - maxHalfLength + head.length; + } + + if (lineEnd - position > maxHalfLength) { + tail = ' ...'; + lineEnd = position + maxHalfLength - tail.length; + } + + return { + str: head + buffer.slice(lineStart, lineEnd).replace(/\t/g, '→') + tail, + pos: position - lineStart + head.length // relative position + }; +} + + +function padStart(string, max) { + return common.repeat(' ', max - string.length) + string; +} + + +function makeSnippet(mark, options) { + options = Object.create(options || null); + + if (!mark.buffer) return null; + + if (!options.maxLength) options.maxLength = 79; + if (typeof options.indent !== 'number') options.indent = 1; + if (typeof options.linesBefore !== 'number') options.linesBefore = 3; + if (typeof options.linesAfter !== 'number') options.linesAfter = 2; + + var re = /\r?\n|\r|\0/g; + var lineStarts = [ 0 ]; + var lineEnds = []; + var match; + var foundLineNo = -1; + + while ((match = re.exec(mark.buffer))) { + lineEnds.push(match.index); + lineStarts.push(match.index + match[0].length); + + if (mark.position <= match.index && foundLineNo < 0) { + foundLineNo = lineStarts.length - 2; + } + } + + if (foundLineNo < 0) foundLineNo = lineStarts.length - 1; + + var result = '', i, line; + var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length; + var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3); + + for (i = 1; i <= options.linesBefore; i++) { + if (foundLineNo - i < 0) break; + line = getLine( + mark.buffer, + lineStarts[foundLineNo - i], + lineEnds[foundLineNo - i], + mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]), + maxLineLength + ); + result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) + + ' | ' + line.str + '\n' + result; + } + + line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength); + result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) + + ' | ' + line.str + '\n'; + result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\n'; + + for (i = 1; i <= options.linesAfter; i++) { + if (foundLineNo + i >= lineEnds.length) break; + line = getLine( + mark.buffer, + lineStarts[foundLineNo + i], + lineEnds[foundLineNo + i], + mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]), + maxLineLength + ); + result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) + + ' | ' + line.str + '\n'; + } + + return result.replace(/\n$/, ''); +} + + +module.exports = makeSnippet; diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type.js new file mode 100644 index 0000000..5e57877 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type.js @@ -0,0 +1,66 @@ +'use strict'; + +var YAMLException = require('./exception'); + +var TYPE_CONSTRUCTOR_OPTIONS = [ + 'kind', + 'multi', + 'resolve', + 'construct', + 'instanceOf', + 'predicate', + 'represent', + 'representName', + 'defaultStyle', + 'styleAliases' +]; + +var YAML_NODE_KINDS = [ + 'scalar', + 'sequence', + 'mapping' +]; + +function compileStyleAliases(map) { + var result = {}; + + if (map !== null) { + Object.keys(map).forEach(function (style) { + map[style].forEach(function (alias) { + result[String(alias)] = style; + }); + }); + } + + return result; +} + +function Type(tag, options) { + options = options || {}; + + Object.keys(options).forEach(function (name) { + if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { + throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); + } + }); + + // TODO: Add tag format check. + this.options = options; // keep original options in case user wants to extend this type later + this.tag = tag; + this.kind = options['kind'] || null; + this.resolve = options['resolve'] || function () { return true; }; + this.construct = options['construct'] || function (data) { return data; }; + this.instanceOf = options['instanceOf'] || null; + this.predicate = options['predicate'] || null; + this.represent = options['represent'] || null; + this.representName = options['representName'] || null; + this.defaultStyle = options['defaultStyle'] || null; + this.multi = options['multi'] || false; + this.styleAliases = compileStyleAliases(options['styleAliases'] || null); + + if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { + throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); + } +} + +module.exports = Type; diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/binary.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/binary.js new file mode 100644 index 0000000..e152351 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/binary.js @@ -0,0 +1,125 @@ +'use strict'; + +/*eslint-disable no-bitwise*/ + + +var Type = require('../type'); + + +// [ 64, 65, 66 ] -> [ padding, CR, LF ] +var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; + + +function resolveYamlBinary(data) { + if (data === null) return false; + + var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP; + + // Convert one by one. + for (idx = 0; idx < max; idx++) { + code = map.indexOf(data.charAt(idx)); + + // Skip CR/LF + if (code > 64) continue; + + // Fail on illegal characters + if (code < 0) return false; + + bitlen += 6; + } + + // If there are any bits left, source was corrupted + return (bitlen % 8) === 0; +} + +function constructYamlBinary(data) { + var idx, tailbits, + input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan + max = input.length, + map = BASE64_MAP, + bits = 0, + result = []; + + // Collect by 6*4 bits (3 bytes) + + for (idx = 0; idx < max; idx++) { + if ((idx % 4 === 0) && idx) { + result.push((bits >> 16) & 0xFF); + result.push((bits >> 8) & 0xFF); + result.push(bits & 0xFF); + } + + bits = (bits << 6) | map.indexOf(input.charAt(idx)); + } + + // Dump tail + + tailbits = (max % 4) * 6; + + if (tailbits === 0) { + result.push((bits >> 16) & 0xFF); + result.push((bits >> 8) & 0xFF); + result.push(bits & 0xFF); + } else if (tailbits === 18) { + result.push((bits >> 10) & 0xFF); + result.push((bits >> 2) & 0xFF); + } else if (tailbits === 12) { + result.push((bits >> 4) & 0xFF); + } + + return new Uint8Array(result); +} + +function representYamlBinary(object /*, style*/) { + var result = '', bits = 0, idx, tail, + max = object.length, + map = BASE64_MAP; + + // Convert every three bytes to 4 ASCII characters. + + for (idx = 0; idx < max; idx++) { + if ((idx % 3 === 0) && idx) { + result += map[(bits >> 18) & 0x3F]; + result += map[(bits >> 12) & 0x3F]; + result += map[(bits >> 6) & 0x3F]; + result += map[bits & 0x3F]; + } + + bits = (bits << 8) + object[idx]; + } + + // Dump tail + + tail = max % 3; + + if (tail === 0) { + result += map[(bits >> 18) & 0x3F]; + result += map[(bits >> 12) & 0x3F]; + result += map[(bits >> 6) & 0x3F]; + result += map[bits & 0x3F]; + } else if (tail === 2) { + result += map[(bits >> 10) & 0x3F]; + result += map[(bits >> 4) & 0x3F]; + result += map[(bits << 2) & 0x3F]; + result += map[64]; + } else if (tail === 1) { + result += map[(bits >> 2) & 0x3F]; + result += map[(bits << 4) & 0x3F]; + result += map[64]; + result += map[64]; + } + + return result; +} + +function isBinary(obj) { + return Object.prototype.toString.call(obj) === '[object Uint8Array]'; +} + +module.exports = new Type('tag:yaml.org,2002:binary', { + kind: 'scalar', + resolve: resolveYamlBinary, + construct: constructYamlBinary, + predicate: isBinary, + represent: representYamlBinary +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/bool.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/bool.js new file mode 100644 index 0000000..cb77459 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/bool.js @@ -0,0 +1,35 @@ +'use strict'; + +var Type = require('../type'); + +function resolveYamlBoolean(data) { + if (data === null) return false; + + var max = data.length; + + return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) || + (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE')); +} + +function constructYamlBoolean(data) { + return data === 'true' || + data === 'True' || + data === 'TRUE'; +} + +function isBoolean(object) { + return Object.prototype.toString.call(object) === '[object Boolean]'; +} + +module.exports = new Type('tag:yaml.org,2002:bool', { + kind: 'scalar', + resolve: resolveYamlBoolean, + construct: constructYamlBoolean, + predicate: isBoolean, + represent: { + lowercase: function (object) { return object ? 'true' : 'false'; }, + uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; }, + camelcase: function (object) { return object ? 'True' : 'False'; } + }, + defaultStyle: 'lowercase' +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/float.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/float.js new file mode 100644 index 0000000..74d77ec --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/float.js @@ -0,0 +1,97 @@ +'use strict'; + +var common = require('../common'); +var Type = require('../type'); + +var YAML_FLOAT_PATTERN = new RegExp( + // 2.5e4, 2.5 and integers + '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + + // .2e4, .2 + // special case, seems not from spec + '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + + // .inf + '|[-+]?\\.(?:inf|Inf|INF)' + + // .nan + '|\\.(?:nan|NaN|NAN))$'); + +function resolveYamlFloat(data) { + if (data === null) return false; + + if (!YAML_FLOAT_PATTERN.test(data) || + // Quick hack to not allow integers end with `_` + // Probably should update regexp & check speed + data[data.length - 1] === '_') { + return false; + } + + return true; +} + +function constructYamlFloat(data) { + var value, sign; + + value = data.replace(/_/g, '').toLowerCase(); + sign = value[0] === '-' ? -1 : 1; + + if ('+-'.indexOf(value[0]) >= 0) { + value = value.slice(1); + } + + if (value === '.inf') { + return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; + + } else if (value === '.nan') { + return NaN; + } + return sign * parseFloat(value, 10); +} + + +var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; + +function representYamlFloat(object, style) { + var res; + + if (isNaN(object)) { + switch (style) { + case 'lowercase': return '.nan'; + case 'uppercase': return '.NAN'; + case 'camelcase': return '.NaN'; + } + } else if (Number.POSITIVE_INFINITY === object) { + switch (style) { + case 'lowercase': return '.inf'; + case 'uppercase': return '.INF'; + case 'camelcase': return '.Inf'; + } + } else if (Number.NEGATIVE_INFINITY === object) { + switch (style) { + case 'lowercase': return '-.inf'; + case 'uppercase': return '-.INF'; + case 'camelcase': return '-.Inf'; + } + } else if (common.isNegativeZero(object)) { + return '-0.0'; + } + + res = object.toString(10); + + // JS stringifier can build scientific format without dots: 5e-100, + // while YAML requres dot: 5.e-100. Fix it with simple hack + + return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res; +} + +function isFloat(object) { + return (Object.prototype.toString.call(object) === '[object Number]') && + (object % 1 !== 0 || common.isNegativeZero(object)); +} + +module.exports = new Type('tag:yaml.org,2002:float', { + kind: 'scalar', + resolve: resolveYamlFloat, + construct: constructYamlFloat, + predicate: isFloat, + represent: representYamlFloat, + defaultStyle: 'lowercase' +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/int.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/int.js new file mode 100644 index 0000000..3fe3a44 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/int.js @@ -0,0 +1,156 @@ +'use strict'; + +var common = require('../common'); +var Type = require('../type'); + +function isHexCode(c) { + return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) || + ((0x41/* A */ <= c) && (c <= 0x46/* F */)) || + ((0x61/* a */ <= c) && (c <= 0x66/* f */)); +} + +function isOctCode(c) { + return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */)); +} + +function isDecCode(c) { + return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)); +} + +function resolveYamlInteger(data) { + if (data === null) return false; + + var max = data.length, + index = 0, + hasDigits = false, + ch; + + if (!max) return false; + + ch = data[index]; + + // sign + if (ch === '-' || ch === '+') { + ch = data[++index]; + } + + if (ch === '0') { + // 0 + if (index + 1 === max) return true; + ch = data[++index]; + + // base 2, base 8, base 16 + + if (ch === 'b') { + // base 2 + index++; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (ch !== '0' && ch !== '1') return false; + hasDigits = true; + } + return hasDigits && ch !== '_'; + } + + + if (ch === 'x') { + // base 16 + index++; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (!isHexCode(data.charCodeAt(index))) return false; + hasDigits = true; + } + return hasDigits && ch !== '_'; + } + + + if (ch === 'o') { + // base 8 + index++; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (!isOctCode(data.charCodeAt(index))) return false; + hasDigits = true; + } + return hasDigits && ch !== '_'; + } + } + + // base 10 (except 0) + + // value should not start with `_`; + if (ch === '_') return false; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (!isDecCode(data.charCodeAt(index))) { + return false; + } + hasDigits = true; + } + + // Should have digits and should not end with `_` + if (!hasDigits || ch === '_') return false; + + return true; +} + +function constructYamlInteger(data) { + var value = data, sign = 1, ch; + + if (value.indexOf('_') !== -1) { + value = value.replace(/_/g, ''); + } + + ch = value[0]; + + if (ch === '-' || ch === '+') { + if (ch === '-') sign = -1; + value = value.slice(1); + ch = value[0]; + } + + if (value === '0') return 0; + + if (ch === '0') { + if (value[1] === 'b') return sign * parseInt(value.slice(2), 2); + if (value[1] === 'x') return sign * parseInt(value.slice(2), 16); + if (value[1] === 'o') return sign * parseInt(value.slice(2), 8); + } + + return sign * parseInt(value, 10); +} + +function isInteger(object) { + return (Object.prototype.toString.call(object)) === '[object Number]' && + (object % 1 === 0 && !common.isNegativeZero(object)); +} + +module.exports = new Type('tag:yaml.org,2002:int', { + kind: 'scalar', + resolve: resolveYamlInteger, + construct: constructYamlInteger, + predicate: isInteger, + represent: { + binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); }, + octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); }, + decimal: function (obj) { return obj.toString(10); }, + /* eslint-disable max-len */ + hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); } + }, + defaultStyle: 'decimal', + styleAliases: { + binary: [ 2, 'bin' ], + octal: [ 8, 'oct' ], + decimal: [ 10, 'dec' ], + hexadecimal: [ 16, 'hex' ] + } +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/map.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/map.js new file mode 100644 index 0000000..f327bee --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/map.js @@ -0,0 +1,8 @@ +'use strict'; + +var Type = require('../type'); + +module.exports = new Type('tag:yaml.org,2002:map', { + kind: 'mapping', + construct: function (data) { return data !== null ? data : {}; } +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/merge.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/merge.js new file mode 100644 index 0000000..ae08a86 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/merge.js @@ -0,0 +1,12 @@ +'use strict'; + +var Type = require('../type'); + +function resolveYamlMerge(data) { + return data === '<<' || data === null; +} + +module.exports = new Type('tag:yaml.org,2002:merge', { + kind: 'scalar', + resolve: resolveYamlMerge +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/null.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/null.js new file mode 100644 index 0000000..315ca4e --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/null.js @@ -0,0 +1,35 @@ +'use strict'; + +var Type = require('../type'); + +function resolveYamlNull(data) { + if (data === null) return true; + + var max = data.length; + + return (max === 1 && data === '~') || + (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL')); +} + +function constructYamlNull() { + return null; +} + +function isNull(object) { + return object === null; +} + +module.exports = new Type('tag:yaml.org,2002:null', { + kind: 'scalar', + resolve: resolveYamlNull, + construct: constructYamlNull, + predicate: isNull, + represent: { + canonical: function () { return '~'; }, + lowercase: function () { return 'null'; }, + uppercase: function () { return 'NULL'; }, + camelcase: function () { return 'Null'; }, + empty: function () { return ''; } + }, + defaultStyle: 'lowercase' +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/omap.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/omap.js new file mode 100644 index 0000000..b2b5323 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/omap.js @@ -0,0 +1,44 @@ +'use strict'; + +var Type = require('../type'); + +var _hasOwnProperty = Object.prototype.hasOwnProperty; +var _toString = Object.prototype.toString; + +function resolveYamlOmap(data) { + if (data === null) return true; + + var objectKeys = [], index, length, pair, pairKey, pairHasKey, + object = data; + + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + pairHasKey = false; + + if (_toString.call(pair) !== '[object Object]') return false; + + for (pairKey in pair) { + if (_hasOwnProperty.call(pair, pairKey)) { + if (!pairHasKey) pairHasKey = true; + else return false; + } + } + + if (!pairHasKey) return false; + + if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey); + else return false; + } + + return true; +} + +function constructYamlOmap(data) { + return data !== null ? data : []; +} + +module.exports = new Type('tag:yaml.org,2002:omap', { + kind: 'sequence', + resolve: resolveYamlOmap, + construct: constructYamlOmap +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/pairs.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/pairs.js new file mode 100644 index 0000000..74b5240 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/pairs.js @@ -0,0 +1,53 @@ +'use strict'; + +var Type = require('../type'); + +var _toString = Object.prototype.toString; + +function resolveYamlPairs(data) { + if (data === null) return true; + + var index, length, pair, keys, result, + object = data; + + result = new Array(object.length); + + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + + if (_toString.call(pair) !== '[object Object]') return false; + + keys = Object.keys(pair); + + if (keys.length !== 1) return false; + + result[index] = [ keys[0], pair[keys[0]] ]; + } + + return true; +} + +function constructYamlPairs(data) { + if (data === null) return []; + + var index, length, pair, keys, result, + object = data; + + result = new Array(object.length); + + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + + keys = Object.keys(pair); + + result[index] = [ keys[0], pair[keys[0]] ]; + } + + return result; +} + +module.exports = new Type('tag:yaml.org,2002:pairs', { + kind: 'sequence', + resolve: resolveYamlPairs, + construct: constructYamlPairs +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/seq.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/seq.js new file mode 100644 index 0000000..be8f77f --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/seq.js @@ -0,0 +1,8 @@ +'use strict'; + +var Type = require('../type'); + +module.exports = new Type('tag:yaml.org,2002:seq', { + kind: 'sequence', + construct: function (data) { return data !== null ? data : []; } +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/set.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/set.js new file mode 100644 index 0000000..f885a32 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/set.js @@ -0,0 +1,29 @@ +'use strict'; + +var Type = require('../type'); + +var _hasOwnProperty = Object.prototype.hasOwnProperty; + +function resolveYamlSet(data) { + if (data === null) return true; + + var key, object = data; + + for (key in object) { + if (_hasOwnProperty.call(object, key)) { + if (object[key] !== null) return false; + } + } + + return true; +} + +function constructYamlSet(data) { + return data !== null ? data : {}; +} + +module.exports = new Type('tag:yaml.org,2002:set', { + kind: 'mapping', + resolve: resolveYamlSet, + construct: constructYamlSet +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/str.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/str.js new file mode 100644 index 0000000..27acc10 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/str.js @@ -0,0 +1,8 @@ +'use strict'; + +var Type = require('../type'); + +module.exports = new Type('tag:yaml.org,2002:str', { + kind: 'scalar', + construct: function (data) { return data !== null ? data : ''; } +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/timestamp.js b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/timestamp.js new file mode 100644 index 0000000..8fa9c58 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/lib/type/timestamp.js @@ -0,0 +1,88 @@ +'use strict'; + +var Type = require('../type'); + +var YAML_DATE_REGEXP = new RegExp( + '^([0-9][0-9][0-9][0-9])' + // [1] year + '-([0-9][0-9])' + // [2] month + '-([0-9][0-9])$'); // [3] day + +var YAML_TIMESTAMP_REGEXP = new RegExp( + '^([0-9][0-9][0-9][0-9])' + // [1] year + '-([0-9][0-9]?)' + // [2] month + '-([0-9][0-9]?)' + // [3] day + '(?:[Tt]|[ \\t]+)' + // ... + '([0-9][0-9]?)' + // [4] hour + ':([0-9][0-9])' + // [5] minute + ':([0-9][0-9])' + // [6] second + '(?:\\.([0-9]*))?' + // [7] fraction + '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour + '(?::([0-9][0-9]))?))?$'); // [11] tz_minute + +function resolveYamlTimestamp(data) { + if (data === null) return false; + if (YAML_DATE_REGEXP.exec(data) !== null) return true; + if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; + return false; +} + +function constructYamlTimestamp(data) { + var match, year, month, day, hour, minute, second, fraction = 0, + delta = null, tz_hour, tz_minute, date; + + match = YAML_DATE_REGEXP.exec(data); + if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); + + if (match === null) throw new Error('Date resolve error'); + + // match: [1] year [2] month [3] day + + year = +(match[1]); + month = +(match[2]) - 1; // JS month starts with 0 + day = +(match[3]); + + if (!match[4]) { // no hour + return new Date(Date.UTC(year, month, day)); + } + + // match: [4] hour [5] minute [6] second [7] fraction + + hour = +(match[4]); + minute = +(match[5]); + second = +(match[6]); + + if (match[7]) { + fraction = match[7].slice(0, 3); + while (fraction.length < 3) { // milli-seconds + fraction += '0'; + } + fraction = +fraction; + } + + // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute + + if (match[9]) { + tz_hour = +(match[10]); + tz_minute = +(match[11] || 0); + delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds + if (match[9] === '-') delta = -delta; + } + + date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); + + if (delta) date.setTime(date.getTime() - delta); + + return date; +} + +function representYamlTimestamp(object /*, style*/) { + return object.toISOString(); +} + +module.exports = new Type('tag:yaml.org,2002:timestamp', { + kind: 'scalar', + resolve: resolveYamlTimestamp, + construct: constructYamlTimestamp, + instanceOf: Date, + represent: representYamlTimestamp +}); diff --git a/node_modules/@11ty/eleventy/node_modules/js-yaml/package.json b/node_modules/@11ty/eleventy/node_modules/js-yaml/package.json new file mode 100644 index 0000000..17574da --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/js-yaml/package.json @@ -0,0 +1,66 @@ +{ + "name": "js-yaml", + "version": "4.1.0", + "description": "YAML 1.2 parser and serializer", + "keywords": [ + "yaml", + "parser", + "serializer", + "pyyaml" + ], + "author": "Vladimir Zapparov ", + "contributors": [ + "Aleksey V Zapparov (http://www.ixti.net/)", + "Vitaly Puzrin (https://github.com/puzrin)", + "Martin Grenfell (http://got-ravings.blogspot.com)" + ], + "license": "MIT", + "repository": "nodeca/js-yaml", + "files": [ + "index.js", + "lib/", + "bin/", + "dist/" + ], + "bin": { + "js-yaml": "bin/js-yaml.js" + }, + "module": "./dist/js-yaml.mjs", + "exports": { + ".": { + "import": "./dist/js-yaml.mjs", + "require": "./index.js" + }, + "./package.json": "./package.json" + }, + "scripts": { + "lint": "eslint .", + "test": "npm run lint && mocha", + "coverage": "npm run lint && nyc mocha && nyc report --reporter html", + "demo": "npm run lint && node support/build_demo.js", + "gh-demo": "npm run demo && gh-pages -d demo -f", + "browserify": "rollup -c support/rollup.config.js", + "prepublishOnly": "npm run gh-demo" + }, + "unpkg": "dist/js-yaml.min.js", + "jsdelivr": "dist/js-yaml.min.js", + "dependencies": { + "argparse": "^2.0.1" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^17.0.0", + "@rollup/plugin-node-resolve": "^11.0.0", + "ansi": "^0.3.1", + "benchmark": "^2.1.4", + "codemirror": "^5.13.4", + "eslint": "^7.0.0", + "fast-check": "^2.8.0", + "gh-pages": "^3.1.0", + "mocha": "^8.2.1", + "nyc": "^15.1.0", + "rollup": "^2.34.1", + "rollup-plugin-node-polyfills": "^0.2.1", + "rollup-plugin-terser": "^7.0.2", + "shelljs": "^0.8.4" + } +} diff --git a/node_modules/@11ty/eleventy/node_modules/picomatch/LICENSE b/node_modules/@11ty/eleventy/node_modules/picomatch/LICENSE new file mode 100644 index 0000000..3608dca --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/picomatch/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017-present, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/@11ty/eleventy/node_modules/picomatch/README.md b/node_modules/@11ty/eleventy/node_modules/picomatch/README.md new file mode 100644 index 0000000..5062654 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/picomatch/README.md @@ -0,0 +1,738 @@ +

Picomatch

+ +

+ +version + + +test status + + +coverage status + + +downloads + +

+ +
+
+ +

+Blazing fast and accurate glob matcher written in JavaScript.
+No dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions. +

+ +
+
+ +## Why picomatch? + +* **Lightweight** - No dependencies +* **Minimal** - Tiny API surface. Main export is a function that takes a glob pattern and returns a matcher function. +* **Fast** - Loads in about 2ms (that's several times faster than a [single frame of a HD movie](http://www.endmemo.com/sconvert/framespersecondframespermillisecond.php) at 60fps) +* **Performant** - Use the returned matcher function to speed up repeat matching (like when watching files) +* **Accurate matching** - Using wildcards (`*` and `?`), globstars (`**`) for nested directories, [advanced globbing](#advanced-globbing) with extglobs, braces, and POSIX brackets, and support for escaping special characters with `\` or quotes. +* **Well tested** - Thousands of unit tests + +See the [library comparison](#library-comparisons) to other libraries. + +
+
+ +## Table of Contents + +
Click to expand + +- [Install](#install) +- [Usage](#usage) +- [API](#api) + * [picomatch](#picomatch) + * [.test](#test) + * [.matchBase](#matchbase) + * [.isMatch](#ismatch) + * [.parse](#parse) + * [.scan](#scan) + * [.compileRe](#compilere) + * [.makeRe](#makere) + * [.toRegex](#toregex) +- [Options](#options) + * [Picomatch options](#picomatch-options) + * [Scan Options](#scan-options) + * [Options Examples](#options-examples) +- [Globbing features](#globbing-features) + * [Basic globbing](#basic-globbing) + * [Advanced globbing](#advanced-globbing) + * [Braces](#braces) + * [Matching special characters as literals](#matching-special-characters-as-literals) +- [Library Comparisons](#library-comparisons) +- [Benchmarks](#benchmarks) +- [Philosophies](#philosophies) +- [About](#about) + * [Author](#author) + * [License](#license) + +_(TOC generated by [verb](https://github.com/verbose/verb) using [markdown-toc](https://github.com/jonschlinkert/markdown-toc))_ + +
+ +
+
+ +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +npm install --save picomatch +``` + +
+ +## Usage + +The main export is a function that takes a glob pattern and an options object and returns a function for matching strings. + +```js +const pm = require('picomatch'); +const isMatch = pm('*.js'); + +console.log(isMatch('abcd')); //=> false +console.log(isMatch('a.js')); //=> true +console.log(isMatch('a.md')); //=> false +console.log(isMatch('a/b.js')); //=> false +``` + +
+ +## API + +### [picomatch](lib/picomatch.js#L31) + +Creates a matcher function from one or more glob patterns. The returned function takes a string to match as its first argument, and returns true if the string is a match. The returned matcher function also takes a boolean as the second argument that, when true, returns an object with additional information. + +**Params** + +* `globs` **{String|Array}**: One or more glob patterns. +* `options` **{Object=}** +* `returns` **{Function=}**: Returns a matcher function. + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch(glob[, options]); + +const isMatch = picomatch('*.!(*a)'); +console.log(isMatch('a.a')); //=> false +console.log(isMatch('a.b')); //=> true +``` + +**Example without node.js** + +For environments without `node.js`, `picomatch/posix` provides you a dependency-free matcher, without automatic OS detection. + +```js +const picomatch = require('picomatch/posix'); +// the same API, defaulting to posix paths +const isMatch = picomatch('a/*'); +console.log(isMatch('a\\b')); //=> false +console.log(isMatch('a/b')); //=> true + +// you can still configure the matcher function to accept windows paths +const isMatch = picomatch('a/*', { options: windows }); +console.log(isMatch('a\\b')); //=> true +console.log(isMatch('a/b')); //=> true +``` + +### [.test](lib/picomatch.js#L116) + +Test `input` with the given `regex`. This is used by the main `picomatch()` function to test the input string. + +**Params** + +* `input` **{String}**: String to test. +* `regex` **{RegExp}** +* `returns` **{Object}**: Returns an object with matching info. + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.test(input, regex[, options]); + +console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); +// { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } +``` + +### [.matchBase](lib/picomatch.js#L160) + +Match the basename of a filepath. + +**Params** + +* `input` **{String}**: String to test. +* `glob` **{RegExp|String}**: Glob pattern or regex created by [.makeRe](#makeRe). +* `returns` **{Boolean}** + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.matchBase(input, glob[, options]); +console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true +``` + +### [.isMatch](lib/picomatch.js#L182) + +Returns true if **any** of the given glob `patterns` match the specified `string`. + +**Params** + +* **{String|Array}**: str The string to test. +* **{String|Array}**: patterns One or more glob patterns to use for matching. +* **{Object}**: See available [options](#options). +* `returns` **{Boolean}**: Returns true if any patterns match `str` + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.isMatch(string, patterns[, options]); + +console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true +console.log(picomatch.isMatch('a.a', 'b.*')); //=> false +``` + +### [.parse](lib/picomatch.js#L198) + +Parse a glob pattern to create the source string for a regular expression. + +**Params** + +* `pattern` **{String}** +* `options` **{Object}** +* `returns` **{Object}**: Returns an object with useful properties and output to be used as a regex source string. + +**Example** + +```js +const picomatch = require('picomatch'); +const result = picomatch.parse(pattern[, options]); +``` + +### [.scan](lib/picomatch.js#L230) + +Scan a glob pattern to separate the pattern into segments. + +**Params** + +* `input` **{String}**: Glob pattern to scan. +* `options` **{Object}** +* `returns` **{Object}**: Returns an object with + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.scan(input[, options]); + +const result = picomatch.scan('!./foo/*.js'); +console.log(result); +{ prefix: '!./', + input: '!./foo/*.js', + start: 3, + base: 'foo', + glob: '*.js', + isBrace: false, + isBracket: false, + isGlob: true, + isExtglob: false, + isGlobstar: false, + negated: true } +``` + +### [.compileRe](lib/picomatch.js#L244) + +Compile a regular expression from the `state` object returned by the +[parse()](#parse) method. + +**Params** + +* `state` **{Object}** +* `options` **{Object}** +* `returnOutput` **{Boolean}**: Intended for implementors, this argument allows you to return the raw output from the parser. +* `returnState` **{Boolean}**: Adds the state to a `state` property on the returned regex. Useful for implementors and debugging. +* `returns` **{RegExp}** + +### [.makeRe](lib/picomatch.js#L285) + +Create a regular expression from a parsed glob pattern. + +**Params** + +* `state` **{String}**: The object returned from the `.parse` method. +* `options` **{Object}** +* `returnOutput` **{Boolean}**: Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result. +* `returnState` **{Boolean}**: Implementors may use this argument to return the state from the parsed glob with the returned regular expression. +* `returns` **{RegExp}**: Returns a regex created from the given pattern. + +**Example** + +```js +const picomatch = require('picomatch'); +const state = picomatch.parse('*.js'); +// picomatch.compileRe(state[, options]); + +console.log(picomatch.compileRe(state)); +//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ +``` + +### [.toRegex](lib/picomatch.js#L320) + +Create a regular expression from the given regex source string. + +**Params** + +* `source` **{String}**: Regular expression source string. +* `options` **{Object}** +* `returns` **{RegExp}** + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.toRegex(source[, options]); + +const { output } = picomatch.parse('*.js'); +console.log(picomatch.toRegex(output)); +//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ +``` + +
+ +## Options + +### Picomatch options + +The following options may be used with the main `picomatch()` function or any of the methods on the picomatch API. + +| **Option** | **Type** | **Default value** | **Description** | +| --- | --- | --- | --- | +| `basename` | `boolean` | `false` | If set, then patterns without slashes will be matched against the basename of the path if it contains slashes. For example, `a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. | +| `bash` | `boolean` | `false` | Follow bash matching rules more strictly - disallows backslashes as escape characters, and treats single stars as globstars (`**`). | +| `capture` | `boolean` | `undefined` | Return regex matches in supporting methods. | +| `contains` | `boolean` | `undefined` | Allows glob to match any part of the given string(s). | +| `cwd` | `string` | `process.cwd()` | Current working directory. Used by `picomatch.split()` | +| `debug` | `boolean` | `undefined` | Debug regular expressions when an error is thrown. | +| `dot` | `boolean` | `false` | Enable dotfile matching. By default, dotfiles are ignored unless a `.` is explicitly defined in the pattern, or `options.dot` is true | +| `expandRange` | `function` | `undefined` | Custom function for expanding ranges in brace patterns, such as `{a..z}`. The function receives the range values as two arguments, and it must return a string to be used in the generated regex. It's recommended that returned strings be wrapped in parentheses. | +| `failglob` | `boolean` | `false` | Throws an error if no matches are found. Based on the bash option of the same name. | +| `fastpaths` | `boolean` | `true` | To speed up processing, full parsing is skipped for a handful common glob patterns. Disable this behavior by setting this option to `false`. | +| `flags` | `string` | `undefined` | Regex flags to use in the generated regex. If defined, the `nocase` option will be overridden. | +| [format](#optionsformat) | `function` | `undefined` | Custom function for formatting the returned string. This is useful for removing leading slashes, converting Windows paths to Posix paths, etc. | +| `ignore` | `array\|string` | `undefined` | One or more glob patterns for excluding strings that should not be matched from the result. | +| `keepQuotes` | `boolean` | `false` | Retain quotes in the generated regex, since quotes may also be used as an alternative to backslashes. | +| `literalBrackets` | `boolean` | `undefined` | When `true`, brackets in the glob pattern will be escaped so that only literal brackets will be matched. | +| `matchBase` | `boolean` | `false` | Alias for `basename` | +| `maxLength` | `boolean` | `65536` | Limit the max length of the input string. An error is thrown if the input string is longer than this value. | +| `nobrace` | `boolean` | `false` | Disable brace matching, so that `{a,b}` and `{1..3}` would be treated as literal characters. | +| `nobracket` | `boolean` | `undefined` | Disable matching with regex brackets. | +| `nocase` | `boolean` | `false` | Make matching case-insensitive. Equivalent to the regex `i` flag. Note that this option is overridden by the `flags` option. | +| `nodupes` | `boolean` | `true` | Deprecated, use `nounique` instead. This option will be removed in a future major release. By default duplicates are removed. Disable uniquification by setting this option to false. | +| `noext` | `boolean` | `false` | Alias for `noextglob` | +| `noextglob` | `boolean` | `false` | Disable support for matching with extglobs (like `+(a\|b)`) | +| `noglobstar` | `boolean` | `false` | Disable support for matching nested directories with globstars (`**`) | +| `nonegate` | `boolean` | `false` | Disable support for negating with leading `!` | +| `noquantifiers` | `boolean` | `false` | Disable support for regex quantifiers (like `a{1,2}`) and treat them as brace patterns to be expanded. | +| [onIgnore](#optionsonIgnore) | `function` | `undefined` | Function to be called on ignored items. | +| [onMatch](#optionsonMatch) | `function` | `undefined` | Function to be called on matched items. | +| [onResult](#optionsonResult) | `function` | `undefined` | Function to be called on all items, regardless of whether or not they are matched or ignored. | +| `posix` | `boolean` | `false` | Support POSIX character classes ("posix brackets"). | +| `posixSlashes` | `boolean` | `undefined` | Convert all slashes in file paths to forward slashes. This does not convert slashes in the glob pattern itself | +| `prepend` | `boolean` | `undefined` | String to prepend to the generated regex used for matching. | +| `regex` | `boolean` | `false` | Use regular expression rules for `+` (instead of matching literal `+`), and for stars that follow closing parentheses or brackets (as in `)*` and `]*`). | +| `strictBrackets` | `boolean` | `undefined` | Throw an error if brackets, braces, or parens are imbalanced. | +| `strictSlashes` | `boolean` | `undefined` | When true, picomatch won't match trailing slashes with single stars. | +| `unescape` | `boolean` | `undefined` | Remove backslashes preceding escaped characters in the glob pattern. By default, backslashes are retained. | +| `unixify` | `boolean` | `undefined` | Alias for `posixSlashes`, for backwards compatibility. | +| `windows` | `boolean` | `false` | Also accept backslashes as the path separator. | + +### Scan Options + +In addition to the main [picomatch options](#picomatch-options), the following options may also be used with the [.scan](#scan) method. + +| **Option** | **Type** | **Default value** | **Description** | +| --- | --- | --- | --- | +| `tokens` | `boolean` | `false` | When `true`, the returned object will include an array of tokens (objects), representing each path "segment" in the scanned glob pattern | +| `parts` | `boolean` | `false` | When `true`, the returned object will include an array of strings representing each path "segment" in the scanned glob pattern. This is automatically enabled when `options.tokens` is true | + +**Example** + +```js +const picomatch = require('picomatch'); +const result = picomatch.scan('!./foo/*.js', { tokens: true }); +console.log(result); +// { +// prefix: '!./', +// input: '!./foo/*.js', +// start: 3, +// base: 'foo', +// glob: '*.js', +// isBrace: false, +// isBracket: false, +// isGlob: true, +// isExtglob: false, +// isGlobstar: false, +// negated: true, +// maxDepth: 2, +// tokens: [ +// { value: '!./', depth: 0, isGlob: false, negated: true, isPrefix: true }, +// { value: 'foo', depth: 1, isGlob: false }, +// { value: '*.js', depth: 1, isGlob: true } +// ], +// slashes: [ 2, 6 ], +// parts: [ 'foo', '*.js' ] +// } +``` + +
+ +### Options Examples + +#### options.expandRange + +**Type**: `function` + +**Default**: `undefined` + +Custom function for expanding ranges in brace patterns. The [fill-range](https://github.com/jonschlinkert/fill-range) library is ideal for this purpose, or you can use custom code to do whatever you need. + +**Example** + +The following example shows how to create a glob that matches a folder + +```js +const fill = require('fill-range'); +const regex = pm.makeRe('foo/{01..25}/bar', { + expandRange(a, b) { + return `(${fill(a, b, { toRegex: true })})`; + } +}); + +console.log(regex); +//=> /^(?:foo\/((?:0[1-9]|1[0-9]|2[0-5]))\/bar)$/ + +console.log(regex.test('foo/00/bar')) // false +console.log(regex.test('foo/01/bar')) // true +console.log(regex.test('foo/10/bar')) // true +console.log(regex.test('foo/22/bar')) // true +console.log(regex.test('foo/25/bar')) // true +console.log(regex.test('foo/26/bar')) // false +``` + +#### options.format + +**Type**: `function` + +**Default**: `undefined` + +Custom function for formatting strings before they're matched. + +**Example** + +```js +// strip leading './' from strings +const format = str => str.replace(/^\.\//, ''); +const isMatch = picomatch('foo/*.js', { format }); +console.log(isMatch('./foo/bar.js')); //=> true +``` + +#### options.onMatch + +```js +const onMatch = ({ glob, regex, input, output }) => { + console.log({ glob, regex, input, output }); +}; + +const isMatch = picomatch('*', { onMatch }); +isMatch('foo'); +isMatch('bar'); +isMatch('baz'); +``` + +#### options.onIgnore + +```js +const onIgnore = ({ glob, regex, input, output }) => { + console.log({ glob, regex, input, output }); +}; + +const isMatch = picomatch('*', { onIgnore, ignore: 'f*' }); +isMatch('foo'); +isMatch('bar'); +isMatch('baz'); +``` + +#### options.onResult + +```js +const onResult = ({ glob, regex, input, output }) => { + console.log({ glob, regex, input, output }); +}; + +const isMatch = picomatch('*', { onResult, ignore: 'f*' }); +isMatch('foo'); +isMatch('bar'); +isMatch('baz'); +``` + +
+
+ +## Globbing features + +* [Basic globbing](#basic-globbing) (Wildcard matching) +* [Advanced globbing](#advanced-globbing) (extglobs, posix brackets, brace matching) + +### Basic globbing + +| **Character** | **Description** | +| --- | --- | +| `*` | Matches any character zero or more times, excluding path separators. Does _not match_ path separators or hidden files or directories ("dotfiles"), unless explicitly enabled by setting the `dot` option to `true`. | +| `**` | Matches any character zero or more times, including path separators. Note that `**` will only match path separators (`/`, and `\\` with the `windows` option) when they are the only characters in a path segment. Thus, `foo**/bar` is equivalent to `foo*/bar`, and `foo/a**b/bar` is equivalent to `foo/a*b/bar`, and _more than two_ consecutive stars in a glob path segment are regarded as _a single star_. Thus, `foo/***/bar` is equivalent to `foo/*/bar`. | +| `?` | Matches any character excluding path separators one time. Does _not match_ path separators or leading dots. | +| `[abc]` | Matches any characters inside the brackets. For example, `[abc]` would match the characters `a`, `b` or `c`, and nothing else. | + +#### Matching behavior vs. Bash + +Picomatch's matching features and expected results in unit tests are based on Bash's unit tests and the Bash 4.3 specification, with the following exceptions: + +* Bash will match `foo/bar/baz` with `*`. Picomatch only matches nested directories with `**`. +* Bash greedily matches with negated extglobs. For example, Bash 4.3 says that `!(foo)*` should match `foo` and `foobar`, since the trailing `*` bracktracks to match the preceding pattern. This is very memory-inefficient, and IMHO, also incorrect. Picomatch would return `false` for both `foo` and `foobar`. + +
+ +### Advanced globbing + +* [extglobs](#extglobs) +* [POSIX brackets](#posix-brackets) +* [Braces](#brace-expansion) + +#### Extglobs + +| **Pattern** | **Description** | +| --- | --- | +| `@(pattern)` | Match _only one_ consecutive occurrence of `pattern` | +| `*(pattern)` | Match _zero or more_ consecutive occurrences of `pattern` | +| `+(pattern)` | Match _one or more_ consecutive occurrences of `pattern` | +| `?(pattern)` | Match _zero or **one**_ consecutive occurrences of `pattern` | +| `!(pattern)` | Match _anything but_ `pattern` | + +**Examples** + +```js +const pm = require('picomatch'); + +// *(pattern) matches ZERO or more of "pattern" +console.log(pm.isMatch('a', 'a*(z)')); // true +console.log(pm.isMatch('az', 'a*(z)')); // true +console.log(pm.isMatch('azzz', 'a*(z)')); // true + +// +(pattern) matches ONE or more of "pattern" +console.log(pm.isMatch('a', 'a+(z)')); // false +console.log(pm.isMatch('az', 'a+(z)')); // true +console.log(pm.isMatch('azzz', 'a+(z)')); // true + +// supports multiple extglobs +console.log(pm.isMatch('foo.bar', '!(foo).!(bar)')); // false + +// supports nested extglobs +console.log(pm.isMatch('foo.bar', '!(!(foo)).!(!(bar))')); // true +``` + +#### POSIX brackets + +POSIX classes are disabled by default. Enable this feature by setting the `posix` option to true. + +**Enable POSIX bracket support** + +```js +console.log(pm.makeRe('[[:word:]]+', { posix: true })); +//=> /^(?:(?=.)[A-Za-z0-9_]+\/?)$/ +``` + +**Supported POSIX classes** + +The following named POSIX bracket expressions are supported: + +* `[:alnum:]` - Alphanumeric characters, equ `[a-zA-Z0-9]` +* `[:alpha:]` - Alphabetical characters, equivalent to `[a-zA-Z]`. +* `[:ascii:]` - ASCII characters, equivalent to `[\\x00-\\x7F]`. +* `[:blank:]` - Space and tab characters, equivalent to `[ \\t]`. +* `[:cntrl:]` - Control characters, equivalent to `[\\x00-\\x1F\\x7F]`. +* `[:digit:]` - Numerical digits, equivalent to `[0-9]`. +* `[:graph:]` - Graph characters, equivalent to `[\\x21-\\x7E]`. +* `[:lower:]` - Lowercase letters, equivalent to `[a-z]`. +* `[:print:]` - Print characters, equivalent to `[\\x20-\\x7E ]`. +* `[:punct:]` - Punctuation and symbols, equivalent to `[\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~]`. +* `[:space:]` - Extended space characters, equivalent to `[ \\t\\r\\n\\v\\f]`. +* `[:upper:]` - Uppercase letters, equivalent to `[A-Z]`. +* `[:word:]` - Word characters (letters, numbers and underscores), equivalent to `[A-Za-z0-9_]`. +* `[:xdigit:]` - Hexadecimal digits, equivalent to `[A-Fa-f0-9]`. + +See the [Bash Reference Manual](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html) for more information. + +### Braces + +Picomatch does not do brace expansion. For [brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html) and advanced matching with braces, use [micromatch](https://github.com/micromatch/micromatch) instead. Picomatch has very basic support for braces. + +### Matching special characters as literals + +If you wish to match the following special characters in a filepath, and you want to use these characters in your glob pattern, they must be escaped with backslashes or quotes: + +**Special Characters** + +Some characters that are used for matching in regular expressions are also regarded as valid file path characters on some platforms. + +To match any of the following characters as literals: `$^*+?()[] + +Examples: + +```js +console.log(pm.makeRe('foo/bar \\(1\\)')); +console.log(pm.makeRe('foo/bar \\(1\\)')); +``` + +
+
+ +## Library Comparisons + +The following table shows which features are supported by [minimatch](https://github.com/isaacs/minimatch), [micromatch](https://github.com/micromatch/micromatch), [picomatch](https://github.com/micromatch/picomatch), [nanomatch](https://github.com/micromatch/nanomatch), [extglob](https://github.com/micromatch/extglob), [braces](https://github.com/micromatch/braces), and [expand-brackets](https://github.com/micromatch/expand-brackets). + +| **Feature** | `minimatch` | `micromatch` | `picomatch` | `nanomatch` | `extglob` | `braces` | `expand-brackets` | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Wildcard matching (`*?+`) | ✔ | ✔ | ✔ | ✔ | - | - | - | +| Advancing globbing | ✔ | ✔ | ✔ | - | - | - | - | +| Brace _matching_ | ✔ | ✔ | ✔ | - | - | ✔ | - | +| Brace _expansion_ | ✔ | ✔ | - | - | - | ✔ | - | +| Extglobs | partial | ✔ | ✔ | - | ✔ | - | - | +| Posix brackets | - | ✔ | ✔ | - | - | - | ✔ | +| Regular expression syntax | - | ✔ | ✔ | ✔ | ✔ | - | ✔ | +| File system operations | - | - | - | - | - | - | - | + +
+
+ +## Benchmarks + +Performance comparison of picomatch and minimatch. + +_(Pay special attention to the last three benchmarks. Minimatch freezes on long ranges.)_ + +``` +# .makeRe star (*) + picomatch x 4,449,159 ops/sec ±0.24% (97 runs sampled) + minimatch x 632,772 ops/sec ±0.14% (98 runs sampled) + +# .makeRe star; dot=true (*) + picomatch x 3,500,079 ops/sec ±0.26% (99 runs sampled) + minimatch x 564,916 ops/sec ±0.23% (96 runs sampled) + +# .makeRe globstar (**) + picomatch x 3,261,000 ops/sec ±0.27% (98 runs sampled) + minimatch x 1,664,766 ops/sec ±0.20% (100 runs sampled) + +# .makeRe globstars (**/**/**) + picomatch x 3,284,469 ops/sec ±0.18% (97 runs sampled) + minimatch x 1,435,880 ops/sec ±0.34% (95 runs sampled) + +# .makeRe with leading star (*.txt) + picomatch x 3,100,197 ops/sec ±0.35% (99 runs sampled) + minimatch x 428,347 ops/sec ±0.42% (94 runs sampled) + +# .makeRe - basic braces ({a,b,c}*.txt) + picomatch x 443,578 ops/sec ±1.33% (89 runs sampled) + minimatch x 107,143 ops/sec ±0.35% (94 runs sampled) + +# .makeRe - short ranges ({a..z}*.txt) + picomatch x 415,484 ops/sec ±0.76% (96 runs sampled) + minimatch x 14,299 ops/sec ±0.26% (96 runs sampled) + +# .makeRe - medium ranges ({1..100000}*.txt) + picomatch x 395,020 ops/sec ±0.87% (89 runs sampled) + minimatch x 2 ops/sec ±4.59% (10 runs sampled) + +# .makeRe - long ranges ({1..10000000}*.txt) + picomatch x 400,036 ops/sec ±0.83% (90 runs sampled) + minimatch (FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory) +``` + +
+
+ +## Philosophies + +The goal of this library is to be blazing fast, without compromising on accuracy. + +**Accuracy** + +The number one of goal of this library is accuracy. However, it's not unusual for different glob implementations to have different rules for matching behavior, even with simple wildcard matching. It gets increasingly more complicated when combinations of different features are combined, like when extglobs are combined with globstars, braces, slashes, and so on: `!(**/{a,b,*/c})`. + +Thus, given that there is no canonical glob specification to use as a single source of truth when differences of opinion arise regarding behavior, sometimes we have to implement our best judgement and rely on feedback from users to make improvements. + +**Performance** + +Although this library performs well in benchmarks, and in most cases it's faster than other popular libraries we benchmarked against, we will always choose accuracy over performance. It's not helpful to anyone if our library is faster at returning the wrong answer. + +
+
+ +## About + +
+Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards. + +
+ +
+Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +npm install && npm test +``` + +
+ +
+Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
+ +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +### License + +Copyright © 2017-present, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). diff --git a/node_modules/@11ty/eleventy/node_modules/picomatch/index.js b/node_modules/@11ty/eleventy/node_modules/picomatch/index.js new file mode 100644 index 0000000..a753b1d --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/picomatch/index.js @@ -0,0 +1,17 @@ +'use strict'; + +const pico = require('./lib/picomatch'); +const utils = require('./lib/utils'); + +function picomatch(glob, options, returnState = false) { + // default to os.platform() + if (options && (options.windows === null || options.windows === undefined)) { + // don't mutate the original options object + options = { ...options, windows: utils.isWindows() }; + } + + return pico(glob, options, returnState); +} + +Object.assign(picomatch, pico); +module.exports = picomatch; diff --git a/node_modules/@11ty/eleventy/node_modules/picomatch/lib/constants.js b/node_modules/@11ty/eleventy/node_modules/picomatch/lib/constants.js new file mode 100644 index 0000000..27b3e20 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/picomatch/lib/constants.js @@ -0,0 +1,179 @@ +'use strict'; + +const WIN_SLASH = '\\\\/'; +const WIN_NO_SLASH = `[^${WIN_SLASH}]`; + +/** + * Posix glob regex + */ + +const DOT_LITERAL = '\\.'; +const PLUS_LITERAL = '\\+'; +const QMARK_LITERAL = '\\?'; +const SLASH_LITERAL = '\\/'; +const ONE_CHAR = '(?=.)'; +const QMARK = '[^/]'; +const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; +const START_ANCHOR = `(?:^|${SLASH_LITERAL})`; +const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; +const NO_DOT = `(?!${DOT_LITERAL})`; +const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; +const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; +const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; +const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; +const STAR = `${QMARK}*?`; +const SEP = '/'; + +const POSIX_CHARS = { + DOT_LITERAL, + PLUS_LITERAL, + QMARK_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + QMARK, + END_ANCHOR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOT_SLASH, + NO_DOTS_SLASH, + QMARK_NO_DOT, + STAR, + START_ANCHOR, + SEP +}; + +/** + * Windows glob regex + */ + +const WINDOWS_CHARS = { + ...POSIX_CHARS, + + SLASH_LITERAL: `[${WIN_SLASH}]`, + QMARK: WIN_NO_SLASH, + STAR: `${WIN_NO_SLASH}*?`, + DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, + NO_DOT: `(?!${DOT_LITERAL})`, + NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, + NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + QMARK_NO_DOT: `[^.${WIN_SLASH}]`, + START_ANCHOR: `(?:^|[${WIN_SLASH}])`, + END_ANCHOR: `(?:[${WIN_SLASH}]|$)`, + SEP: '\\' +}; + +/** + * POSIX Bracket Regex + */ + +const POSIX_REGEX_SOURCE = { + alnum: 'a-zA-Z0-9', + alpha: 'a-zA-Z', + ascii: '\\x00-\\x7F', + blank: ' \\t', + cntrl: '\\x00-\\x1F\\x7F', + digit: '0-9', + graph: '\\x21-\\x7E', + lower: 'a-z', + print: '\\x20-\\x7E ', + punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', + space: ' \\t\\r\\n\\v\\f', + upper: 'A-Z', + word: 'A-Za-z0-9_', + xdigit: 'A-Fa-f0-9' +}; + +module.exports = { + MAX_LENGTH: 1024 * 64, + POSIX_REGEX_SOURCE, + + // regular expressions + REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, + REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/, + REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, + REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, + REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, + REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, + + // Replace globs with equivalent patterns to reduce parsing time. + REPLACEMENTS: { + '***': '*', + '**/**': '**', + '**/**/**': '**' + }, + + // Digits + CHAR_0: 48, /* 0 */ + CHAR_9: 57, /* 9 */ + + // Alphabet chars. + CHAR_UPPERCASE_A: 65, /* A */ + CHAR_LOWERCASE_A: 97, /* a */ + CHAR_UPPERCASE_Z: 90, /* Z */ + CHAR_LOWERCASE_Z: 122, /* z */ + + CHAR_LEFT_PARENTHESES: 40, /* ( */ + CHAR_RIGHT_PARENTHESES: 41, /* ) */ + + CHAR_ASTERISK: 42, /* * */ + + // Non-alphabetic chars. + CHAR_AMPERSAND: 38, /* & */ + CHAR_AT: 64, /* @ */ + CHAR_BACKWARD_SLASH: 92, /* \ */ + CHAR_CARRIAGE_RETURN: 13, /* \r */ + CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */ + CHAR_COLON: 58, /* : */ + CHAR_COMMA: 44, /* , */ + CHAR_DOT: 46, /* . */ + CHAR_DOUBLE_QUOTE: 34, /* " */ + CHAR_EQUAL: 61, /* = */ + CHAR_EXCLAMATION_MARK: 33, /* ! */ + CHAR_FORM_FEED: 12, /* \f */ + CHAR_FORWARD_SLASH: 47, /* / */ + CHAR_GRAVE_ACCENT: 96, /* ` */ + CHAR_HASH: 35, /* # */ + CHAR_HYPHEN_MINUS: 45, /* - */ + CHAR_LEFT_ANGLE_BRACKET: 60, /* < */ + CHAR_LEFT_CURLY_BRACE: 123, /* { */ + CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */ + CHAR_LINE_FEED: 10, /* \n */ + CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */ + CHAR_PERCENT: 37, /* % */ + CHAR_PLUS: 43, /* + */ + CHAR_QUESTION_MARK: 63, /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */ + CHAR_RIGHT_CURLY_BRACE: 125, /* } */ + CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */ + CHAR_SEMICOLON: 59, /* ; */ + CHAR_SINGLE_QUOTE: 39, /* ' */ + CHAR_SPACE: 32, /* */ + CHAR_TAB: 9, /* \t */ + CHAR_UNDERSCORE: 95, /* _ */ + CHAR_VERTICAL_LINE: 124, /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */ + + /** + * Create EXTGLOB_CHARS + */ + + extglobChars(chars) { + return { + '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` }, + '?': { type: 'qmark', open: '(?:', close: ')?' }, + '+': { type: 'plus', open: '(?:', close: ')+' }, + '*': { type: 'star', open: '(?:', close: ')*' }, + '@': { type: 'at', open: '(?:', close: ')' } + }; + }, + + /** + * Create GLOB_CHARS + */ + + globChars(win32) { + return win32 === true ? WINDOWS_CHARS : POSIX_CHARS; + } +}; diff --git a/node_modules/@11ty/eleventy/node_modules/picomatch/lib/parse.js b/node_modules/@11ty/eleventy/node_modules/picomatch/lib/parse.js new file mode 100644 index 0000000..8fd8ff4 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/picomatch/lib/parse.js @@ -0,0 +1,1085 @@ +'use strict'; + +const constants = require('./constants'); +const utils = require('./utils'); + +/** + * Constants + */ + +const { + MAX_LENGTH, + POSIX_REGEX_SOURCE, + REGEX_NON_SPECIAL_CHARS, + REGEX_SPECIAL_CHARS_BACKREF, + REPLACEMENTS +} = constants; + +/** + * Helpers + */ + +const expandRange = (args, options) => { + if (typeof options.expandRange === 'function') { + return options.expandRange(...args, options); + } + + args.sort(); + const value = `[${args.join('-')}]`; + + try { + /* eslint-disable-next-line no-new */ + new RegExp(value); + } catch (ex) { + return args.map(v => utils.escapeRegex(v)).join('..'); + } + + return value; +}; + +/** + * Create the message for a syntax error + */ + +const syntaxError = (type, char) => { + return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`; +}; + +/** + * Parse the given input string. + * @param {String} input + * @param {Object} options + * @return {Object} + */ + +const parse = (input, options) => { + if (typeof input !== 'string') { + throw new TypeError('Expected a string'); + } + + input = REPLACEMENTS[input] || input; + + const opts = { ...options }; + const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + + let len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + + const bos = { type: 'bos', value: '', output: opts.prepend || '' }; + const tokens = [bos]; + + const capture = opts.capture ? '' : '?:'; + + // create constants based on platform, for windows or posix + const PLATFORM_CHARS = constants.globChars(opts.windows); + const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS); + + const { + DOT_LITERAL, + PLUS_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOT_SLASH, + NO_DOTS_SLASH, + QMARK, + QMARK_NO_DOT, + STAR, + START_ANCHOR + } = PLATFORM_CHARS; + + const globstar = opts => { + return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; + + const nodot = opts.dot ? '' : NO_DOT; + const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT; + let star = opts.bash === true ? globstar(opts) : STAR; + + if (opts.capture) { + star = `(${star})`; + } + + // minimatch options support + if (typeof opts.noext === 'boolean') { + opts.noextglob = opts.noext; + } + + const state = { + input, + index: -1, + start: 0, + dot: opts.dot === true, + consumed: '', + output: '', + prefix: '', + backtrack: false, + negated: false, + brackets: 0, + braces: 0, + parens: 0, + quotes: 0, + globstar: false, + tokens + }; + + input = utils.removePrefix(input, state); + len = input.length; + + const extglobs = []; + const braces = []; + const stack = []; + let prev = bos; + let value; + + /** + * Tokenizing helpers + */ + + const eos = () => state.index === len - 1; + const peek = state.peek = (n = 1) => input[state.index + n]; + const advance = state.advance = () => input[++state.index] || ''; + const remaining = () => input.slice(state.index + 1); + const consume = (value = '', num = 0) => { + state.consumed += value; + state.index += num; + }; + + const append = token => { + state.output += token.output != null ? token.output : token.value; + consume(token.value); + }; + + const negate = () => { + let count = 1; + + while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) { + advance(); + state.start++; + count++; + } + + if (count % 2 === 0) { + return false; + } + + state.negated = true; + state.start++; + return true; + }; + + const increment = type => { + state[type]++; + stack.push(type); + }; + + const decrement = type => { + state[type]--; + stack.pop(); + }; + + /** + * Push tokens onto the tokens array. This helper speeds up + * tokenizing by 1) helping us avoid backtracking as much as possible, + * and 2) helping us avoid creating extra tokens when consecutive + * characters are plain text. This improves performance and simplifies + * lookbehinds. + */ + + const push = tok => { + if (prev.type === 'globstar') { + const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); + const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren')); + + if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { + state.output = state.output.slice(0, -prev.output.length); + prev.type = 'star'; + prev.value = '*'; + prev.output = star; + state.output += prev.output; + } + } + + if (extglobs.length && tok.type !== 'paren') { + extglobs[extglobs.length - 1].inner += tok.value; + } + + if (tok.value || tok.output) append(tok); + if (prev && prev.type === 'text' && tok.type === 'text') { + prev.output = (prev.output || prev.value) + tok.value; + prev.value += tok.value; + return; + } + + tok.prev = prev; + tokens.push(tok); + prev = tok; + }; + + const extglobOpen = (type, value) => { + const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; + + token.prev = prev; + token.parens = state.parens; + token.output = state.output; + const output = (opts.capture ? '(' : '') + token.open; + + increment('parens'); + push({ type, value, output: state.output ? '' : ONE_CHAR }); + push({ type: 'paren', extglob: true, value: advance(), output }); + extglobs.push(token); + }; + + const extglobClose = token => { + let output = token.close + (opts.capture ? ')' : ''); + let rest; + + if (token.type === 'negate') { + let extglobStar = star; + + if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { + extglobStar = globstar(opts); + } + + if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) { + output = token.close = `)$))${extglobStar}`; + } + + if (token.inner.includes('*') && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) { + // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis. + // In this case, we need to parse the string and use it in the output of the original pattern. + // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`. + // + // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`. + const expression = parse(rest, { ...options, fastpaths: false }).output; + + output = token.close = `)${expression})${extglobStar})`; + } + + if (token.prev.type === 'bos') { + state.negatedExtglob = true; + } + } + + push({ type: 'paren', extglob: true, value, output }); + decrement('parens'); + }; + + /** + * Fast paths + */ + + if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) { + let backslashes = false; + + let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { + if (first === '\\') { + backslashes = true; + return m; + } + + if (first === '?') { + if (esc) { + return esc + first + (rest ? QMARK.repeat(rest.length) : ''); + } + if (index === 0) { + return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); + } + return QMARK.repeat(chars.length); + } + + if (first === '.') { + return DOT_LITERAL.repeat(chars.length); + } + + if (first === '*') { + if (esc) { + return esc + first + (rest ? star : ''); + } + return star; + } + return esc ? m : `\\${m}`; + }); + + if (backslashes === true) { + if (opts.unescape === true) { + output = output.replace(/\\/g, ''); + } else { + output = output.replace(/\\+/g, m => { + return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); + }); + } + } + + if (output === input && opts.contains === true) { + state.output = input; + return state; + } + + state.output = utils.wrapOutput(output, state, options); + return state; + } + + /** + * Tokenize input until we reach end-of-string + */ + + while (!eos()) { + value = advance(); + + if (value === '\u0000') { + continue; + } + + /** + * Escaped characters + */ + + if (value === '\\') { + const next = peek(); + + if (next === '/' && opts.bash !== true) { + continue; + } + + if (next === '.' || next === ';') { + continue; + } + + if (!next) { + value += '\\'; + push({ type: 'text', value }); + continue; + } + + // collapse slashes to reduce potential for exploits + const match = /^\\+/.exec(remaining()); + let slashes = 0; + + if (match && match[0].length > 2) { + slashes = match[0].length; + state.index += slashes; + if (slashes % 2 !== 0) { + value += '\\'; + } + } + + if (opts.unescape === true) { + value = advance(); + } else { + value += advance(); + } + + if (state.brackets === 0) { + push({ type: 'text', value }); + continue; + } + } + + /** + * If we're inside a regex character class, continue + * until we reach the closing bracket. + */ + + if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { + if (opts.posix !== false && value === ':') { + const inner = prev.value.slice(1); + if (inner.includes('[')) { + prev.posix = true; + + if (inner.includes(':')) { + const idx = prev.value.lastIndexOf('['); + const pre = prev.value.slice(0, idx); + const rest = prev.value.slice(idx + 2); + const posix = POSIX_REGEX_SOURCE[rest]; + if (posix) { + prev.value = pre + posix; + state.backtrack = true; + advance(); + + if (!bos.output && tokens.indexOf(prev) === 1) { + bos.output = ONE_CHAR; + } + continue; + } + } + } + } + + if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { + value = `\\${value}`; + } + + if (value === ']' && (prev.value === '[' || prev.value === '[^')) { + value = `\\${value}`; + } + + if (opts.posix === true && value === '!' && prev.value === '[') { + value = '^'; + } + + prev.value += value; + append({ value }); + continue; + } + + /** + * If we're inside a quoted string, continue + * until we reach the closing double quote. + */ + + if (state.quotes === 1 && value !== '"') { + value = utils.escapeRegex(value); + prev.value += value; + append({ value }); + continue; + } + + /** + * Double quotes + */ + + if (value === '"') { + state.quotes = state.quotes === 1 ? 0 : 1; + if (opts.keepQuotes === true) { + push({ type: 'text', value }); + } + continue; + } + + /** + * Parentheses + */ + + if (value === '(') { + increment('parens'); + push({ type: 'paren', value }); + continue; + } + + if (value === ')') { + if (state.parens === 0 && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '(')); + } + + const extglob = extglobs[extglobs.length - 1]; + if (extglob && state.parens === extglob.parens + 1) { + extglobClose(extglobs.pop()); + continue; + } + + push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); + decrement('parens'); + continue; + } + + /** + * Square brackets + */ + + if (value === '[') { + if (opts.nobracket === true || !remaining().includes(']')) { + if (opts.nobracket !== true && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('closing', ']')); + } + + value = `\\${value}`; + } else { + increment('brackets'); + } + + push({ type: 'bracket', value }); + continue; + } + + if (value === ']') { + if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { + push({ type: 'text', value, output: `\\${value}` }); + continue; + } + + if (state.brackets === 0) { + if (opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '[')); + } + + push({ type: 'text', value, output: `\\${value}` }); + continue; + } + + decrement('brackets'); + + const prevValue = prev.value.slice(1); + if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { + value = `/${value}`; + } + + prev.value += value; + append({ value }); + + // when literal brackets are explicitly disabled + // assume we should match with a regex character class + if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { + continue; + } + + const escaped = utils.escapeRegex(prev.value); + state.output = state.output.slice(0, -prev.value.length); + + // when literal brackets are explicitly enabled + // assume we should escape the brackets to match literal characters + if (opts.literalBrackets === true) { + state.output += escaped; + prev.value = escaped; + continue; + } + + // when the user specifies nothing, try to match both + prev.value = `(${capture}${escaped}|${prev.value})`; + state.output += prev.value; + continue; + } + + /** + * Braces + */ + + if (value === '{' && opts.nobrace !== true) { + increment('braces'); + + const open = { + type: 'brace', + value, + output: '(', + outputIndex: state.output.length, + tokensIndex: state.tokens.length + }; + + braces.push(open); + push(open); + continue; + } + + if (value === '}') { + const brace = braces[braces.length - 1]; + + if (opts.nobrace === true || !brace) { + push({ type: 'text', value, output: value }); + continue; + } + + let output = ')'; + + if (brace.dots === true) { + const arr = tokens.slice(); + const range = []; + + for (let i = arr.length - 1; i >= 0; i--) { + tokens.pop(); + if (arr[i].type === 'brace') { + break; + } + if (arr[i].type !== 'dots') { + range.unshift(arr[i].value); + } + } + + output = expandRange(range, opts); + state.backtrack = true; + } + + if (brace.comma !== true && brace.dots !== true) { + const out = state.output.slice(0, brace.outputIndex); + const toks = state.tokens.slice(brace.tokensIndex); + brace.value = brace.output = '\\{'; + value = output = '\\}'; + state.output = out; + for (const t of toks) { + state.output += (t.output || t.value); + } + } + + push({ type: 'brace', value, output }); + decrement('braces'); + braces.pop(); + continue; + } + + /** + * Pipes + */ + + if (value === '|') { + if (extglobs.length > 0) { + extglobs[extglobs.length - 1].conditions++; + } + push({ type: 'text', value }); + continue; + } + + /** + * Commas + */ + + if (value === ',') { + let output = value; + + const brace = braces[braces.length - 1]; + if (brace && stack[stack.length - 1] === 'braces') { + brace.comma = true; + output = '|'; + } + + push({ type: 'comma', value, output }); + continue; + } + + /** + * Slashes + */ + + if (value === '/') { + // if the beginning of the glob is "./", advance the start + // to the current index, and don't add the "./" characters + // to the state. This greatly simplifies lookbehinds when + // checking for BOS characters like "!" and "." (not "./") + if (prev.type === 'dot' && state.index === state.start + 1) { + state.start = state.index + 1; + state.consumed = ''; + state.output = ''; + tokens.pop(); + prev = bos; // reset "prev" to the first token + continue; + } + + push({ type: 'slash', value, output: SLASH_LITERAL }); + continue; + } + + /** + * Dots + */ + + if (value === '.') { + if (state.braces > 0 && prev.type === 'dot') { + if (prev.value === '.') prev.output = DOT_LITERAL; + const brace = braces[braces.length - 1]; + prev.type = 'dots'; + prev.output += value; + prev.value += value; + brace.dots = true; + continue; + } + + if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') { + push({ type: 'text', value, output: DOT_LITERAL }); + continue; + } + + push({ type: 'dot', value, output: DOT_LITERAL }); + continue; + } + + /** + * Question marks + */ + + if (value === '?') { + const isGroup = prev && prev.value === '('; + if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('qmark', value); + continue; + } + + if (prev && prev.type === 'paren') { + const next = peek(); + let output = value; + + if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\w+>)/.test(remaining()))) { + output = `\\${value}`; + } + + push({ type: 'text', value, output }); + continue; + } + + if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { + push({ type: 'qmark', value, output: QMARK_NO_DOT }); + continue; + } + + push({ type: 'qmark', value, output: QMARK }); + continue; + } + + /** + * Exclamation + */ + + if (value === '!') { + if (opts.noextglob !== true && peek() === '(') { + if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { + extglobOpen('negate', value); + continue; + } + } + + if (opts.nonegate !== true && state.index === 0) { + negate(); + continue; + } + } + + /** + * Plus + */ + + if (value === '+') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('plus', value); + continue; + } + + if ((prev && prev.value === '(') || opts.regex === false) { + push({ type: 'plus', value, output: PLUS_LITERAL }); + continue; + } + + if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) { + push({ type: 'plus', value }); + continue; + } + + push({ type: 'plus', value: PLUS_LITERAL }); + continue; + } + + /** + * Plain text + */ + + if (value === '@') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + push({ type: 'at', extglob: true, value, output: '' }); + continue; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Plain text + */ + + if (value !== '*') { + if (value === '$' || value === '^') { + value = `\\${value}`; + } + + const match = REGEX_NON_SPECIAL_CHARS.exec(remaining()); + if (match) { + value += match[0]; + state.index += match[0].length; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Stars + */ + + if (prev && (prev.type === 'globstar' || prev.star === true)) { + prev.type = 'star'; + prev.star = true; + prev.value += value; + prev.output = star; + state.backtrack = true; + state.globstar = true; + consume(value); + continue; + } + + let rest = remaining(); + if (opts.noextglob !== true && /^\([^?]/.test(rest)) { + extglobOpen('star', value); + continue; + } + + if (prev.type === 'star') { + if (opts.noglobstar === true) { + consume(value); + continue; + } + + const prior = prev.prev; + const before = prior.prev; + const isStart = prior.type === 'slash' || prior.type === 'bos'; + const afterStar = before && (before.type === 'star' || before.type === 'globstar'); + + if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) { + push({ type: 'star', value, output: '' }); + continue; + } + + const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); + const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); + if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { + push({ type: 'star', value, output: '' }); + continue; + } + + // strip consecutive `/**/` + while (rest.slice(0, 3) === '/**') { + const after = input[state.index + 4]; + if (after && after !== '/') { + break; + } + rest = rest.slice(3); + consume('/**', 3); + } + + if (prior.type === 'bos' && eos()) { + prev.type = 'globstar'; + prev.value += value; + prev.output = globstar(opts); + state.output = prev.output; + state.globstar = true; + consume(value); + continue; + } + + if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = `(?:${prior.output}`; + + prev.type = 'globstar'; + prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)'); + prev.value += value; + state.globstar = true; + state.output += prior.output + prev.output; + consume(value); + continue; + } + + if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') { + const end = rest[1] !== void 0 ? '|$' : ''; + + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = `(?:${prior.output}`; + + prev.type = 'globstar'; + prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; + prev.value += value; + + state.output += prior.output + prev.output; + state.globstar = true; + + consume(value + advance()); + + push({ type: 'slash', value: '/', output: '' }); + continue; + } + + if (prior.type === 'bos' && rest[0] === '/') { + prev.type = 'globstar'; + prev.value += value; + prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; + state.output = prev.output; + state.globstar = true; + consume(value + advance()); + push({ type: 'slash', value: '/', output: '' }); + continue; + } + + // remove single star from output + state.output = state.output.slice(0, -prev.output.length); + + // reset previous token to globstar + prev.type = 'globstar'; + prev.output = globstar(opts); + prev.value += value; + + // reset output with globstar + state.output += prev.output; + state.globstar = true; + consume(value); + continue; + } + + const token = { type: 'star', value, output: star }; + + if (opts.bash === true) { + token.output = '.*?'; + if (prev.type === 'bos' || prev.type === 'slash') { + token.output = nodot + token.output; + } + push(token); + continue; + } + + if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { + token.output = value; + push(token); + continue; + } + + if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { + if (prev.type === 'dot') { + state.output += NO_DOT_SLASH; + prev.output += NO_DOT_SLASH; + + } else if (opts.dot === true) { + state.output += NO_DOTS_SLASH; + prev.output += NO_DOTS_SLASH; + + } else { + state.output += nodot; + prev.output += nodot; + } + + if (peek() !== '*') { + state.output += ONE_CHAR; + prev.output += ONE_CHAR; + } + } + + push(token); + } + + while (state.brackets > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); + state.output = utils.escapeLast(state.output, '['); + decrement('brackets'); + } + + while (state.parens > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); + state.output = utils.escapeLast(state.output, '('); + decrement('parens'); + } + + while (state.braces > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); + state.output = utils.escapeLast(state.output, '{'); + decrement('braces'); + } + + if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { + push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); + } + + // rebuild the output if we had to backtrack at any point + if (state.backtrack === true) { + state.output = ''; + + for (const token of state.tokens) { + state.output += token.output != null ? token.output : token.value; + + if (token.suffix) { + state.output += token.suffix; + } + } + } + + return state; +}; + +/** + * Fast paths for creating regular expressions for common glob patterns. + * This can significantly speed up processing and has very little downside + * impact when none of the fast paths match. + */ + +parse.fastpaths = (input, options) => { + const opts = { ...options }; + const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + const len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + + input = REPLACEMENTS[input] || input; + + // create constants based on platform, for windows or posix + const { + DOT_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOTS_SLASH, + STAR, + START_ANCHOR + } = constants.globChars(opts.windows); + + const nodot = opts.dot ? NO_DOTS : NO_DOT; + const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; + const capture = opts.capture ? '' : '?:'; + const state = { negated: false, prefix: '' }; + let star = opts.bash === true ? '.*?' : STAR; + + if (opts.capture) { + star = `(${star})`; + } + + const globstar = opts => { + if (opts.noglobstar === true) return star; + return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; + + const create = str => { + switch (str) { + case '*': + return `${nodot}${ONE_CHAR}${star}`; + + case '.*': + return `${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '*.*': + return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '*/*': + return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; + + case '**': + return nodot + globstar(opts); + + case '**/*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; + + case '**/*.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '**/.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; + + default: { + const match = /^(.*?)\.(\w+)$/.exec(str); + if (!match) return; + + const source = create(match[1]); + if (!source) return; + + return source + DOT_LITERAL + match[2]; + } + } + }; + + const output = utils.removePrefix(input, state); + let source = create(output); + + if (source && opts.strictSlashes !== true) { + source += `${SLASH_LITERAL}?`; + } + + return source; +}; + +module.exports = parse; diff --git a/node_modules/@11ty/eleventy/node_modules/picomatch/lib/picomatch.js b/node_modules/@11ty/eleventy/node_modules/picomatch/lib/picomatch.js new file mode 100644 index 0000000..d0ebd9f --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/picomatch/lib/picomatch.js @@ -0,0 +1,341 @@ +'use strict'; + +const scan = require('./scan'); +const parse = require('./parse'); +const utils = require('./utils'); +const constants = require('./constants'); +const isObject = val => val && typeof val === 'object' && !Array.isArray(val); + +/** + * Creates a matcher function from one or more glob patterns. The + * returned function takes a string to match as its first argument, + * and returns true if the string is a match. The returned matcher + * function also takes a boolean as the second argument that, when true, + * returns an object with additional information. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch(glob[, options]); + * + * const isMatch = picomatch('*.!(*a)'); + * console.log(isMatch('a.a')); //=> false + * console.log(isMatch('a.b')); //=> true + * ``` + * @name picomatch + * @param {String|Array} `globs` One or more glob patterns. + * @param {Object=} `options` + * @return {Function=} Returns a matcher function. + * @api public + */ + +const picomatch = (glob, options, returnState = false) => { + if (Array.isArray(glob)) { + const fns = glob.map(input => picomatch(input, options, returnState)); + const arrayMatcher = str => { + for (const isMatch of fns) { + const state = isMatch(str); + if (state) return state; + } + return false; + }; + return arrayMatcher; + } + + const isState = isObject(glob) && glob.tokens && glob.input; + + if (glob === '' || (typeof glob !== 'string' && !isState)) { + throw new TypeError('Expected pattern to be a non-empty string'); + } + + const opts = options || {}; + const posix = opts.windows; + const regex = isState + ? picomatch.compileRe(glob, options) + : picomatch.makeRe(glob, options, false, true); + + const state = regex.state; + delete regex.state; + + let isIgnored = () => false; + if (opts.ignore) { + const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null }; + isIgnored = picomatch(opts.ignore, ignoreOpts, returnState); + } + + const matcher = (input, returnObject = false) => { + const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix }); + const result = { glob, state, regex, posix, input, output, match, isMatch }; + + if (typeof opts.onResult === 'function') { + opts.onResult(result); + } + + if (isMatch === false) { + result.isMatch = false; + return returnObject ? result : false; + } + + if (isIgnored(input)) { + if (typeof opts.onIgnore === 'function') { + opts.onIgnore(result); + } + result.isMatch = false; + return returnObject ? result : false; + } + + if (typeof opts.onMatch === 'function') { + opts.onMatch(result); + } + return returnObject ? result : true; + }; + + if (returnState) { + matcher.state = state; + } + + return matcher; +}; + +/** + * Test `input` with the given `regex`. This is used by the main + * `picomatch()` function to test the input string. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.test(input, regex[, options]); + * + * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); + * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } + * ``` + * @param {String} `input` String to test. + * @param {RegExp} `regex` + * @return {Object} Returns an object with matching info. + * @api public + */ + +picomatch.test = (input, regex, options, { glob, posix } = {}) => { + if (typeof input !== 'string') { + throw new TypeError('Expected input to be a string'); + } + + if (input === '') { + return { isMatch: false, output: '' }; + } + + const opts = options || {}; + const format = opts.format || (posix ? utils.toPosixSlashes : null); + let match = input === glob; + let output = (match && format) ? format(input) : input; + + if (match === false) { + output = format ? format(input) : input; + match = output === glob; + } + + if (match === false || opts.capture === true) { + if (opts.matchBase === true || opts.basename === true) { + match = picomatch.matchBase(input, regex, options, posix); + } else { + match = regex.exec(output); + } + } + + return { isMatch: Boolean(match), match, output }; +}; + +/** + * Match the basename of a filepath. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.matchBase(input, glob[, options]); + * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true + * ``` + * @param {String} `input` String to test. + * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe). + * @return {Boolean} + * @api public + */ + +picomatch.matchBase = (input, glob, options) => { + const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options); + return regex.test(utils.basename(input)); +}; + +/** + * Returns true if **any** of the given glob `patterns` match the specified `string`. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.isMatch(string, patterns[, options]); + * + * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true + * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false + * ``` + * @param {String|Array} str The string to test. + * @param {String|Array} patterns One or more glob patterns to use for matching. + * @param {Object} [options] See available [options](#options). + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ + +picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); + +/** + * Parse a glob pattern to create the source string for a regular + * expression. + * + * ```js + * const picomatch = require('picomatch'); + * const result = picomatch.parse(pattern[, options]); + * ``` + * @param {String} `pattern` + * @param {Object} `options` + * @return {Object} Returns an object with useful properties and output to be used as a regex source string. + * @api public + */ + +picomatch.parse = (pattern, options) => { + if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options)); + return parse(pattern, { ...options, fastpaths: false }); +}; + +/** + * Scan a glob pattern to separate the pattern into segments. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.scan(input[, options]); + * + * const result = picomatch.scan('!./foo/*.js'); + * console.log(result); + * { prefix: '!./', + * input: '!./foo/*.js', + * start: 3, + * base: 'foo', + * glob: '*.js', + * isBrace: false, + * isBracket: false, + * isGlob: true, + * isExtglob: false, + * isGlobstar: false, + * negated: true } + * ``` + * @param {String} `input` Glob pattern to scan. + * @param {Object} `options` + * @return {Object} Returns an object with + * @api public + */ + +picomatch.scan = (input, options) => scan(input, options); + +/** + * Compile a regular expression from the `state` object returned by the + * [parse()](#parse) method. + * + * @param {Object} `state` + * @param {Object} `options` + * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser. + * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging. + * @return {RegExp} + * @api public + */ + +picomatch.compileRe = (state, options, returnOutput = false, returnState = false) => { + if (returnOutput === true) { + return state.output; + } + + const opts = options || {}; + const prepend = opts.contains ? '' : '^'; + const append = opts.contains ? '' : '$'; + + let source = `${prepend}(?:${state.output})${append}`; + if (state && state.negated === true) { + source = `^(?!${source}).*$`; + } + + const regex = picomatch.toRegex(source, options); + if (returnState === true) { + regex.state = state; + } + + return regex; +}; + +/** + * Create a regular expression from a parsed glob pattern. + * + * ```js + * const picomatch = require('picomatch'); + * const state = picomatch.parse('*.js'); + * // picomatch.compileRe(state[, options]); + * + * console.log(picomatch.compileRe(state)); + * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ + * ``` + * @param {String} `state` The object returned from the `.parse` method. + * @param {Object} `options` + * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result. + * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression. + * @return {RegExp} Returns a regex created from the given pattern. + * @api public + */ + +picomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => { + if (!input || typeof input !== 'string') { + throw new TypeError('Expected a non-empty string'); + } + + let parsed = { negated: false, fastpaths: true }; + + if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) { + parsed.output = parse.fastpaths(input, options); + } + + if (!parsed.output) { + parsed = parse(input, options); + } + + return picomatch.compileRe(parsed, options, returnOutput, returnState); +}; + +/** + * Create a regular expression from the given regex source string. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.toRegex(source[, options]); + * + * const { output } = picomatch.parse('*.js'); + * console.log(picomatch.toRegex(output)); + * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ + * ``` + * @param {String} `source` Regular expression source string. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +picomatch.toRegex = (source, options) => { + try { + const opts = options || {}; + return new RegExp(source, opts.flags || (opts.nocase ? 'i' : '')); + } catch (err) { + if (options && options.debug === true) throw err; + return /$^/; + } +}; + +/** + * Picomatch constants. + * @return {Object} + */ + +picomatch.constants = constants; + +/** + * Expose "picomatch" + */ + +module.exports = picomatch; diff --git a/node_modules/@11ty/eleventy/node_modules/picomatch/lib/scan.js b/node_modules/@11ty/eleventy/node_modules/picomatch/lib/scan.js new file mode 100644 index 0000000..e59cd7a --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/picomatch/lib/scan.js @@ -0,0 +1,391 @@ +'use strict'; + +const utils = require('./utils'); +const { + CHAR_ASTERISK, /* * */ + CHAR_AT, /* @ */ + CHAR_BACKWARD_SLASH, /* \ */ + CHAR_COMMA, /* , */ + CHAR_DOT, /* . */ + CHAR_EXCLAMATION_MARK, /* ! */ + CHAR_FORWARD_SLASH, /* / */ + CHAR_LEFT_CURLY_BRACE, /* { */ + CHAR_LEFT_PARENTHESES, /* ( */ + CHAR_LEFT_SQUARE_BRACKET, /* [ */ + CHAR_PLUS, /* + */ + CHAR_QUESTION_MARK, /* ? */ + CHAR_RIGHT_CURLY_BRACE, /* } */ + CHAR_RIGHT_PARENTHESES, /* ) */ + CHAR_RIGHT_SQUARE_BRACKET /* ] */ +} = require('./constants'); + +const isPathSeparator = code => { + return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; +}; + +const depth = token => { + if (token.isPrefix !== true) { + token.depth = token.isGlobstar ? Infinity : 1; + } +}; + +/** + * Quickly scans a glob pattern and returns an object with a handful of + * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists), + * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not + * with `!(`) and `negatedExtglob` (true if the path starts with `!(`). + * + * ```js + * const pm = require('picomatch'); + * console.log(pm.scan('foo/bar/*.js')); + * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' } + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {Object} Returns an object with tokens and regex source string. + * @api public + */ + +const scan = (input, options) => { + const opts = options || {}; + + const length = input.length - 1; + const scanToEnd = opts.parts === true || opts.scanToEnd === true; + const slashes = []; + const tokens = []; + const parts = []; + + let str = input; + let index = -1; + let start = 0; + let lastIndex = 0; + let isBrace = false; + let isBracket = false; + let isGlob = false; + let isExtglob = false; + let isGlobstar = false; + let braceEscaped = false; + let backslashes = false; + let negated = false; + let negatedExtglob = false; + let finished = false; + let braces = 0; + let prev; + let code; + let token = { value: '', depth: 0, isGlob: false }; + + const eos = () => index >= length; + const peek = () => str.charCodeAt(index + 1); + const advance = () => { + prev = code; + return str.charCodeAt(++index); + }; + + while (index < length) { + code = advance(); + let next; + + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + code = advance(); + + if (code === CHAR_LEFT_CURLY_BRACE) { + braceEscaped = true; + } + continue; + } + + if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) { + braces++; + + while (eos() !== true && (code = advance())) { + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + advance(); + continue; + } + + if (code === CHAR_LEFT_CURLY_BRACE) { + braces++; + continue; + } + + if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) { + isBrace = token.isBrace = true; + isGlob = token.isGlob = true; + finished = true; + + if (scanToEnd === true) { + continue; + } + + break; + } + + if (braceEscaped !== true && code === CHAR_COMMA) { + isBrace = token.isBrace = true; + isGlob = token.isGlob = true; + finished = true; + + if (scanToEnd === true) { + continue; + } + + break; + } + + if (code === CHAR_RIGHT_CURLY_BRACE) { + braces--; + + if (braces === 0) { + braceEscaped = false; + isBrace = token.isBrace = true; + finished = true; + break; + } + } + } + + if (scanToEnd === true) { + continue; + } + + break; + } + + if (code === CHAR_FORWARD_SLASH) { + slashes.push(index); + tokens.push(token); + token = { value: '', depth: 0, isGlob: false }; + + if (finished === true) continue; + if (prev === CHAR_DOT && index === (start + 1)) { + start += 2; + continue; + } + + lastIndex = index + 1; + continue; + } + + if (opts.noext !== true) { + const isExtglobChar = code === CHAR_PLUS + || code === CHAR_AT + || code === CHAR_ASTERISK + || code === CHAR_QUESTION_MARK + || code === CHAR_EXCLAMATION_MARK; + + if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) { + isGlob = token.isGlob = true; + isExtglob = token.isExtglob = true; + finished = true; + if (code === CHAR_EXCLAMATION_MARK && index === start) { + negatedExtglob = true; + } + + if (scanToEnd === true) { + while (eos() !== true && (code = advance())) { + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + code = advance(); + continue; + } + + if (code === CHAR_RIGHT_PARENTHESES) { + isGlob = token.isGlob = true; + finished = true; + break; + } + } + continue; + } + break; + } + } + + if (code === CHAR_ASTERISK) { + if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true; + isGlob = token.isGlob = true; + finished = true; + + if (scanToEnd === true) { + continue; + } + break; + } + + if (code === CHAR_QUESTION_MARK) { + isGlob = token.isGlob = true; + finished = true; + + if (scanToEnd === true) { + continue; + } + break; + } + + if (code === CHAR_LEFT_SQUARE_BRACKET) { + while (eos() !== true && (next = advance())) { + if (next === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + advance(); + continue; + } + + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + isBracket = token.isBracket = true; + isGlob = token.isGlob = true; + finished = true; + break; + } + } + + if (scanToEnd === true) { + continue; + } + + break; + } + + if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) { + negated = token.negated = true; + start++; + continue; + } + + if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) { + isGlob = token.isGlob = true; + + if (scanToEnd === true) { + while (eos() !== true && (code = advance())) { + if (code === CHAR_LEFT_PARENTHESES) { + backslashes = token.backslashes = true; + code = advance(); + continue; + } + + if (code === CHAR_RIGHT_PARENTHESES) { + finished = true; + break; + } + } + continue; + } + break; + } + + if (isGlob === true) { + finished = true; + + if (scanToEnd === true) { + continue; + } + + break; + } + } + + if (opts.noext === true) { + isExtglob = false; + isGlob = false; + } + + let base = str; + let prefix = ''; + let glob = ''; + + if (start > 0) { + prefix = str.slice(0, start); + str = str.slice(start); + lastIndex -= start; + } + + if (base && isGlob === true && lastIndex > 0) { + base = str.slice(0, lastIndex); + glob = str.slice(lastIndex); + } else if (isGlob === true) { + base = ''; + glob = str; + } else { + base = str; + } + + if (base && base !== '' && base !== '/' && base !== str) { + if (isPathSeparator(base.charCodeAt(base.length - 1))) { + base = base.slice(0, -1); + } + } + + if (opts.unescape === true) { + if (glob) glob = utils.removeBackslashes(glob); + + if (base && backslashes === true) { + base = utils.removeBackslashes(base); + } + } + + const state = { + prefix, + input, + start, + base, + glob, + isBrace, + isBracket, + isGlob, + isExtglob, + isGlobstar, + negated, + negatedExtglob + }; + + if (opts.tokens === true) { + state.maxDepth = 0; + if (!isPathSeparator(code)) { + tokens.push(token); + } + state.tokens = tokens; + } + + if (opts.parts === true || opts.tokens === true) { + let prevIndex; + + for (let idx = 0; idx < slashes.length; idx++) { + const n = prevIndex ? prevIndex + 1 : start; + const i = slashes[idx]; + const value = input.slice(n, i); + if (opts.tokens) { + if (idx === 0 && start !== 0) { + tokens[idx].isPrefix = true; + tokens[idx].value = prefix; + } else { + tokens[idx].value = value; + } + depth(tokens[idx]); + state.maxDepth += tokens[idx].depth; + } + if (idx !== 0 || value !== '') { + parts.push(value); + } + prevIndex = i; + } + + if (prevIndex && prevIndex + 1 < input.length) { + const value = input.slice(prevIndex + 1); + parts.push(value); + + if (opts.tokens) { + tokens[tokens.length - 1].value = value; + depth(tokens[tokens.length - 1]); + state.maxDepth += tokens[tokens.length - 1].depth; + } + } + + state.slashes = slashes; + state.parts = parts; + } + + return state; +}; + +module.exports = scan; diff --git a/node_modules/@11ty/eleventy/node_modules/picomatch/lib/utils.js b/node_modules/@11ty/eleventy/node_modules/picomatch/lib/utils.js new file mode 100644 index 0000000..9c97cae --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/picomatch/lib/utils.js @@ -0,0 +1,72 @@ +/*global navigator*/ +'use strict'; + +const { + REGEX_BACKSLASH, + REGEX_REMOVE_BACKSLASH, + REGEX_SPECIAL_CHARS, + REGEX_SPECIAL_CHARS_GLOBAL +} = require('./constants'); + +exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); +exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); +exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str); +exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1'); +exports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/'); + +exports.isWindows = () => { + if (typeof navigator !== 'undefined' && navigator.platform) { + const platform = navigator.platform.toLowerCase(); + return platform === 'win32' || platform === 'windows'; + } + + if (typeof process !== 'undefined' && process.platform) { + return process.platform === 'win32'; + } + + return false; +}; + +exports.removeBackslashes = str => { + return str.replace(REGEX_REMOVE_BACKSLASH, match => { + return match === '\\' ? '' : match; + }); +}; + +exports.escapeLast = (input, char, lastIdx) => { + const idx = input.lastIndexOf(char, lastIdx); + if (idx === -1) return input; + if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1); + return `${input.slice(0, idx)}\\${input.slice(idx)}`; +}; + +exports.removePrefix = (input, state = {}) => { + let output = input; + if (output.startsWith('./')) { + output = output.slice(2); + state.prefix = './'; + } + return output; +}; + +exports.wrapOutput = (input, state = {}, options = {}) => { + const prepend = options.contains ? '' : '^'; + const append = options.contains ? '' : '$'; + + let output = `${prepend}(?:${input})${append}`; + if (state.negated === true) { + output = `(?:^(?!${output}).*$)`; + } + return output; +}; + +exports.basename = (path, { windows } = {}) => { + const segs = path.split(windows ? /[\\/]/ : '/'); + const last = segs[segs.length - 1]; + + if (last === '') { + return segs[segs.length - 2]; + } + + return last; +}; diff --git a/node_modules/@11ty/eleventy/node_modules/picomatch/package.json b/node_modules/@11ty/eleventy/node_modules/picomatch/package.json new file mode 100644 index 0000000..703a83d --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/picomatch/package.json @@ -0,0 +1,83 @@ +{ + "name": "picomatch", + "description": "Blazing fast and accurate glob matcher written in JavaScript, with no dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions.", + "version": "4.0.2", + "homepage": "https://github.com/micromatch/picomatch", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "funding": "https://github.com/sponsors/jonschlinkert", + "repository": "micromatch/picomatch", + "bugs": { + "url": "https://github.com/micromatch/picomatch/issues" + }, + "license": "MIT", + "files": [ + "index.js", + "posix.js", + "lib" + ], + "sideEffects": false, + "main": "index.js", + "engines": { + "node": ">=12" + }, + "scripts": { + "lint": "eslint --cache --cache-location node_modules/.cache/.eslintcache --report-unused-disable-directives --ignore-path .gitignore .", + "mocha": "mocha --reporter dot", + "test": "npm run lint && npm run mocha", + "test:ci": "npm run test:cover", + "test:cover": "nyc npm run mocha" + }, + "devDependencies": { + "eslint": "^8.57.0", + "fill-range": "^7.0.1", + "gulp-format-md": "^2.0.0", + "mocha": "^10.4.0", + "nyc": "^15.1.0", + "time-require": "github:jonschlinkert/time-require" + }, + "keywords": [ + "glob", + "match", + "picomatch" + ], + "nyc": { + "reporter": [ + "html", + "lcov", + "text-summary" + ] + }, + "verb": { + "toc": { + "render": true, + "method": "preWrite", + "maxdepth": 3 + }, + "layout": "empty", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + }, + "related": { + "list": [ + "braces", + "micromatch" + ] + }, + "reflinks": [ + "braces", + "expand-brackets", + "extglob", + "fill-range", + "micromatch", + "minimatch", + "nanomatch", + "picomatch" + ] + } +} diff --git a/node_modules/@11ty/eleventy/node_modules/picomatch/posix.js b/node_modules/@11ty/eleventy/node_modules/picomatch/posix.js new file mode 100644 index 0000000..d2f2bc5 --- /dev/null +++ b/node_modules/@11ty/eleventy/node_modules/picomatch/posix.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('./lib/picomatch'); diff --git a/node_modules/@11ty/eleventy/package 2.json b/node_modules/@11ty/eleventy/package 2.json new file mode 100755 index 0000000..f6427e1 --- /dev/null +++ b/node_modules/@11ty/eleventy/package 2.json @@ -0,0 +1,137 @@ +{ + "name": "@11ty/eleventy", + "version": "2.0.1", + "description": "A simpler (static) site generator.", + "publishConfig": { + "access": "public" + }, + "main": "src/Eleventy.js", + "types": "src/index.d.ts", + "bin": { + "eleventy": "./cmd.js" + }, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + }, + "keywords": [ + "static-site-generator", + "static-site", + "ssg", + "documentation", + "website", + "jekyll", + "blog", + "templates", + "generator", + "framework", + "eleventy", + "11ty", + "html", + "markdown", + "liquid", + "nunjucks", + "pug", + "handlebars", + "mustache", + "ejs", + "haml" + ], + "scripts": { + "default": "npm run test", + "format": "prettier src/ --write", + "test": "npx ava --verbose", + "lint-staged": "lint-staged", + "coverage": "npx nyc ava && npx nyc report --reporter=json-summary && cp coverage/coverage-summary.json docs-src/_data/coverage.json && node cmd.js --config=docs-src/.eleventy.docs.js", + "prepare": "husky install" + }, + "author": { + "name": "Zach Leatherman", + "email": "zachleatherman@gmail.com", + "url": "https://zachleat.com/" + }, + "repository": { + "type": "git", + "url": "git://github.com/11ty/eleventy.git" + }, + "bugs": "https://github.com/11ty/eleventy/issues", + "homepage": "https://www.11ty.dev/", + "ava": { + "environmentVariables": {}, + "failFast": true, + "files": [ + "./test/*.js", + "./test/_issues/**/*test.js" + ], + "ignoredByWatcher": [ + "./test/stubs*/**/*", + ".cache" + ] + }, + "lint-staged": { + "*.{js,css,md}": [ + "prettier --write" + ] + }, + "devDependencies": { + "@11ty/eleventy-plugin-syntaxhighlight": "^4.2.0", + "@11ty/eleventy-plugin-vue": "1.0.0-canary.8", + "@vue/server-renderer": "^3.2.47", + "ava": "^5.2.0", + "husky": "^8.0.3", + "js-yaml": "^4.1.0", + "lint-staged": "^13.2.0", + "markdown-it-emoji": "^2.0.2", + "marked": "^4.3.0", + "nyc": "^15.1.0", + "prettier": "^2.8.7", + "pretty": "^2.0.0", + "rimraf": "^4.4.1", + "sass": "^1.60.0", + "vue": "^3.2.47" + }, + "dependencies": { + "@11ty/dependency-tree": "^2.0.1", + "@11ty/eleventy-dev-server": "^1.0.4", + "@11ty/eleventy-utils": "^1.0.1", + "@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", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "dependency-graph": "^0.11.0", + "ejs": "^3.1.9", + "fast-glob": "^3.2.12", + "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", + "kleur": "^4.1.5", + "liquidjs": "^10.7.0", + "luxon": "^3.3.0", + "markdown-it": "^13.0.1", + "micromatch": "^4.0.5", + "minimist": "^1.2.8", + "moo": "^0.5.2", + "multimatch": "^5.0.0", + "mustache": "^4.2.0", + "normalize-path": "^3.0.0", + "nunjucks": "^3.2.3", + "path-to-regexp": "^6.2.1", + "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", + "slugify": "^1.6.6" + } +} diff --git a/node_modules/@11ty/eleventy/package.json b/node_modules/@11ty/eleventy/package.json new file mode 100644 index 0000000..f79a2e7 --- /dev/null +++ b/node_modules/@11ty/eleventy/package.json @@ -0,0 +1,167 @@ +{ + "name": "@11ty/eleventy", + "version": "3.1.2", + "description": "A simpler static site generator.", + "publishConfig": { + "access": "public", + "provenance": true + }, + "type": "module", + "main": "./src/Eleventy.js", + "exports": { + ".": { + "import": "./src/Eleventy.js", + "require": "./src/EleventyCommonJs.cjs" + }, + "./UserConfig": { + "types": "./src/UserConfig.js" + } + }, + "bin": { + "eleventy": "cmd.cjs" + }, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + }, + "keywords": [ + "static-site-generator", + "static-site", + "ssg", + "documentation", + "website", + "jekyll", + "blog", + "templates", + "generator", + "framework", + "eleventy", + "11ty", + "html", + "markdown", + "liquid", + "nunjucks" + ], + "scripts": { + "default": "npm run test", + "test": "npm run test:node && npm run test:ava", + "test:ava": "ava --verbose --timeout 20s", + "test:node": "node --test test_node/tests.js", + "format": "prettier . --write", + "check": "eslint src", + "check-types": "tsc", + "nano-staged": "nano-staged", + "coverage": "npx c8 ava && npx c8 report --reporter=json-summary && cp coverage/coverage-summary.json docs/_data/coverage.json && node cmd.cjs --config=docs/eleventy.coverage.js", + "prepare": "simple-git-hooks" + }, + "author": "Zach Leatherman (https://zachleat.com/)", + "repository": { + "type": "git", + "url": "git://github.com/11ty/eleventy.git" + }, + "bugs": "https://github.com/11ty/eleventy/issues", + "homepage": "https://www.11ty.dev/", + "ava": { + "environmentVariables": {}, + "failFast": true, + "files": [ + "./test/*.js", + "./test/_issues/**/*test.js" + ], + "watchMode": { + "ignoreChanges": [ + "./test/stubs*/**/*", + "./test/**/_site/**/*", + ".cache" + ] + } + }, + "nano-staged": { + "*.{js,css,md}": [ + "prettier --write" + ] + }, + "simple-git-hooks": { + "pre-commit": "npm test && npm run nano-staged", + "pre-push": "npm test" + }, + "devDependencies": { + "@11ty/eleventy-img": "^6.0.4", + "@11ty/eleventy-plugin-rss": "^2.0.4", + "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.1", + "@11ty/eleventy-plugin-webc": "^0.12.0-beta.3", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.29.0", + "@iarna/toml": "^2.2.5", + "@mdx-js/node-loader": "^3.1.0", + "@types/node": "^22.15.32", + "@vue/server-renderer": "^3.5.17", + "@zachleat/noop": "^1.0.6", + "ava": "^6.4.0", + "c8": "^10.1.3", + "eslint": "^9.29.0", + "eslint-config-prettier": "^10.1.5", + "globals": "^16.2.0", + "jsx-async-runtime": "^1.0.2", + "markdown-it-abbr": "^2.0.0", + "markdown-it-emoji": "^3.0.0", + "marked": "^15.0.12", + "nano-staged": "^0.8.0", + "prettier": "^3.5.3", + "pretty": "^2.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "rimraf": "^6.0.1", + "sass": "^1.89.2", + "simple-git-hooks": "^2.13.0", + "tsx": "^4.20.3", + "typescript": "^5.8.3", + "vue": "^3.5.17", + "zod": "^3.25.67", + "zod-validation-error": "^3.5.2" + }, + "dependencies": { + "@11ty/dependency-tree": "^4.0.0", + "@11ty/dependency-tree-esm": "^2.0.0", + "@11ty/eleventy-dev-server": "^2.0.8", + "@11ty/eleventy-plugin-bundle": "^3.0.6", + "@11ty/eleventy-utils": "^2.0.7", + "@11ty/lodash-custom": "^4.17.21", + "@11ty/posthtml-urls": "^1.0.1", + "@11ty/recursive-copy": "^4.0.2", + "@sindresorhus/slugify": "^2.2.1", + "bcp-47-normalize": "^2.3.0", + "chokidar": "^3.6.0", + "debug": "^4.4.1", + "dependency-graph": "^1.0.0", + "entities": "^6.0.1", + "filesize": "^10.1.6", + "gray-matter": "^4.0.3", + "iso-639-1": "^3.1.5", + "js-yaml": "^4.1.0", + "kleur": "^4.1.5", + "liquidjs": "^10.21.1", + "luxon": "^3.6.1", + "markdown-it": "^14.1.0", + "minimist": "^1.2.8", + "moo": "^0.5.2", + "node-retrieve-globals": "^6.0.1", + "nunjucks": "^3.2.4", + "picomatch": "^4.0.2", + "please-upgrade-node": "^3.2.0", + "posthtml": "^0.16.6", + "posthtml-match-helper": "^2.0.3", + "semver": "^7.7.2", + "slugify": "^1.6.6", + "tinyglobby": "^0.2.14" + }, + "overrides": { + "gray-matter": { + "js-yaml": "$js-yaml" + } + } +} diff --git a/node_modules/@11ty/eleventy/src/Benchmark/Benchmark.js b/node_modules/@11ty/eleventy/src/Benchmark/Benchmark.js new file mode 100644 index 0000000..df6dea7 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Benchmark/Benchmark.js @@ -0,0 +1,55 @@ +import { performance } from "node:perf_hooks"; + +class Benchmark { + constructor() { + // TypeScript slop + this.timeSpent = 0; + this.timesCalled = 0; + this.beforeTimers = []; + } + + reset() { + this.timeSpent = 0; + this.timesCalled = 0; + this.beforeTimers = []; + } + + getNewTimestamp() { + if (performance) { + return performance.now(); + } + return new Date().getTime(); + } + + incrementCount() { + this.timesCalled++; + } + + // TODO(slightlyoff): + // disable all of these hrtime requests when not benchmarking + before() { + this.timesCalled++; + this.beforeTimers.push(this.getNewTimestamp()); + } + + after() { + if (!this.beforeTimers.length) { + throw new Error("You called Benchmark after() without a before()."); + } + + let before = this.beforeTimers.pop(); + if (!this.beforeTimers.length) { + this.timeSpent += this.getNewTimestamp() - before; + } + } + + getTimesCalled() { + return this.timesCalled; + } + + getTotal() { + return this.timeSpent; + } +} + +export default Benchmark; diff --git a/node_modules/@11ty/eleventy/src/Benchmark/BenchmarkGroup.js b/node_modules/@11ty/eleventy/src/Benchmark/BenchmarkGroup.js new file mode 100644 index 0000000..ee82f6b --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Benchmark/BenchmarkGroup.js @@ -0,0 +1,135 @@ +import debugUtil from "debug"; + +import ConsoleLogger from "../Util/ConsoleLogger.js"; +import isAsyncFunction from "../Util/IsAsyncFunction.js"; +import Benchmark from "./Benchmark.js"; + +const debugBenchmark = debugUtil("Eleventy:Benchmark"); + +class BenchmarkGroup { + constructor() { + this.benchmarks = {}; + // Warning: aggregate benchmarks automatically default to false via BenchmarkManager->getBenchmarkGroup + this.isVerbose = true; + this.logger = new ConsoleLogger(); + this.minimumThresholdMs = 50; + this.minimumThresholdPercent = 8; + } + + setIsVerbose(isVerbose) { + this.isVerbose = isVerbose; + this.logger.isVerbose = isVerbose; + } + + reset() { + for (var type in this.benchmarks) { + this.benchmarks[type].reset(); + } + } + + // TODO use addAsync everywhere instead + add(type, callback) { + let benchmark = (this.benchmarks[type] = new Benchmark()); + + /** @this {any} */ + let fn = function (...args) { + benchmark.before(); + let ret = callback.call(this, ...args); + benchmark.after(); + return ret; + }; + + Object.defineProperty(fn, "__eleventyInternal", { + value: { + type: isAsyncFunction(callback) ? "async" : "sync", + callback, + }, + }); + + return fn; + } + + // callback must return a promise + // async addAsync(type, callback) { + // let benchmark = (this.benchmarks[type] = new Benchmark()); + + // benchmark.before(); + // // don’t await here. + // let promise = callback.call(this); + // promise.then(function() { + // benchmark.after(); + // }); + // return promise; + // } + + setMinimumThresholdMs(minimumThresholdMs) { + let val = parseInt(minimumThresholdMs, 10); + if (isNaN(val)) { + throw new Error("`setMinimumThresholdMs` expects a number argument."); + } + this.minimumThresholdMs = val; + } + + setMinimumThresholdPercent(minimumThresholdPercent) { + let val = parseInt(minimumThresholdPercent, 10); + if (isNaN(val)) { + throw new Error("`setMinimumThresholdPercent` expects a number argument."); + } + this.minimumThresholdPercent = val; + } + + has(type) { + return !!this.benchmarks[type]; + } + + get(type) { + if (!this.benchmarks[type]) { + this.benchmarks[type] = new Benchmark(); + } + return this.benchmarks[type]; + } + + padNumber(num, length) { + if (("" + num).length >= length) { + return num; + } + + let prefix = new Array(length + 1).join(" "); + return (prefix + num).slice(-1 * length); + } + + finish(label, totalTimeSpent) { + for (var type in this.benchmarks) { + let bench = this.benchmarks[type]; + let isAbsoluteMinimumComparison = this.minimumThresholdMs > 0; + let totalForBenchmark = bench.getTotal(); + let percent = Math.round((totalForBenchmark * 100) / totalTimeSpent); + let callCount = bench.getTimesCalled(); + + let output = { + ms: this.padNumber(totalForBenchmark.toFixed(0), 6), + percent: this.padNumber(percent, 3), + calls: this.padNumber(callCount, 5), + }; + let str = `Benchmark ${output.ms}ms ${output.percent}% ${output.calls}× (${label}) ${type}`; + + if ( + isAbsoluteMinimumComparison && + totalForBenchmark >= this.minimumThresholdMs && + percent > this.minimumThresholdPercent + ) { + this.logger.warn(str); + } + + // Opt out of logging if low count (1× or 2×) or 0ms / 1% + if ( + callCount > 1 || // called more than once + Math.round(totalForBenchmark) > 0 // more than 0.5ms + ) { + debugBenchmark(str); + } + } + } +} + +export default BenchmarkGroup; diff --git a/node_modules/@11ty/eleventy/src/Benchmark/BenchmarkManager.js b/node_modules/@11ty/eleventy/src/Benchmark/BenchmarkManager.js new file mode 100644 index 0000000..d7a8f61 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Benchmark/BenchmarkManager.js @@ -0,0 +1,73 @@ +import { performance } from "node:perf_hooks"; + +import BenchmarkGroup from "./BenchmarkGroup.js"; + +// TODO this should not be a singleton, it belongs in the config or somewhere on the Eleventy instance. + +class BenchmarkManager { + constructor() { + this.benchmarkGroups = {}; + this.isVerbose = true; + this.start = this.getNewTimestamp(); + } + + reset() { + this.start = this.getNewTimestamp(); + + for (var j in this.benchmarkGroups) { + this.benchmarkGroups[j].reset(); + } + } + + getNewTimestamp() { + if (performance) { + return performance.now(); + } + return new Date().getTime(); + } + + setVerboseOutput(isVerbose) { + this.isVerbose = !!isVerbose; + } + + hasBenchmarkGroup(name) { + return name in this.benchmarkGroups; + } + + getBenchmarkGroup(name) { + if (!this.benchmarkGroups[name]) { + this.benchmarkGroups[name] = new BenchmarkGroup(); + + // Special behavior for aggregate benchmarks + // so they don’t console.log every time + if (name === "Aggregate") { + this.benchmarkGroups[name].setIsVerbose(false); + } else { + this.benchmarkGroups[name].setIsVerbose(this.isVerbose); + } + } + + return this.benchmarkGroups[name]; + } + + getAll() { + return this.benchmarkGroups; + } + + get(name) { + if (name) { + return this.getBenchmarkGroup(name); + } + + return this.getAll(); + } + + finish() { + let totalTimeSpentBenchmarking = this.getNewTimestamp() - this.start; + for (var j in this.benchmarkGroups) { + this.benchmarkGroups[j].finish(j, totalTimeSpentBenchmarking); + } + } +} + +export default BenchmarkManager; diff --git a/node_modules/@11ty/eleventy/src/Data/ComputedData.js b/node_modules/@11ty/eleventy/src/Data/ComputedData.js new file mode 100644 index 0000000..5350475 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Data/ComputedData.js @@ -0,0 +1,122 @@ +import lodash from "@11ty/lodash-custom"; +import debugUtil from "debug"; + +import ComputedDataQueue from "./ComputedDataQueue.js"; +import ComputedDataTemplateString from "./ComputedDataTemplateString.js"; +import ComputedDataProxy from "./ComputedDataProxy.js"; + +const { set: lodashSet, get: lodashGet } = lodash; +const debug = debugUtil("Eleventy:ComputedData"); + +class ComputedData { + constructor(config) { + this.computed = {}; + this.symbolParseFunctions = {}; + this.templateStringKeyLookup = {}; + this.computedKeys = new Set(); + this.declaredDependencies = {}; + this.queue = new ComputedDataQueue(); + this.config = config; + } + + add(key, renderFn, declaredDependencies = [], symbolParseFn, templateInstance) { + this.computedKeys.add(key); + this.declaredDependencies[key] = declaredDependencies; + + // bind config filters/JS functions + if (typeof renderFn === "function") { + let fns = {}; + // TODO bug? no access to non-universal config things? + if (this.config) { + fns = { + ...this.config.javascriptFunctions, + }; + } + fns.tmpl = templateInstance; + + renderFn = renderFn.bind(fns); + } + + lodashSet(this.computed, key, renderFn); + + if (symbolParseFn) { + lodashSet(this.symbolParseFunctions, key, symbolParseFn); + } + } + + addTemplateString(key, renderFn, declaredDependencies = [], symbolParseFn, templateInstance) { + this.add(key, renderFn, declaredDependencies, symbolParseFn, templateInstance); + this.templateStringKeyLookup[key] = true; + } + + async resolveVarOrder(data) { + let proxyByTemplateString = new ComputedDataTemplateString(this.computedKeys); + let proxyByProxy = new ComputedDataProxy(this.computedKeys); + + for (let key of this.computedKeys) { + let computed = lodashGet(this.computed, key); + + if (typeof computed !== "function") { + // add nodes for non functions (primitives like booleans, etc) + // This will not handle template strings, as they are normalized to functions + this.queue.addNode(key); + } else { + this.queue.uses(key, this.declaredDependencies[key]); + + let symbolParseFn = lodashGet(this.symbolParseFunctions, key); + let varsUsed = []; + if (symbolParseFn) { + // use the parseForSymbols function in the TemplateEngine + varsUsed = symbolParseFn(); + } else if (symbolParseFn !== false) { + // skip resolution is this is false (just use declaredDependencies) + let isTemplateString = !!this.templateStringKeyLookup[key]; + let proxy = isTemplateString ? proxyByTemplateString : proxyByProxy; + varsUsed = await proxy.findVarsUsed(computed, data); + } + + debug("%o accesses %o variables", key, varsUsed); + let filteredVarsUsed = varsUsed.filter((varUsed) => { + return ( + (varUsed !== key && this.computedKeys.has(varUsed)) || + varUsed.startsWith("collections.") + ); + }); + this.queue.uses(key, filteredVarsUsed); + } + } + } + + async _setupDataEntry(data, order) { + debug("Computed data order of execution: %o", order); + for (let key of order) { + let computed = lodashGet(this.computed, key); + + if (typeof computed === "function") { + let ret = await computed(data); + lodashSet(data, key, ret); + } else if (computed !== undefined) { + lodashSet(data, key, computed); + } + } + } + + async setupData(data, orderFilter) { + await this.resolveVarOrder(data); + + await this.processRemainingData(data, orderFilter); + } + + async processRemainingData(data, orderFilter) { + // process all variables + let order = this.queue.getOrder(); + if (orderFilter && typeof orderFilter === "function") { + order = order.filter(orderFilter.bind(this.queue)); + } + + await this._setupDataEntry(data, order); + this.queue.markComputed(order); + } +} + +export default ComputedData; diff --git a/node_modules/@11ty/eleventy/src/Data/ComputedDataProxy.js b/node_modules/@11ty/eleventy/src/Data/ComputedDataProxy.js new file mode 100644 index 0000000..2415355 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Data/ComputedDataProxy.js @@ -0,0 +1,131 @@ +import lodash from "@11ty/lodash-custom"; +import { isPlainObject } from "@11ty/eleventy-utils"; + +const { set: lodashSet, get: lodashGet } = lodash; + +/* Calculates computed data using Proxies */ +class ComputedDataProxy { + constructor(computedKeys) { + if (Array.isArray(computedKeys)) { + this.computedKeys = new Set(computedKeys); + } else { + this.computedKeys = computedKeys; + } + } + + isArrayOrPlainObject(data) { + return Array.isArray(data) || isPlainObject(data); + } + + getProxyData(data, keyRef) { + // WARNING: SIDE EFFECTS + // Set defaults for keys not already set on parent data + + // TODO should make another effort to get rid of this, + // See the ProxyWrap util for more proxy handlers that will likely fix this + let undefinedValue = "__11TY_UNDEFINED__"; + if (this.computedKeys) { + for (let key of this.computedKeys) { + if (lodashGet(data, key, undefinedValue) === undefinedValue) { + lodashSet(data, key, ""); + } + } + } + + let proxyData = this._getProxyData(data, keyRef); + return proxyData; + } + + _getProxyForObject(dataObj, keyRef, parentKey = "") { + return new Proxy( + {}, + { + get: (obj, key) => { + if (typeof key !== "string") { + return obj[key]; + } + + let newKey = `${parentKey ? `${parentKey}.` : ""}${key}`; + + // Issue #1137 + // Special case for Collections, always return an Array for collection keys + // so they it works fine with Array methods like `filter`, `map`, etc + if (newKey === "collections") { + keyRef.add(newKey); + return new Proxy( + {}, + { + get: (target, key) => { + if (typeof key === "string") { + keyRef.add(`collections.${key}`); + return []; + } + return target[key]; + }, + }, + ); + } + + let newData = this._getProxyData(dataObj[key], keyRef, newKey); + if (!this.isArrayOrPlainObject(newData)) { + keyRef.add(newKey); + } + return newData; + }, + }, + ); + } + + _getProxyForArray(dataArr, keyRef, parentKey = "") { + return new Proxy(new Array(dataArr.length), { + get: (obj, key) => { + if (Array.prototype.hasOwnProperty(key)) { + // remove `filter`, `constructor`, `map`, etc + keyRef.add(parentKey); + return obj[key]; + } + + // Hm, this needs to be better + if (key === "then") { + keyRef.add(parentKey); + return; + } + + let newKey = `${parentKey}[${key}]`; + let newData = this._getProxyData(dataArr[key], keyRef, newKey); + if (!this.isArrayOrPlainObject(newData)) { + keyRef.add(newKey); + } + return newData; + }, + }); + } + + _getProxyData(data, keyRef, parentKey = "") { + if (isPlainObject(data)) { + return this._getProxyForObject(data, keyRef, parentKey); + } else if (Array.isArray(data)) { + return this._getProxyForArray(data, keyRef, parentKey); + } + + // everything else! + return data; + } + + async findVarsUsed(fn, data = {}) { + let keyRef = new Set(); + + // careful, logging proxyData will mess with test results! + let proxyData = this.getProxyData(data, keyRef); + + // squelch console logs for this fake proxy data pass 😅 + // let savedLog = console.log; + // console.log = () => {}; + await fn(proxyData); + // console.log = savedLog; + + return Array.from(keyRef); + } +} + +export default ComputedDataProxy; diff --git a/node_modules/@11ty/eleventy/src/Data/ComputedDataQueue.js b/node_modules/@11ty/eleventy/src/Data/ComputedDataQueue.js new file mode 100644 index 0000000..628b911 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Data/ComputedDataQueue.js @@ -0,0 +1,64 @@ +import { DepGraph as DependencyGraph } from "dependency-graph"; + +/* Keeps track of the dependency graph between computed data variables + * Removes keys from the graph when they are computed. + */ +class ComputedDataQueue { + constructor() { + this.graph = new DependencyGraph(); + } + + getOrder() { + return this.graph.overallOrder(); + } + + getOrderFor(name) { + return this.graph.dependenciesOf(name); + } + + getDependsOn(name) { + return this.graph.dependantsOf(name); + } + + isUsesStartsWith(name, prefix) { + if (name.startsWith(prefix)) { + return true; + } + return ( + this.graph.dependenciesOf(name).filter((entry) => { + return entry.startsWith(prefix); + }).length > 0 + ); + } + + addNode(name) { + if (!this.graph.hasNode(name)) { + this.graph.addNode(name); + } + } + + _uses(graph, name, varsUsed = []) { + if (!graph.hasNode(name)) { + graph.addNode(name); + } + + for (let varUsed of varsUsed) { + if (!graph.hasNode(varUsed)) { + graph.addNode(varUsed); + } + graph.addDependency(name, varUsed); + } + } + + uses(name, varsUsed = []) { + this._uses(this.graph, name, varsUsed); + } + + markComputed(varsComputed = []) { + for (let varComputed of varsComputed) { + this.graph.removeNode(varComputed); + } + } +} + +export default ComputedDataQueue; diff --git a/node_modules/@11ty/eleventy/src/Data/ComputedDataTemplateString.js b/node_modules/@11ty/eleventy/src/Data/ComputedDataTemplateString.js new file mode 100644 index 0000000..d5241b2 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Data/ComputedDataTemplateString.js @@ -0,0 +1,70 @@ +import lodash from "@11ty/lodash-custom"; +import debugUtil from "debug"; + +const { set: lodashSet } = lodash; +const debug = debugUtil("Eleventy:ComputedDataTemplateString"); + +/* Calculates computed data in Template Strings. + * Ideally we would use the Proxy approach but it doesn’t work + * in some template languages that visit all available data even if + * it isn’t used in the template (Nunjucks) + */ +class ComputedDataTemplateString { + constructor(computedKeys) { + if (Array.isArray(computedKeys)) { + this.computedKeys = new Set(computedKeys); + } else { + this.computedKeys = computedKeys; + } + + // is this ¯\_(lisp)_/¯ + // must be strings that won’t be escaped by template languages + this.prefix = "(((11ty((("; + this.suffix = ")))11ty)))"; + } + + getProxyData() { + let proxyData = {}; + + // use these special strings as a workaround to check the rendered output + // can’t use proxies here as some template languages trigger proxy for all + // keys in data + for (let key of this.computedKeys) { + // TODO don’t allow to set eleventyComputed.page? other disallowed computed things? + lodashSet(proxyData, key, this.prefix + key + this.suffix); + } + + return proxyData; + } + + findVarsInOutput(output = "") { + let vars = new Set(); + let splits = output.split(this.prefix); + for (let split of splits) { + let varName = split.slice(0, split.indexOf(this.suffix) < 0 ? 0 : split.indexOf(this.suffix)); + if (varName) { + vars.add(varName); + } + } + return Array.from(vars); + } + + async findVarsUsed(fn) { + let proxyData = this.getProxyData(); + let output; + // Mitigation for #1061, errors with filters in the first pass shouldn’t fail the whole thing. + try { + output = await fn(proxyData); + } catch (e) { + debug("Computed Data first pass data resolution error: %o", e); + } + + // page.outputPath on serverless urls returns false. + if (typeof output === "string") { + return this.findVarsInOutput(output); + } + return []; + } +} + +export default ComputedDataTemplateString; diff --git a/node_modules/@11ty/eleventy/src/Data/TemplateData.js b/node_modules/@11ty/eleventy/src/Data/TemplateData.js new file mode 100644 index 0000000..6942892 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Data/TemplateData.js @@ -0,0 +1,710 @@ +import path from "node:path"; +import util from "node:util"; +import semver from "semver"; + +import lodash from "@11ty/lodash-custom"; +import { Merge, TemplatePath, isPlainObject } from "@11ty/eleventy-utils"; +import debugUtil from "debug"; + +import unique from "../Util/Objects/Unique.js"; +import TemplateGlob from "../TemplateGlob.js"; +import EleventyBaseError from "../Errors/EleventyBaseError.js"; +import TemplateDataInitialGlobalData from "./TemplateDataInitialGlobalData.js"; +import { getEleventyPackageJson, getWorkingProjectPackageJson } from "../Util/ImportJsonSync.js"; +import { EleventyImport, EleventyLoadContent } from "../Util/Require.js"; +import { DeepFreeze } from "../Util/Objects/DeepFreeze.js"; + +const { set: lodashSet, get: lodashGet } = lodash; + +const debugWarn = debugUtil("Eleventy:Warnings"); +const debug = debugUtil("Eleventy:TemplateData"); +const debugDev = debugUtil("Dev:Eleventy:TemplateData"); + +class TemplateDataParseError extends EleventyBaseError {} + +class TemplateData { + constructor(templateConfig) { + if (!templateConfig || templateConfig.constructor.name !== "TemplateConfig") { + throw new Error( + "Internal error: Missing `templateConfig` or was not an instance of `TemplateConfig`.", + ); + } + + this.templateConfig = templateConfig; + this.config = this.templateConfig.getConfig(); + + this.benchmarks = { + data: this.config.benchmarkManager.get("Data"), + aggregate: this.config.benchmarkManager.get("Aggregate"), + }; + + this.rawImports = {}; + this.globalData = null; + this.templateDirectoryData = {}; + this.isEsm = false; + + this.initialGlobalData = new TemplateDataInitialGlobalData(this.templateConfig); + } + + get dirs() { + return this.templateConfig.directories; + } + + get inputDir() { + return this.dirs.input; + } + + // if this was set but `falsy` we would fallback to inputDir + get dataDir() { + return this.dirs.data; + } + + get absoluteDataDir() { + return TemplatePath.absolutePath(this.dataDir); + } + + // This was async in 2.0 and prior but doesn’t need to be any more. + getInputDir() { + return this.dirs.input; + } + + getDataDir() { + return this.dataDir; + } + + exists(pathname) { + // It's common for data files not to exist, so we avoid going to the FS to + // re-check if they do via a quick-and-dirty cache. + return this.templateConfig.existsCache.exists(pathname); + } + + setFileSystemSearch(fileSystemSearch) { + this.fileSystemSearch = fileSystemSearch; + } + + setProjectUsingEsm(isEsmProject) { + this.isEsm = !!isEsmProject; + } + + get extensionMap() { + if (!this._extensionMap) { + throw new Error("Internal error: missing `extensionMap` in TemplateData."); + } + return this._extensionMap; + } + + set extensionMap(map) { + this._extensionMap = map; + } + + get environmentVariables() { + return this._env; + } + + set environmentVariables(env) { + this._env = env; + } + + /* Used by tests */ + _setConfig(config) { + this.config = config; + } + + getRawImports() { + if (!this.config.keys.package) { + debug( + "Opted-out of package.json assignment for global data with falsy value for `keys.package` configuration.", + ); + return this.rawImports; + } else if (Object.keys(this.rawImports).length > 0) { + return this.rawImports; + } + + let pkgJson = getWorkingProjectPackageJson(); + this.rawImports[this.config.keys.package] = pkgJson; + + if (this.config.freezeReservedData) { + DeepFreeze(this.rawImports); + } + + return this.rawImports; + } + + clearData() { + this.globalData = null; + this.configApiGlobalData = null; + this.templateDirectoryData = {}; + } + + _getGlobalDataGlobByExtension(extension) { + return TemplateGlob.normalizePath(this.dataDir, `/**/*.${extension}`); + } + + // This is a backwards compatibility helper with the old `jsDataFileSuffix` configuration API + getDataFileSuffixes() { + // New API + if (Array.isArray(this.config.dataFileSuffixes)) { + return this.config.dataFileSuffixes; + } + + // Backwards compatibility + if (this.config.jsDataFileSuffix) { + let suffixes = []; + suffixes.push(this.config.jsDataFileSuffix); // e.g. filename.11tydata.json + suffixes.push(""); // suffix-less for free with old API, e.g. filename.json + return suffixes; + } + return []; // if both of these entries are set to false, use no files + } + + // This is used exclusively for --watch and --serve chokidar targets + async getTemplateDataFileGlob() { + let suffixes = this.getDataFileSuffixes(); + let globSuffixesWithLeadingDot = new Set(); + globSuffixesWithLeadingDot.add("json"); // covers .11tydata.json too + let globSuffixesWithoutLeadingDot = new Set(); + + // Typically using [ '.11tydata', '' ] suffixes to find data files + for (let suffix of suffixes) { + // TODO the `suffix` truthiness check is purely for backwards compat? + if (suffix && typeof suffix === "string") { + if (suffix.startsWith(".")) { + // .suffix.js + globSuffixesWithLeadingDot.add(`${suffix.slice(1)}.mjs`); + globSuffixesWithLeadingDot.add(`${suffix.slice(1)}.cjs`); + globSuffixesWithLeadingDot.add(`${suffix.slice(1)}.js`); + } else { + // "suffix.js" without leading dot + globSuffixesWithoutLeadingDot.add(`${suffix || ""}.mjs`); + globSuffixesWithoutLeadingDot.add(`${suffix || ""}.cjs`); + globSuffixesWithoutLeadingDot.add(`${suffix || ""}.js`); + } + } + } + + // Configuration Data Extensions e.g. yaml + if (this.hasUserDataExtensions()) { + for (let extension of this.getUserDataExtensions()) { + globSuffixesWithLeadingDot.add(extension); // covers .11tydata.{extension} too + } + } + + let paths = []; + if (globSuffixesWithLeadingDot.size > 0) { + paths.push(`${this.inputDir}**/*.{${Array.from(globSuffixesWithLeadingDot).join(",")}}`); + } + if (globSuffixesWithoutLeadingDot.size > 0) { + paths.push(`${this.inputDir}**/*{${Array.from(globSuffixesWithoutLeadingDot).join(",")}}`); + } + + return TemplatePath.addLeadingDotSlashArray(paths); + } + + // For spidering dependencies + // TODO Can we reuse getTemplateDataFileGlob instead? Maybe just filter off the .json files before scanning for dependencies + getTemplateJavaScriptDataFileGlob() { + let paths = []; + let suffixes = this.getDataFileSuffixes(); + for (let suffix of suffixes) { + if (suffix) { + // TODO this check is purely for backwards compat and I kinda feel like it shouldn’t be here + // paths.push(`${this.inputDir}/**/*${suffix || ""}.cjs`); // Same as above + paths.push(`${this.inputDir}**/*${suffix || ""}.js`); + } + } + + return TemplatePath.addLeadingDotSlashArray(paths); + } + + getGlobalDataGlob() { + let extGlob = this.getGlobalDataExtensionPriorities().join(","); + return [this._getGlobalDataGlobByExtension("{" + extGlob + "}")]; + } + + getWatchPathCache() { + return this.pathCache; + } + + getGlobalDataExtensionPriorities() { + return this.getUserDataExtensions().concat(["json", "mjs", "cjs", "js"]); + } + + static calculateExtensionPriority(path, priorities) { + for (let i = 0; i < priorities.length; i++) { + let ext = priorities[i]; + if (path.endsWith(ext)) { + return i; + } + } + return priorities.length; + } + + async getGlobalDataFiles() { + let priorities = this.getGlobalDataExtensionPriorities(); + + let fsBench = this.benchmarks.aggregate.get("Searching the file system (data)"); + fsBench.before(); + let globs = this.getGlobalDataGlob(); + let paths = await this.fileSystemSearch.search("global-data", globs); + fsBench.after(); + + // sort paths according to extension priorities + // here we use reverse ordering, because paths with bigger index in array will override the first ones + // example [path/file.json, path/file.js] here js will override json + paths = paths.sort((first, second) => { + let p1 = TemplateData.calculateExtensionPriority(first, priorities); + let p2 = TemplateData.calculateExtensionPriority(second, priorities); + if (p1 < p2) { + return -1; + } + if (p1 > p2) { + return 1; + } + return 0; + }); + + this.pathCache = paths; + return paths; + } + + getObjectPathForDataFile(dataFilePath) { + let absoluteDataFilePath = TemplatePath.absolutePath(dataFilePath); + let reducedPath = TemplatePath.stripLeadingSubPath(absoluteDataFilePath, this.absoluteDataDir); + let parsed = path.parse(reducedPath); + let folders = parsed.dir ? parsed.dir.split("/") : []; + folders.push(parsed.name); + + return folders; + } + + async getAllGlobalData() { + let globalData = {}; + let files = TemplatePath.addLeadingDotSlashArray(await this.getGlobalDataFiles()); + + this.config.events.emit("eleventy.globalDataFiles", files); + + let dataFileConflicts = {}; + + for (let j = 0, k = files.length; j < k; j++) { + let data = await this.getDataValue(files[j]); + let objectPathTarget = this.getObjectPathForDataFile(files[j]); + + // Since we're joining directory paths and an array is not usable as an objectkey since two identical arrays are not double equal, + // we can just join the array by a forbidden character ("/"" is chosen here, since it works on Linux, Mac and Windows). + // If at some point this isn't enough anymore, it would be possible to just use JSON.stringify(objectPathTarget) since that + // is guaranteed to work but is signifivcantly slower. + let objectPathTargetString = objectPathTarget.join(path.sep); + + // if two global files have the same path (but different extensions) + // and conflict, let’s merge them. + if (dataFileConflicts[objectPathTargetString]) { + debugWarn( + `merging global data from ${files[j]} with an already existing global data file (${dataFileConflicts[objectPathTargetString]}). Overriding existing keys.`, + ); + + let oldData = lodashGet(globalData, objectPathTarget); + data = TemplateData.mergeDeep(this.config.dataDeepMerge, oldData, data); + } + + dataFileConflicts[objectPathTargetString] = files[j]; + debug(`Found global data file ${files[j]} and adding as: ${objectPathTarget}`); + lodashSet(globalData, objectPathTarget, data); + } + + return globalData; + } + + async #getInitialGlobalData() { + let globalData = await this.initialGlobalData.getData(); + + if (!("eleventy" in globalData)) { + globalData.eleventy = {}; + } + + // #2293 for meta[name=generator] + const pkg = getEleventyPackageJson(); + globalData.eleventy.version = semver.coerce(pkg.version).toString(); + globalData.eleventy.generator = `Eleventy v${globalData.eleventy.version}`; + + if (this.environmentVariables) { + if (!("env" in globalData.eleventy)) { + globalData.eleventy.env = {}; + } + + Object.assign(globalData.eleventy.env, this.environmentVariables); + } + + if (this.dirs) { + if (!("directories" in globalData.eleventy)) { + globalData.eleventy.directories = {}; + } + + Object.assign(globalData.eleventy.directories, this.dirs.getUserspaceInstance()); + } + + // Reserved + if (this.config.freezeReservedData) { + DeepFreeze(globalData.eleventy); + } + + return globalData; + } + + async getInitialGlobalData() { + if (!this.configApiGlobalData) { + this.configApiGlobalData = this.#getInitialGlobalData(); + } + + return this.configApiGlobalData; + } + + async #getGlobalData() { + let rawImports = this.getRawImports(); + let configApiGlobalData = await this.getInitialGlobalData(); + + let globalJson = await this.getAllGlobalData(); + let mergedGlobalData = Merge(globalJson, configApiGlobalData); + + // OK: Shallow merge when combining rawImports (pkg) with global data files + return Object.assign({}, mergedGlobalData, rawImports); + } + + async getGlobalData() { + if (!this.globalData) { + this.globalData = this.#getGlobalData(); + } + + return this.globalData; + } + + /* Template and Directory data files */ + async combineLocalData(localDataPaths) { + let localData = {}; + if (!Array.isArray(localDataPaths)) { + localDataPaths = [localDataPaths]; + } + + // Filter out files we know don't exist to avoid overhead for checking + localDataPaths = localDataPaths.filter((path) => { + return this.exists(path); + }); + + this.config.events.emit("eleventy.dataFiles", localDataPaths); + + if (!localDataPaths.length) { + return localData; + } + + let dataSource = {}; + for (let path of localDataPaths) { + let dataForPath = await this.getDataValue(path); + if (!isPlainObject(dataForPath)) { + debug( + "Warning: Template and Directory data files expect an object to be returned, instead `%o` returned `%o`", + path, + dataForPath, + ); + } else { + // clean up data for template/directory data files only. + let cleanedDataForPath = TemplateData.cleanupData(dataForPath, { + file: path, + }); + for (let key in cleanedDataForPath) { + if (Object.prototype.hasOwnProperty.call(dataSource, key)) { + debugWarn( + "Local data files have conflicting data. Overwriting '%s' with data from '%s'. Previous data location was from '%s'", + key, + path, + dataSource[key], + ); + } + dataSource[key] = path; + } + TemplateData.mergeDeep(this.config.dataDeepMerge, localData, cleanedDataForPath); + } + } + return localData; + } + + async getTemplateDirectoryData(templatePath) { + if (!this.templateDirectoryData[templatePath]) { + let localDataPaths = await this.getLocalDataPaths(templatePath); + let importedData = await this.combineLocalData(localDataPaths); + + this.templateDirectoryData[templatePath] = importedData; + } + return this.templateDirectoryData[templatePath]; + } + + getUserDataExtensions() { + if (!this.config.dataExtensions) { + return []; + } + + // returning extensions in reverse order to create proper extension order + // later added formats will override first ones + return Array.from(this.config.dataExtensions.keys()).reverse(); + } + + getUserDataParser(extension) { + return this.config.dataExtensions.get(extension); + } + + isUserDataExtension(extension) { + return this.config.dataExtensions && this.config.dataExtensions.has(extension); + } + + hasUserDataExtensions() { + return this.config.dataExtensions && this.config.dataExtensions.size > 0; + } + + async _parseDataFile(path, parser, options = {}) { + let readFile = !("read" in options) || options.read === true; + let rawInput; + + if (readFile) { + rawInput = EleventyLoadContent(path, options); + } + + if (readFile && !rawInput) { + return {}; + } + + try { + if (readFile) { + return parser(rawInput, path); + } else { + // path as a first argument is when `read: false` + // path as a second argument is for consistency with `read: true` API + return parser(path, path); + } + } catch (e) { + throw new TemplateDataParseError(`Having trouble parsing data file ${path}`, e); + } + } + + // ignoreProcessing = false for global data files + // ignoreProcessing = true for local data files + async getDataValue(path) { + let extension = TemplatePath.getExtension(path); + + if (extension === "js" || extension === "cjs" || extension === "mjs") { + // JS data file or require’d JSON (no preprocessing needed) + if (!this.exists(path)) { + return {}; + } + + let aggregateDataBench = this.benchmarks.aggregate.get("Data File"); + aggregateDataBench.before(); + let dataBench = this.benchmarks.data.get(`\`${path}\``); + dataBench.before(); + + let type = "cjs"; + if (extension === "mjs" || (extension === "js" && this.isEsm)) { + type = "esm"; + } + + // We always need to use `import()`, as `require` isn’t available in ESM. + let returnValue = await EleventyImport(path, type); + + // TODO special exception for Global data `permalink.js` + // module.exports = (data) => `${data.page.filePathStem}/`; // Does not work + // module.exports = () => ((data) => `${data.page.filePathStem}/`); // Works + if (typeof returnValue === "function") { + let configApiGlobalData = await this.getInitialGlobalData(); + returnValue = await returnValue(configApiGlobalData || {}); + } + + dataBench.after(); + aggregateDataBench.after(); + + return returnValue; + } else if (this.isUserDataExtension(extension)) { + // Other extensions + let { parser, options } = this.getUserDataParser(extension); + + return this._parseDataFile(path, parser, options); + } else if (extension === "json") { + // File to string, parse with JSON (preprocess) + const parser = (content) => JSON.parse(content); + return this._parseDataFile(path, parser); + } else { + throw new TemplateDataParseError( + `Could not find an appropriate data parser for ${path}. Do you need to add a plugin to your config file?`, + ); + } + } + + _pushExtensionsToPaths(paths, curpath, extensions) { + for (let extension of extensions) { + paths.push(curpath + "." + extension); + } + } + + _addBaseToPaths(paths, base, extensions, nonEmptySuffixesOnly = false) { + let suffixes = this.getDataFileSuffixes(); + + for (let suffix of suffixes) { + suffix = suffix || ""; + + if (nonEmptySuffixesOnly && suffix === "") { + continue; + } + + // data suffix + if (suffix) { + paths.push(base + suffix + ".js"); + paths.push(base + suffix + ".cjs"); + paths.push(base + suffix + ".mjs"); + } + paths.push(base + suffix + ".json"); // default: .11tydata.json + + // inject user extensions + this._pushExtensionsToPaths(paths, base + suffix, extensions); + } + } + + async getLocalDataPaths(templatePath) { + let paths = []; + let parsed = path.parse(templatePath); + let inputDir = this.inputDir; + + debugDev("getLocalDataPaths(%o)", templatePath); + debugDev("parsed.dir: %o", parsed.dir); + + let userExtensions = this.getUserDataExtensions(); + + if (parsed.dir) { + let fileNameNoExt = this.extensionMap.removeTemplateExtension(parsed.base); + + // default dataSuffix: .11tydata, is appended in _addBaseToPaths + debug("Using %o suffixes to find data files.", this.getDataFileSuffixes()); + + // Template data file paths + let filePathNoExt = parsed.dir + "/" + fileNameNoExt; + this._addBaseToPaths(paths, filePathNoExt, userExtensions); + + // Directory data file paths + let allDirs = TemplatePath.getAllDirs(parsed.dir); + + debugDev("allDirs: %o", allDirs); + for (let dir of allDirs) { + let lastDir = TemplatePath.getLastPathSegment(dir); + let dirPathNoExt = dir + "/" + lastDir; + + if (inputDir) { + debugDev("dirStr: %o; inputDir: %o", dir, inputDir); + } + // TODO use DirContains + if (!inputDir || (dir.startsWith(inputDir) && dir !== inputDir)) { + if (this.config.dataFileDirBaseNameOverride) { + let indexDataFile = dir + "/" + this.config.dataFileDirBaseNameOverride; + this._addBaseToPaths(paths, indexDataFile, userExtensions, true); + } else { + this._addBaseToPaths(paths, dirPathNoExt, userExtensions); + } + } + } + + // 0.11.0+ include root input dir files + // if using `docs/` as input dir, looks for docs/docs.json et al + if (inputDir) { + let lastInputDir = TemplatePath.addLeadingDotSlash( + TemplatePath.join(inputDir, TemplatePath.getLastPathSegment(inputDir)), + ); + + // in root input dir, search for index.11tydata.json et al + if (this.config.dataFileDirBaseNameOverride) { + let indexDataFile = + TemplatePath.getDirFromFilePath(lastInputDir) + + "/" + + this.config.dataFileDirBaseNameOverride; + this._addBaseToPaths(paths, indexDataFile, userExtensions, true); + } else if (lastInputDir !== "./") { + this._addBaseToPaths(paths, lastInputDir, userExtensions); + } + } + } + + debug("getLocalDataPaths(%o): %o", templatePath, paths); + return unique(paths).reverse(); + } + + static mergeDeep(deepMerge, target, ...source) { + if (!deepMerge && deepMerge !== undefined) { + return Object.assign(target, ...source); + } else { + return TemplateData.merge(target, ...source); + } + } + + static merge(target, ...source) { + return Merge(target, ...source); + } + + /* Like cleanupData() but does not mutate */ + static getCleanedTagsImmutable(data, options = {}) { + let tags = []; + + if (isPlainObject(data) && data.tags) { + if (typeof data.tags === "string") { + tags = (data.tags || "").split(","); + } else if (Array.isArray(data.tags)) { + tags = data.tags; + } else if (data.tags) { + throw new Error( + `String or Array expected for \`tags\`${options.file ? ` in ${options.isVirtualTemplate ? "virtual " : ""}template: ${options.file}` : ""}. Received: ${util.inspect(data.tags)}`, + ); + } + + // Deduplicate tags + // Coerce to string #3875 + return [...new Set(tags)].map((entry) => String(entry)); + } + + return tags; + } + + static cleanupData(data, options = {}) { + if (isPlainObject(data) && "tags" in data) { + data.tags = this.getCleanedTagsImmutable(data, options); + } + + return data; + } + + static getNormalizedExcludedCollections(data) { + let excludes = []; + let key = "eleventyExcludeFromCollections"; + + if (data?.[key] !== true) { + if (Array.isArray(data[key])) { + excludes = data[key]; + } else if (typeof data[key] === "string") { + excludes = (data[key] || "").split(","); + } + } + + return { + excludes, + excludeAll: data?.eleventyExcludeFromCollections === true, + }; + } + + static getIncludedCollectionNames(data) { + let tags = TemplateData.getCleanedTagsImmutable(data); + + let { excludes, excludeAll } = TemplateData.getNormalizedExcludedCollections(data); + if (excludeAll) { + return []; + } + + return ["all", ...tags].filter((tag) => !excludes.includes(tag)); + } + + static getIncludedTagNames(data) { + return this.getIncludedCollectionNames(data).filter((tagName) => tagName !== "all"); + } +} + +export default TemplateData; diff --git a/node_modules/@11ty/eleventy/src/Data/TemplateDataInitialGlobalData.js b/node_modules/@11ty/eleventy/src/Data/TemplateDataInitialGlobalData.js new file mode 100644 index 0000000..7e2a7ee --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Data/TemplateDataInitialGlobalData.js @@ -0,0 +1,40 @@ +import lodash from "@11ty/lodash-custom"; + +import EleventyBaseError from "../Errors/EleventyBaseError.js"; + +const { set: lodashSet } = lodash; + +class TemplateDataConfigError extends EleventyBaseError {} + +class TemplateDataInitialGlobalData { + constructor(templateConfig) { + if (!templateConfig || templateConfig.constructor.name !== "TemplateConfig") { + throw new TemplateDataConfigError("Missing or invalid `templateConfig` (via Render plugin)."); + } + this.templateConfig = templateConfig; + this.config = this.templateConfig.getConfig(); + } + + async getData() { + let globalData = {}; + + // via eleventyConfig.addGlobalData + if (this.config.globalData) { + let keys = Object.keys(this.config.globalData); + for (let key of keys) { + let returnValue = this.config.globalData[key]; + + // This section is problematic when used with eleventyComputed #3389 + if (typeof returnValue === "function") { + returnValue = await returnValue(); + } + + lodashSet(globalData, key, returnValue); + } + } + + return globalData; + } +} + +export default TemplateDataInitialGlobalData; diff --git a/node_modules/@11ty/eleventy/src/Eleventy.js b/node_modules/@11ty/eleventy/src/Eleventy.js new file mode 100644 index 0000000..0568a3e --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Eleventy.js @@ -0,0 +1,1565 @@ +import chalk from "kleur"; +import { performance } from "node:perf_hooks"; +import debugUtil from "debug"; +import { filesize } from "filesize"; +import path from "node:path"; + +/* Eleventy Deps */ +import { TemplatePath } from "@11ty/eleventy-utils"; +import BundlePlugin from "@11ty/eleventy-plugin-bundle"; + +import TemplateData from "./Data/TemplateData.js"; +import TemplateWriter from "./TemplateWriter.js"; +import EleventyExtensionMap from "./EleventyExtensionMap.js"; +import { EleventyErrorHandler } from "./Errors/EleventyErrorHandler.js"; +import EleventyBaseError from "./Errors/EleventyBaseError.js"; +import EleventyServe from "./EleventyServe.js"; +import EleventyWatch from "./EleventyWatch.js"; +import EleventyWatchTargets from "./EleventyWatchTargets.js"; +import EleventyFiles from "./EleventyFiles.js"; +import TemplatePassthroughManager from "./TemplatePassthroughManager.js"; +import TemplateConfig from "./TemplateConfig.js"; +import FileSystemSearch from "./FileSystemSearch.js"; +import TemplateEngineManager from "./Engines/TemplateEngineManager.js"; + +/* Utils */ +import ConsoleLogger from "./Util/ConsoleLogger.js"; +import PathPrefixer from "./Util/PathPrefixer.js"; +import ProjectDirectories from "./Util/ProjectDirectories.js"; +import PathNormalizer from "./Util/PathNormalizer.js"; +import { isGlobMatch } from "./Util/GlobMatcher.js"; +import simplePlural from "./Util/Pluralize.js"; +import checkPassthroughCopyBehavior from "./Util/PassthroughCopyBehaviorCheck.js"; +import eventBus from "./EventBus.js"; +import { + getEleventyPackageJson, + importJsonSync, + getWorkingProjectPackageJsonPath, +} from "./Util/ImportJsonSync.js"; +import { EleventyImport } from "./Util/Require.js"; +import ProjectTemplateFormats from "./Util/ProjectTemplateFormats.js"; +import { withResolvers } from "./Util/PromiseUtil.js"; + +/* Plugins */ +import RenderPlugin, * as RenderPluginExtras from "./Plugins/RenderPlugin.js"; +import I18nPlugin, * as I18nPluginExtras from "./Plugins/I18nPlugin.js"; +import HtmlBasePlugin, * as HtmlBasePluginExtras from "./Plugins/HtmlBasePlugin.js"; +import { TransformPlugin as InputPathToUrlTransformPlugin } from "./Plugins/InputPathToUrl.js"; +import { IdAttributePlugin } from "./Plugins/IdAttributePlugin.js"; +import FileSystemRemap from "./Util/GlobRemap.js"; + +const pkg = getEleventyPackageJson(); +const debug = debugUtil("Eleventy"); + +/** + * Eleventy’s programmatic API + * @module 11ty/eleventy/Eleventy + */ + +class Eleventy { + /** + * Userspace package.json file contents + * @type {object|undefined} + */ + #projectPackageJson; + /** @type {string} */ + #projectPackageJsonPath; + /** @type {ProjectTemplateFormats|undefined} */ + #templateFormats; + /** @type {ConsoleLogger|undefined} */ + #logger; + /** @type {ProjectDirectories|undefined} */ + #directories; + /** @type {boolean|undefined} */ + #verboseOverride; + /** @type {boolean} */ + #isVerboseMode = true; + /** @type {boolean|undefined} */ + #preInitVerbose; + /** @type {boolean} */ + #hasConfigInitialized = false; + /** @type {boolean} */ + #needsInit = true; + /** @type {Promise|undefined} */ + #initPromise; + /** @type {EleventyErrorHandler|undefined} */ + #errorHandler; + /** @type {Map} */ + #privateCaches = new Map(); + /** @type {boolean} */ + #isStopping = false; + /** @type {boolean|undefined} */ + #isEsm; + + /** + * @typedef {object} EleventyOptions + * @property {'cli'|'script'=} source + * @property {'build'|'serve'|'watch'=} runMode + * @property {boolean=} dryRun + * @property {string=} configPath + * @property {string=} pathPrefix + * @property {boolean=} quietMode + * @property {Function=} config + * @property {string=} inputDir + + * @param {string} [input] - Directory or filename for input/sources files. + * @param {string} [output] - Directory serving as the target for writing the output files. + * @param {EleventyOptions} [options={}] + * @param {TemplateConfig} [eleventyConfig] + */ + constructor(input, output, options = {}, eleventyConfig = null) { + /** + * @type {string|undefined} + * @description Holds the path to the input (might be a file or folder) + */ + this.rawInput = input || undefined; + + /** + * @type {string|undefined} + * @description holds the path to the output directory + */ + this.rawOutput = output || undefined; + + /** + * @type {module:11ty/eleventy/TemplateConfig} + * @description Override the config instance (for centralized config re-use) + */ + this.eleventyConfig = eleventyConfig; + + /** + * @type {EleventyOptions} + * @description Options object passed to the Eleventy constructor + * @default {} + */ + this.options = options; + + /** + * @type {'cli'|'script'} + * @description Called via CLI (`cli`) or Programmatically (`script`) + * @default "script" + */ + this.source = options.source || "script"; + + /** + * @type {string} + * @description One of build, serve, or watch + * @default "build" + */ + this.runMode = options.runMode || "build"; + + /** + * @type {boolean} + * @description Is Eleventy running in dry mode? + * @default false + */ + this.isDryRun = options.dryRun ?? false; + + /** + * @type {boolean} + * @description Is this an incremental build? (only operates on a subset of input files) + * @default false + */ + this.isIncremental = false; + + /** + * @type {string|undefined} + * @description If an incremental build, this is the file we’re operating on. + * @default null + */ + this.programmaticApiIncrementalFile = undefined; + + /** + * @type {boolean} + * @description Should we process files on first run? (The --ignore-initial feature) + * @default true + */ + this.isRunInitialBuild = true; + + /** + * @type {Number} + * @description Number of builds run on this instance. + * @default 0 + */ + this.buildCount = 0; + + /** + * @member {String} - Force ESM or CJS mode instead of detecting from package.json. Either cjs, esm, or auto. + * @default "auto" + */ + this.loader = this.options.loader ?? "auto"; + + /** + * @type {Number} + * @description The timestamp of Eleventy start. + */ + this.start = this.getNewTimestamp(); + } + + /** + * @type {string|undefined} + * @description An override of Eleventy's default config file paths + * @default undefined + */ + get configPath() { + return this.options.configPath; + } + + /** + * @type {string} + * @description The top level directory the site pretends to reside in + * @default "/" + */ + get pathPrefix() { + return this.options.pathPrefix || "/"; + } + + async initializeConfig(initOverrides) { + if (!this.eleventyConfig) { + this.eleventyConfig = new TemplateConfig(null, this.configPath); + } else if (this.configPath) { + await this.eleventyConfig.setProjectConfigPath(this.configPath); + } + + this.eleventyConfig.setRunMode(this.runMode); + this.eleventyConfig.setProjectUsingEsm(this.isEsm); + this.eleventyConfig.setLogger(this.logger); + this.eleventyConfig.setDirectories(this.directories); + this.eleventyConfig.setTemplateFormats(this.templateFormats); + + if (this.pathPrefix || this.pathPrefix === "") { + this.eleventyConfig.setPathPrefix(this.pathPrefix); + } + + // Debug mode should always run quiet (all output goes to debug logger) + if (process.env.DEBUG) { + this.#verboseOverride = false; + } else if (this.options.quietMode === true || this.options.quietMode === false) { + this.#verboseOverride = !this.options.quietMode; + } + + // Moved before config merges: https://github.com/11ty/eleventy/issues/3316 + if (this.#verboseOverride === true || this.#verboseOverride === false) { + this.eleventyConfig.userConfig._setQuietModeOverride(!this.#verboseOverride); + } + + this.eleventyConfig.userConfig.directories = this.directories; + + /* Programmatic API config */ + if (this.options.config && typeof this.options.config === "function") { + debug("Running options.config configuration callback (passed to Eleventy constructor)"); + // TODO use return object here? + await this.options.config(this.eleventyConfig.userConfig); + } + + /** + * @type {object} + * @description Initialize Eleventy environment variables + * @default null + */ + // this.runMode need to be set before this + this.env = this.getEnvironmentVariableValues(); + this.initializeEnvironmentVariables(this.env); + + // Async initialization of configuration + await this.eleventyConfig.init(initOverrides); + + /** + * @type {object} + * @description Initialize Eleventy’s configuration, including the user config file + */ + this.config = this.eleventyConfig.getConfig(); + + /** + * @type {object} + * @description Singleton BenchmarkManager instance + */ + this.bench = this.config.benchmarkManager; + + if (performance) { + debug("Eleventy warm up time: %o (ms)", performance.now()); + } + + // Careful to make sure the previous server closes on SIGINT, issue #3873 + if (!this.eleventyServe) { + /** @type {object} */ + this.eleventyServe = new EleventyServe(); + } + this.eleventyServe.eleventyConfig = this.eleventyConfig; + + /** @type {object} */ + this.watchManager = new EleventyWatch(); + + /** @type {object} */ + this.watchTargets = new EleventyWatchTargets(this.eleventyConfig); + this.watchTargets.addAndMakeGlob(this.config.additionalWatchTargets); + + /** @type {object} */ + this.fileSystemSearch = new FileSystemSearch(); + + this.#hasConfigInitialized = true; + + // after #hasConfigInitialized above + this.setIsVerbose(this.#preInitVerbose ?? !this.config.quietMode); + } + + getNewTimestamp() { + if (performance) { + return performance.now(); + } + return new Date().getTime(); + } + + /** @type {ProjectDirectories} */ + get directories() { + if (!this.#directories) { + this.#directories = new ProjectDirectories(); + this.#directories.setInput(this.rawInput, this.options.inputDir); + this.#directories.setOutput(this.rawOutput); + + if (this.source == "cli" && (this.rawInput !== undefined || this.rawOutput !== undefined)) { + this.#directories.freeze(); + } + } + + return this.#directories; + } + + /** @type {string} */ + get input() { + return this.directories.inputFile || this.directories.input || this.config.dir.input; + } + + /** @type {string} */ + get inputFile() { + return this.directories.inputFile; + } + + /** @type {string} */ + get inputDir() { + return this.directories.input; + } + + // Not used internally, removed in 3.0. + setInputDir() { + throw new Error( + "Eleventy->setInputDir was removed in 3.0. Use the inputDir option to the constructor", + ); + } + + /** @type {string} */ + get outputDir() { + return this.directories.output || this.config.dir.output; + } + + /** + * Updates the dry-run mode of Eleventy. + * + * @param {boolean} isDryRun - Shall Eleventy run in dry mode? + */ + setDryRun(isDryRun) { + this.isDryRun = !!isDryRun; + } + + /** + * Sets the incremental build mode. + * + * @param {boolean} isIncremental - Shall Eleventy run in incremental build mode and only write the files that trigger watch updates + */ + setIncrementalBuild(isIncremental) { + this.isIncremental = !!isIncremental; + + if (this.watchManager) { + this.watchManager.incremental = !!isIncremental; + } + if (this.writer) { + this.writer.setIncrementalBuild(this.isIncremental); + } + } + + /** + * Set whether or not to do an initial build + * + * @param {boolean} ignoreInitialBuild - Shall Eleventy ignore the default initial build before watching in watch/serve mode? + * @default true + */ + setIgnoreInitial(ignoreInitialBuild) { + this.isRunInitialBuild = !ignoreInitialBuild; + + if (this.writer) { + this.writer.setRunInitialBuild(this.isRunInitialBuild); + } + } + + /** + * Updates the path prefix used in the config. + * + * @param {string} pathPrefix - The new path prefix. + */ + setPathPrefix(pathPrefix) { + if (pathPrefix || pathPrefix === "") { + this.eleventyConfig.setPathPrefix(pathPrefix); + // TODO reset config + // this.config = this.eleventyConfig.getConfig(); + } + } + + /** + * Restarts Eleventy. + */ + async restart() { + debug("Restarting."); + this.start = this.getNewTimestamp(); + + this.extensionMap.reset(); + this.bench.reset(); + this.passthroughManager.reset(); + this.eleventyFiles.restart(); + } + + /** + * Logs some statistics after a complete run of Eleventy. + * + * @returns {string} ret - The log message. + */ + logFinished() { + if (!this.writer) { + throw new Error( + "Did you call Eleventy.init to create the TemplateWriter instance? Hint: you probably didn’t.", + ); + } + + let ret = []; + + let { + copyCount, + copySize, + skipCount, + writeCount, + // renderCount, // files that render (costly) but may not write to disk + } = this.writer.getMetadata(); + + let slashRet = []; + + if (copyCount) { + debug("Total passthrough copy aggregate size: %o", filesize(copySize)); + slashRet.push(`Copied ${chalk.bold(copyCount)}`); + } + + slashRet.push( + `Wrote ${chalk.bold(writeCount)} ${simplePlural(writeCount, "file", "files")}${ + skipCount ? ` (skipped ${skipCount})` : "" + }`, + ); + + // slashRet.push( + // `${renderCount} rendered` + // ) + + if (slashRet.length) { + ret.push(slashRet.join(" ")); + } + + let time = (this.getNewTimestamp() - this.start) / 1000; + ret.push( + `in ${chalk.bold(time.toFixed(2))} ${simplePlural(time.toFixed(2), "second", "seconds")}`, + ); + + // More than 1 second total, show estimate of per-template time + if (time >= 1 && writeCount > 1) { + ret.push(`(${((time * 1000) / writeCount).toFixed(1)}ms each, v${pkg.version})`); + } else { + ret.push(`(v${pkg.version})`); + } + + return ret.join(" "); + } + + #cache(key, inst) { + if (!("caches" in inst)) { + throw new Error("To use #cache you need a `caches` getter object"); + } + + // Restore from cache + if (this.#privateCaches.has(key)) { + let c = this.#privateCaches.get(key); + for (let cacheKey in c) { + inst[cacheKey] = c[cacheKey]; + } + } else { + // Set cache + let c = {}; + for (let cacheKey of inst.caches || []) { + c[cacheKey] = inst[cacheKey]; + } + this.#privateCaches.set(key, c); + } + } + + /** + * Starts Eleventy. + */ + async init(options = {}) { + let { viaConfigReset } = Object.assign({ viaConfigReset: false }, options); + if (!this.#hasConfigInitialized) { + await this.initializeConfig(); + } else { + // Note: Global event bus is different from user config event bus + this.config.events.reset(); + } + + await this.config.events.emit("eleventy.config", this.eleventyConfig); + + if (this.env) { + await this.config.events.emit("eleventy.env", this.env); + } + + let formats = this.templateFormats.getTemplateFormats(); + let engineManager = new TemplateEngineManager(this.eleventyConfig); + this.extensionMap = new EleventyExtensionMap(this.eleventyConfig); + this.extensionMap.setFormats(formats); + this.extensionMap.engineManager = engineManager; + await this.config.events.emit("eleventy.extensionmap", this.extensionMap); + + // eleventyServe is always available, even when not in --serve mode + // TODO directorynorm + this.eleventyServe.setOutputDir(this.outputDir); + + // TODO + // this.eleventyServe.setWatcherOptions(this.getChokidarConfig()); + + this.templateData = new TemplateData(this.eleventyConfig); + this.templateData.setProjectUsingEsm(this.isEsm); + this.templateData.extensionMap = this.extensionMap; + if (this.env) { + this.templateData.environmentVariables = this.env; + } + this.templateData.setFileSystemSearch(this.fileSystemSearch); + + this.passthroughManager = new TemplatePassthroughManager(this.eleventyConfig); + this.passthroughManager.setRunMode(this.runMode); + this.passthroughManager.setDryRun(this.isDryRun); + this.passthroughManager.extensionMap = this.extensionMap; + this.passthroughManager.setFileSystemSearch(this.fileSystemSearch); + + this.eleventyFiles = new EleventyFiles(formats, this.eleventyConfig); + this.eleventyFiles.setPassthroughManager(this.passthroughManager); + this.eleventyFiles.setFileSystemSearch(this.fileSystemSearch); + this.eleventyFiles.setRunMode(this.runMode); + this.eleventyFiles.extensionMap = this.extensionMap; + // This needs to be set before init or it’ll construct a new one + this.eleventyFiles.templateData = this.templateData; + this.eleventyFiles.init(); + + if (checkPassthroughCopyBehavior(this.config, this.runMode)) { + this.eleventyServe.watchPassthroughCopy( + this.eleventyFiles.getGlobWatcherFilesForPassthroughCopy(), + ); + } + + // Note these directories are all project root relative + this.config.events.emit("eleventy.directories", this.directories.getUserspaceInstance()); + + this.writer = new TemplateWriter(formats, this.templateData, this.eleventyConfig); + + if (!viaConfigReset) { + // set or restore cache + this.#cache("TemplateWriter", this.writer); + } + + this.writer.logger = this.logger; + this.writer.extensionMap = this.extensionMap; + this.writer.setEleventyFiles(this.eleventyFiles); + this.writer.setPassthroughManager(this.passthroughManager); + this.writer.setRunInitialBuild(this.isRunInitialBuild); + this.writer.setIncrementalBuild(this.isIncremental); + + let debugStr = `Directories: + Input: + Directory: ${this.directories.input} + File: ${this.directories.inputFile || false} + Glob: ${this.directories.inputGlob || false} + Data: ${this.directories.data} + Includes: ${this.directories.includes} + Layouts: ${this.directories.layouts || false} + Output: ${this.directories.output} +Template Formats: ${formats.join(",")} +Verbose Output: ${this.verboseMode}`; + debug(debugStr); + + this.writer.setVerboseOutput(this.verboseMode); + this.writer.setDryRun(this.isDryRun); + + this.#needsInit = false; + } + + // These are all set as initial global data under eleventy.env.* (see TemplateData->environmentVariables) + getEnvironmentVariableValues() { + let values = { + source: this.source, + runMode: this.runMode, + }; + + let configPath = this.eleventyConfig.getLocalProjectConfigFile(); + if (configPath) { + values.config = TemplatePath.absolutePath(configPath); + } + + // Fixed: instead of configuration directory, explicit root or working directory + values.root = TemplatePath.getWorkingDir(); + + values.source = this.source; + + // Backwards compatibility + Object.defineProperty(values, "isServerless", { + enumerable: false, + value: false, + }); + + return values; + } + + /** + * Set process.ENV variables for use in Eleventy projects + * + * @method + */ + initializeEnvironmentVariables(env) { + // Recognize that global data `eleventy.version` is coerced to remove prerelease tags + // and this is the raw version (3.0.0 versus 3.0.0-alpha.6). + // `eleventy.env.version` does not yet exist (unnecessary) + process.env.ELEVENTY_VERSION = Eleventy.getVersion(); + + process.env.ELEVENTY_ROOT = env.root; + debug("Setting process.env.ELEVENTY_ROOT: %o", env.root); + + process.env.ELEVENTY_SOURCE = env.source; + process.env.ELEVENTY_RUN_MODE = env.runMode; + } + + /** @param {boolean} value */ + set verboseMode(value) { + this.setIsVerbose(value); + } + + /** @type {boolean} */ + get verboseMode() { + return this.#isVerboseMode; + } + + /** @type {ConsoleLogger} */ + get logger() { + if (!this.#logger) { + this.#logger = new ConsoleLogger(); + this.#logger.isVerbose = this.verboseMode; + } + + return this.#logger; + } + + /** @param {ConsoleLogger} logger */ + set logger(logger) { + this.eleventyConfig.setLogger(logger); + this.#logger = logger; + } + + disableLogger() { + this.logger.overrideLogger(false); + } + + /** @type {EleventyErrorHandler} */ + get errorHandler() { + if (!this.#errorHandler) { + this.#errorHandler = new EleventyErrorHandler(); + this.#errorHandler.isVerbose = this.verboseMode; + this.#errorHandler.logger = this.logger; + } + + return this.#errorHandler; + } + + /** + * Updates the verbose mode of Eleventy. + * + * @method + * @param {boolean} isVerbose - Shall Eleventy run in verbose mode? + */ + setIsVerbose(isVerbose) { + if (!this.#hasConfigInitialized) { + this.#preInitVerbose = !!isVerbose; + return; + } + + // always defer to --quiet if override happened + isVerbose = this.#verboseOverride ?? !!isVerbose; + + this.#isVerboseMode = isVerbose; + + if (this.logger) { + this.logger.isVerbose = isVerbose; + } + + this.bench.setVerboseOutput(isVerbose); + + if (this.writer) { + this.writer.setVerboseOutput(isVerbose); + } + + if (this.errorHandler) { + this.errorHandler.isVerbose = isVerbose; + } + + // Set verbose mode in config file + this.eleventyConfig.verbose = isVerbose; + } + + get templateFormats() { + if (!this.#templateFormats) { + let tf = new ProjectTemplateFormats(); + this.#templateFormats = tf; + } + + return this.#templateFormats; + } + + /** + * Updates the template formats of Eleventy. + * + * @method + * @param {string} formats - The new template formats. + */ + setFormats(formats) { + this.templateFormats.setViaCommandLine(formats); + } + + /** + * Updates the run mode of Eleventy. + * + * @method + * @param {string} runMode - One of "build", "watch", or "serve" + */ + setRunMode(runMode) { + this.runMode = runMode; + } + + /** + * Set the file that needs to be rendered/compiled/written for an incremental build. + * This method is also wired up to the CLI --incremental=incrementalFile + * + * @method + * @param {string} incrementalFile - File path (added or modified in a project) + */ + setIncrementalFile(incrementalFile) { + if (incrementalFile) { + // This used to also setIgnoreInitial(true) but was changed in 3.0.0-alpha.14 + this.setIncrementalBuild(true); + + this.programmaticApiIncrementalFile = TemplatePath.addLeadingDotSlash(incrementalFile); + + this.eleventyConfig.setPreviousBuildModifiedFile(incrementalFile); + } + } + + unsetIncrementalFile() { + // only applies to initial build, no re-runs (--watch/--serve) + if (this.programmaticApiIncrementalFile) { + // this.setIgnoreInitial(false); + this.programmaticApiIncrementalFile = undefined; + } + + // reset back to false + this.setIgnoreInitial(false); + } + + /** + * Reads the version of Eleventy. + * + * @static + * @returns {string} - The version of Eleventy. + */ + static getVersion() { + return pkg.version; + } + + /** + * @deprecated since 1.0.1, use static Eleventy.getVersion() + */ + getVersion() { + return Eleventy.getVersion(); + } + + /** + * Shows a help message including usage. + * + * @static + * @returns {string} - The help message. + */ + static getHelp() { + return `Usage: eleventy + eleventy --input=. --output=./_site + eleventy --serve + +Arguments: + + --version + + --input=. + Input template files (default: \`.\`) + + --output=_site + Write HTML output to this folder (default: \`_site\`) + + --serve + Run web server on --port (default 8080) and watch them too + + --port + Run the --serve web server on this port (default 8080) + + --watch + Wait for files to change and automatically rewrite (no web server) + + --incremental + Only build the files that have changed. Best with watch/serve. + + --incremental=filename.md + Does not require watch/serve. Run an incremental build targeting a single file. + + --ignore-initial + Start without a build; build when files change. Works best with watch/serve/incremental. + + --formats=liquid,md + Allow only certain template types (default: \`*\`) + + --quiet + Don’t print all written files (off by default) + + --config=filename.js + Override the eleventy config file path (default: \`.eleventy.js\`) + + --pathprefix='/' + Change all url template filters to use this subdirectory. + + --dryrun + Don’t write any files. Useful in DEBUG mode, for example: \`DEBUG=Eleventy* npx @11ty/eleventy --dryrun\` + + --loader + Set to "esm" to force ESM mode, "cjs" to force CommonJS mode, or "auto" (default) to infer it from package.json. + + --to=json + --to=ndjson + Change the output to JSON or NDJSON (default: \`fs\`) + + --help`; + } + + /** + * @deprecated since 1.0.1, use static Eleventy.getHelp() + */ + getHelp() { + return Eleventy.getHelp(); + } + + /** + * Resets the config of Eleventy. + * + * @method + */ + resetConfig() { + delete this.eleventyConfig; + + // ensures `initializeConfig()` will run when `init()` is called next + this.#hasConfigInitialized = false; + } + + /** + * @param {string} changedFilePath - File that triggered a re-run (added or modified) + * @param {boolean} [isResetConfig] - are we doing a config reset + */ + async #addFileToWatchQueue(changedFilePath, isResetConfig) { + // Currently this is only for 11ty.js deps but should be extended with usesGraph + let usedByDependants = []; + if (this.watchTargets) { + usedByDependants = this.watchTargets.getDependantsOf( + TemplatePath.addLeadingDotSlash(changedFilePath), + ); + } + + let relevantLayouts = this.eleventyConfig.usesGraph.getLayoutsUsedBy(changedFilePath); + + // `eleventy.templateModified` is no longer used internally, remove in a future major version. + eventBus.emit("eleventy.templateModified", changedFilePath, { + usedByDependants, + relevantLayouts, + }); + + // These listeners are *global*, not cleared even on config reset + eventBus.emit("eleventy.resourceModified", changedFilePath, usedByDependants, { + viaConfigReset: isResetConfig, + relevantLayouts, + }); + + this.config.events.emit("eleventy#templateModified", changedFilePath); + + this.watchManager.addToPendingQueue(changedFilePath); + } + + shouldTriggerConfigReset(changedFiles) { + let configFilePaths = new Set(this.eleventyConfig.getLocalProjectConfigFiles()); + let resetConfigGlobs = EleventyWatchTargets.normalizeToGlobs( + Array.from(this.eleventyConfig.userConfig.watchTargetsConfigReset), + ); + for (let filePath of changedFiles) { + if (configFilePaths.has(filePath)) { + return true; + } + if (isGlobMatch(filePath, resetConfigGlobs)) { + return true; + } + } + + for (const configFilePath of configFilePaths) { + // Any dependencies of the config file changed + let configFileDependencies = new Set(this.watchTargets.getDependenciesOf(configFilePath)); + + for (let filePath of changedFiles) { + if (configFileDependencies.has(filePath)) { + return true; + } + } + } + + return false; + } + + // Checks the build queue to see if any configuration related files have changed + #shouldResetConfig(activeQueue = []) { + if (!activeQueue.length) { + return false; + } + + return this.shouldTriggerConfigReset( + activeQueue.map((path) => { + return PathNormalizer.normalizeSeperator(TemplatePath.addLeadingDotSlash(path)); + }), + ); + } + + async #watch(isResetConfig = false) { + if (this.watchManager.isBuildRunning()) { + return; + } + + this.watchManager.setBuildRunning(); + + let queue = this.watchManager.getActiveQueue(); + + await this.config.events.emit("beforeWatch", queue); + await this.config.events.emit("eleventy.beforeWatch", queue); + + // Clear `import` cache for all files that triggered the rebuild (sync event) + this.watchTargets.clearImportCacheFor(queue); + + // reset and reload global configuration + if (isResetConfig) { + // important: run this before config resets otherwise the handlers will disappear. + await this.config.events.emit("eleventy.reset"); + this.resetConfig(); + } + + await this.restart(); + await this.init({ viaConfigReset: isResetConfig }); + + try { + let [passthroughCopyResults, templateResults] = await this.write(); + + this.watchTargets.reset(); + + await this.#initWatchDependencies(); + + // Add new deps to chokidar + this.watcher.add(this.watchTargets.getNewTargetsSinceLastReset()); + + // Is a CSS input file and is not in the includes folder + // TODO check output path file extension of this template (not input path) + // TODO add additional API for this, maybe a config callback? + let onlyCssChanges = this.watchManager.hasAllQueueFiles((path) => { + return ( + path.endsWith(".css") && + // TODO how to make this work with relative includes? + !TemplatePath.startsWithSubPath(path, this.eleventyFiles.getIncludesDir()) + ); + }); + + let files = this.watchManager.getActiveQueue(); + + // Maps passthrough copy files to output URLs for CSS live reload + let stylesheetUrls = new Set(); + for (let entry of passthroughCopyResults) { + for (let filepath in entry.map) { + if ( + filepath.endsWith(".css") && + files.includes(TemplatePath.addLeadingDotSlash(filepath)) + ) { + stylesheetUrls.add( + "/" + TemplatePath.stripLeadingSubPath(entry.map[filepath], this.outputDir), + ); + } + } + } + + let normalizedPathPrefix = PathPrefixer.normalizePathPrefix(this.config.pathPrefix); + let matchingTemplates = templateResults + .flat() + .filter((entry) => Boolean(entry)) + .map((entry) => { + // only `url`, `inputPath`, and `content` are used: https://github.com/11ty/eleventy-dev-server/blob/1c658605f75224fdc76f68aebe7a412eeb4f1bc9/client/reload-client.js#L140 + entry.url = PathPrefixer.joinUrlParts(normalizedPathPrefix, entry.url); + delete entry.rawInput; // Issue #3481 + return entry; + }); + + await this.eleventyServe.reload({ + files, + subtype: onlyCssChanges ? "css" : undefined, + build: { + stylesheets: Array.from(stylesheetUrls), + templates: matchingTemplates, + }, + }); + } catch (error) { + this.eleventyServe.sendError({ + error, + }); + } + + this.watchManager.setBuildFinished(); + + let queueSize = this.watchManager.getPendingQueueSize(); + if (queueSize > 0) { + this.logger.log( + `You saved while Eleventy was running, let’s run again. (${queueSize} change${ + queueSize !== 1 ? "s" : "" + })`, + ); + await this.#watch(); + } else { + this.logger.log("Watching…"); + } + } + + /** + * @returns {module:11ty/eleventy/src/Benchmark/BenchmarkGroup~BenchmarkGroup} + */ + get watcherBench() { + return this.bench.get("Watcher"); + } + + /** + * Set up watchers and benchmarks. + * + * @async + * @method + */ + async initWatch() { + this.watchManager = new EleventyWatch(); + this.watchManager.incremental = this.isIncremental; + + if (this.projectPackageJsonPath) { + this.watchTargets.add([ + path.relative(TemplatePath.getWorkingDir(), this.projectPackageJsonPath), + ]); + } + this.watchTargets.add(this.eleventyFiles.getGlobWatcherFiles()); + this.watchTargets.add(this.eleventyFiles.getIgnoreFiles()); + + // Watch the local project config file + this.watchTargets.add(this.eleventyConfig.getLocalProjectConfigFiles()); + + // Template and Directory Data Files + this.watchTargets.add(await this.eleventyFiles.getGlobWatcherTemplateDataFiles()); + + let benchmark = this.watcherBench.get( + "Watching JavaScript Dependencies (disable with `eleventyConfig.setWatchJavaScriptDependencies(false)`)", + ); + benchmark.before(); + await this.#initWatchDependencies(); + benchmark.after(); + } + + // fetch from project’s package.json + get projectPackageJsonPath() { + if (this.#projectPackageJsonPath === undefined) { + this.#projectPackageJsonPath = getWorkingProjectPackageJsonPath() || false; + } + return this.#projectPackageJsonPath; + } + + get projectPackageJson() { + if (!this.#projectPackageJson) { + let p = this.projectPackageJsonPath; + this.#projectPackageJson = p ? importJsonSync(p) : {}; + } + return this.#projectPackageJson; + } + + get isEsm() { + if (this.#isEsm !== undefined) { + return this.#isEsm; + } + if (this.loader == "esm") { + this.#isEsm = true; + } else if (this.loader == "cjs") { + this.#isEsm = false; + } else if (this.loader == "auto") { + this.#isEsm = this.projectPackageJson?.type === "module"; + } else { + throw new Error("The 'loader' option must be one of 'esm', 'cjs', or 'auto'"); + } + return this.#isEsm; + } + + /** + * Starts watching dependencies. + */ + async #initWatchDependencies() { + if (!this.eleventyConfig.shouldSpiderJavaScriptDependencies()) { + return; + } + + // TODO use DirContains + let dataDir = TemplatePath.stripLeadingDotSlash(this.templateData.getDataDir()); + function filterOutGlobalDataFiles(path) { + return !dataDir || !TemplatePath.stripLeadingDotSlash(path).startsWith(dataDir); + } + + // Lazy resolve isEsm only for --watch + this.watchTargets.setProjectUsingEsm(this.isEsm); + + // Template files .11ty.js + let templateFiles = await this.eleventyFiles.getWatchPathCache(); + await this.watchTargets.addDependencies(templateFiles); + + // Config file dependencies + await this.watchTargets.addDependencies( + this.eleventyConfig.getLocalProjectConfigFiles(), + filterOutGlobalDataFiles, + ); + + // Deps from Global Data (that aren’t in the global data directory, everything is watched there) + let globalDataDeps = this.templateData.getWatchPathCache(); + await this.watchTargets.addDependencies(globalDataDeps, filterOutGlobalDataFiles); + + await this.watchTargets.addDependencies( + await this.eleventyFiles.getWatcherTemplateJavaScriptDataFiles(), + ); + } + + /** + * Returns all watched files. + * + * @async + * @method + * @returns {Promise} targets - The watched files. + */ + async getWatchedFiles() { + return this.watchTargets.getTargets(); + } + + getChokidarConfig() { + let ignores = this.eleventyFiles.getGlobWatcherIgnores(); + debug("Ignoring watcher changes to: %o", ignores); + + let configOptions = this.config.chokidarConfig; + + // can’t override these yet + // TODO maybe if array, merge the array? + delete configOptions.ignored; + + return Object.assign( + { + ignored: ignores, + ignoreInitial: true, + awaitWriteFinish: { + stabilityThreshold: 150, + pollInterval: 25, + }, + }, + configOptions, + ); + } + + /** + * Start the watching of files + * + * @async + * @method + */ + async watch() { + this.watcherBench.setMinimumThresholdMs(500); + this.watcherBench.reset(); + + // We use a string module name and try/catch here to hide this from the zisi and esbuild serverless bundlers + let chokidar; + // eslint-disable-next-line no-useless-catch + try { + let moduleName = "chokidar"; + let chokidarImport = await import(moduleName); + chokidar = chokidarImport.default; + } catch (e) { + throw e; + } + + // Note that watching indirectly depends on this for fetching dependencies from JS files + // See: TemplateWriter:pathCache and EleventyWatchTargets + await this.write(); + + let initWatchBench = this.watcherBench.get("Start up --watch"); + initWatchBench.before(); + + await this.initWatch(); + + // TODO improve unwatching if JS dependencies are removed (or files are deleted) + let rawFiles = await this.getWatchedFiles(); + debug("Watching for changes to: %o", rawFiles); + + let options = this.getChokidarConfig(); + + // Remap all paths to `cwd` if in play (Issue #3854) + let remapper = new FileSystemRemap(rawFiles); + let cwd = remapper.getCwd(); + + if (cwd) { + options.cwd = cwd; + + rawFiles = remapper.getInput().map((entry) => { + return TemplatePath.stripLeadingDotSlash(entry); + }); + + options.ignored = remapper.getRemapped(options.ignored || []).map((entry) => { + return TemplatePath.stripLeadingDotSlash(entry); + }); + } + + let watcher = chokidar.watch(rawFiles, options); + + initWatchBench.after(); + + this.watcherBench.finish("Watch"); + + this.logger.forceLog("Watching…"); + + this.watcher = watcher; + + let watchDelay; + let watchRun = async (path) => { + path = TemplatePath.normalize(path); + try { + let isResetConfig = this.#shouldResetConfig([path]); + this.#addFileToWatchQueue(path, isResetConfig); + + clearTimeout(watchDelay); + + let { promise, resolve, reject } = withResolvers(); + + watchDelay = setTimeout(async () => { + this.#watch(isResetConfig).then(resolve, reject); + }, this.config.watchThrottleWaitTime); + + await promise; + } catch (e) { + if (e instanceof EleventyBaseError) { + this.errorHandler.error(e, "Eleventy watch error"); + this.watchManager.setBuildFinished(); + } else { + this.errorHandler.fatal(e, "Eleventy fatal watch error"); + await this.stopWatch(); + } + } + + this.config.events.emit("eleventy.afterwatch"); + }; + + watcher.on("change", async (path) => { + // Emulated passthrough copy logs from the server + if (!this.eleventyServe.isEmulatedPassthroughCopyMatch(path)) { + this.logger.forceLog(`File changed: ${TemplatePath.standardizeFilePath(path)}`); + } + + await watchRun(path); + }); + + watcher.on("add", async (path) => { + // Emulated passthrough copy logs from the server + if (!this.eleventyServe.isEmulatedPassthroughCopyMatch(path)) { + this.logger.forceLog(`File added: ${TemplatePath.standardizeFilePath(path)}`); + } + + this.fileSystemSearch.add(path); + await watchRun(path); + }); + + watcher.on("unlink", (path) => { + this.logger.forceLog(`File deleted: ${TemplatePath.standardizeFilePath(path)}`); + this.fileSystemSearch.delete(path); + }); + + // wait for chokidar to be ready. + await new Promise((resolve) => { + watcher.on("ready", () => resolve()); + }); + + // Returns for testability + return watchRun; + } + + async stopWatch() { + // Prevent multiple invocations. + if (this.#isStopping) { + return this.#isStopping; + } + + debug("Cleaning up chokidar and server instances, if they exist."); + this.#isStopping = Promise.all([this.eleventyServe.close(), this.watcher?.close()]).then(() => { + this.#isStopping = false; + }); + + return this.#isStopping; + } + + /** + * Serve Eleventy on this port. + * + * @param {Number} port - The HTTP port to serve Eleventy from. + */ + async serve(port) { + // Port is optional and in this case likely via --port on the command line + // May defer to configuration API options `port` property + return this.eleventyServe.serve(port); + } + + /** + * Writes templates to the file system. + * + * @async + * @method + * @returns {Promise<{Array}>} + */ + async write() { + return this.executeBuild("fs"); + } + + /** + * Renders templates to a JSON object. + * + * @async + * @method + * @returns {Promise<{Array}>} + */ + async toJSON() { + return this.executeBuild("json"); + } + + /** + * Returns a stream of new line delimited (NDJSON) objects + * + * @async + * @method + * @returns {Promise<{ReadableStream}>} + */ + async toNDJSON() { + return this.executeBuild("ndjson"); + } + + /** + * tbd. + * + * @async + * @method + * @returns {Promise<{Array,ReadableStream}>} ret - tbd. + */ + async executeBuild(to = "fs") { + if (this.#needsInit) { + if (!this.#initPromise) { + this.#initPromise = this.init(); + } + await this.#initPromise.then(() => { + // #needsInit also set to false at the end of `init()` + this.#needsInit = false; + this.#initPromise = undefined; + }); + } + + if (!this.writer) { + throw new Error( + "Internal error: Eleventy didn’t run init() properly and wasn’t able to create a TemplateWriter.", + ); + } + + let incrementalFile = + this.programmaticApiIncrementalFile || this.watchManager?.getIncrementalFile(); + if (incrementalFile) { + this.writer.setIncrementalFile(incrementalFile); + } + + let returnObj; + let hasError = false; + + try { + let directories = this.directories.getUserspaceInstance(); + let eventsArg = { + directories, + + // v3.0.0-alpha.6, changed to use `directories` instead (this was only used by serverless plugin) + inputDir: directories.input, + + // Deprecated (not normalized) use `directories` instead. + dir: this.config.dir, + + runMode: this.runMode, + outputMode: to, + incremental: this.isIncremental, + }; + + await this.config.events.emit("beforeBuild", eventsArg); + await this.config.events.emit("eleventy.before", eventsArg); + + let promise; + if (to === "fs") { + promise = this.writer.write(); + } else if (to === "json") { + promise = this.writer.getJSON("json"); + } else if (to === "ndjson") { + promise = this.writer.getJSON("ndjson"); + } else { + throw new Error( + `Invalid argument for \`Eleventy->executeBuild(${to})\`, expected "json", "ndjson", or "fs".`, + ); + } + + let resolved = await promise; + + // Passing the processed output to the eleventy.after event (2.0+) + eventsArg.results = resolved.templates; + + if (to === "ndjson") { + // return a stream + // TODO this outputs all ndjson rows after all the templates have been written to the stream + returnObj = this.logger.closeStream(); + } else if (to === "json") { + // Backwards compat + returnObj = resolved.templates; + } else { + // Backwards compat + returnObj = [resolved.passthroughCopy, resolved.templates]; + } + + this.unsetIncrementalFile(); + this.writer.resetIncrementalFile(); + + eventsArg.uses = this.eleventyConfig.usesGraph.map; + await this.config.events.emit("afterBuild", eventsArg); + await this.config.events.emit("eleventy.after", eventsArg); + + this.buildCount++; + } catch (error) { + hasError = true; + + // Issue #2405: Don’t change the exitCode for programmatic scripts + let errorSeverity = this.source === "script" ? "error" : "fatal"; + this.errorHandler.once(errorSeverity, error, "Problem writing Eleventy templates"); + + // TODO ndjson should stream the error but https://github.com/11ty/eleventy/issues/3382 + throw error; + } finally { + this.bench.finish(); + + if (to === "fs") { + this.logger.logWithOptions({ + message: this.logFinished(), + color: hasError ? "red" : "green", + force: true, + }); + } + + debug("Finished."); + + debug(` +Have a suggestion/feature request/feedback? Feeling frustrated? I want to hear it! +Open an issue: https://github.com/11ty/eleventy/issues/new`); + } + + return returnObj; + } +} + +export default Eleventy; + +// extend for exporting to CJS +Object.assign(RenderPlugin, RenderPluginExtras); +Object.assign(I18nPlugin, I18nPluginExtras); +Object.assign(HtmlBasePlugin, HtmlBasePluginExtras); + +// Removed plugins + +const EleventyServerlessBundlerPlugin = function () { + throw new Error( + "Following feedback from our Community Survey, low interest in this plugin prompted its removal from Eleventy core in 3.0 as we refocus on static sites. Learn more: https://v3.11ty.dev/docs/plugins/serverless/", + ); +}; + +const EleventyEdgePlugin = function () { + throw new Error( + "Following feedback from our Community Survey, low interest in this plugin prompted its removal from Eleventy core in 3.0 as we refocus on static sites. Learn more: https://v3.11ty.dev/docs/plugins/edge/", + ); +}; + +export { + Eleventy, + EleventyImport as ImportFile, + + // Error messages for removed plugins + EleventyServerlessBundlerPlugin as EleventyServerless, + EleventyServerlessBundlerPlugin, + EleventyEdgePlugin, + + /** + * @type {module:11ty/eleventy/Plugins/RenderPlugin} + */ + RenderPlugin as EleventyRenderPlugin, // legacy name + /** + * @type {module:11ty/eleventy/Plugins/RenderPlugin} + */ + RenderPlugin, + + /** + * @type {module:11ty/eleventy/Plugins/I18nPlugin} + */ + I18nPlugin as EleventyI18nPlugin, // legacy name + /** + * @type {module:11ty/eleventy/Plugins/I18nPlugin} + */ + I18nPlugin, + + /** + * @type {module:11ty/eleventy/Plugins/HtmlBasePlugin} + */ + HtmlBasePlugin as EleventyHtmlBasePlugin, // legacy name + /** + * @type {module:11ty/eleventy/Plugins/HtmlBasePlugin} + */ + HtmlBasePlugin, + + /** + * @type {module:11ty/eleventy/Plugins/InputPathToUrlTransformPlugin} + */ + InputPathToUrlTransformPlugin, + + /** + * @type {module:11ty/eleventy-plugin-bundle} + */ + BundlePlugin, + + /** + * @type {module:11ty/eleventy/Plugins/IdAttributePlugin} + */ + IdAttributePlugin, +}; diff --git a/node_modules/@11ty/eleventy/src/EleventyCommonJs.cjs b/node_modules/@11ty/eleventy/src/EleventyCommonJs.cjs new file mode 100644 index 0000000..5227265 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/EleventyCommonJs.cjs @@ -0,0 +1,43 @@ +function canRequireModules() { + // via --experimental-require-module or newer than Node 22 support when this flag is no longer necessary + try { + require("./Util/Objects/SampleModule.mjs"); + return true; + } catch(e) { + if(e.code === "ERR_REQUIRE_ESM") { + return false; + } + + // Rethrow if not an ESM require error. + throw e; + } +} + +if(!canRequireModules()) { + let error = new Error(`\`require("@11ty/eleventy")\` is incompatible with Eleventy v3 and this version of Node. You have a few options: + 1. (Easiest) Change the \`require\` to use a dynamic import inside of an asynchronous CommonJS configuration + callback, for example: + + module.exports = async function { + const {EleventyRenderPlugin, EleventyI18nPlugin, EleventyHtmlBasePlugin} = await import("@11ty/eleventy"); + } + + 2. (Easier) Update the JavaScript syntax in your configuration file from CommonJS to ESM (change \`require\` + to use \`import\` and rename the file to have an \`.mjs\` file extension). + + 3. (More work) Change your project to use ESM-first by adding \`"type": "module"\` to your package.json. Any + \`.js\` will need to be ported to use ESM syntax (or renamed to \`.cjs\`.) + + 4. Upgrade your Node version (at time of writing, v22.12 or newer) to enable this behavior. If you use a version + of Node older than v22.12, try the --experimental-require-module command line flag in Node. Read more: + https://nodejs.org/api/modules.html#loading-ecmascript-modules-using-require`); + + error.skipOriginalStack = true; + + throw error; +} + +// If we made it here require(ESM) works fine (via --experimental-require-module or newer Node.js defaults) +let mod = require("./Eleventy.js"); + +module.exports = mod; diff --git a/node_modules/@11ty/eleventy/src/EleventyExtensionMap.js b/node_modules/@11ty/eleventy/src/EleventyExtensionMap.js new file mode 100644 index 0000000..8f42640 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/EleventyExtensionMap.js @@ -0,0 +1,284 @@ +import { TemplatePath } from "@11ty/eleventy-utils"; + +class EleventyExtensionMap { + #engineManager; + + constructor(config) { + this.setTemplateConfig(config); + this._spiderJsDepsCache = {}; + + /** @type {Array} */ + this.validTemplateLanguageKeys; + } + + setFormats(formatKeys = []) { + // raw + this.formatKeys = formatKeys; + + this.unfilteredFormatKeys = formatKeys.map(function (key) { + return key.trim().toLowerCase(); + }); + + this.validTemplateLanguageKeys = this.unfilteredFormatKeys.filter((key) => + this.hasExtension(key), + ); + + this.passthroughCopyKeys = this.unfilteredFormatKeys.filter((key) => !this.hasExtension(key)); + } + + setTemplateConfig(config) { + if (!config || config.constructor.name !== "TemplateConfig") { + throw new Error("Internal error: Missing or invalid `config` argument."); + } + + this.templateConfig = config; + } + + get config() { + return this.templateConfig.getConfig(); + } + + get engineManager() { + if (!this.#engineManager) { + throw new Error("Internal error: Missing `#engineManager` in EleventyExtensionMap."); + } + + return this.#engineManager; + } + + set engineManager(mgr) { + this.#engineManager = mgr; + } + + reset() { + this.#engineManager.reset(); + } + + /* Used for layout path resolution */ + getFileList(path, dir) { + if (!path) { + return []; + } + + let files = []; + this.validTemplateLanguageKeys.forEach((key) => { + this.getExtensionsFromKey(key).forEach(function (extension) { + files.push((dir ? dir + "/" : "") + path + "." + extension); + }); + }); + + return files; + } + + // Warning: this would false positive on an include, but is only used + // on paths found from the file system glob search. + // TODO: Method name might just need to be renamed to something more accurate. + isFullTemplateFilePath(path) { + for (let extension of this.validTemplateLanguageKeys) { + if (path.endsWith(`.${extension}`)) { + return true; + } + } + return false; + } + + getCustomExtensionEntry(extension) { + if (!this.config.extensionMap) { + return; + } + + for (let entry of this.config.extensionMap) { + if (entry.extension === extension) { + return entry; + } + } + } + + getValidExtensionsForPath(path) { + let extensions = new Set(); + for (let extension in this.extensionToKeyMap) { + if (path.endsWith(`.${extension}`)) { + extensions.add(extension); + } + } + + // if multiple extensions are valid, sort from longest to shortest + // e.g. .11ty.js and .js + let sorted = Array.from(extensions) + .filter((extension) => this.validTemplateLanguageKeys.includes(extension)) + .sort((a, b) => b.length - a.length); + + return sorted; + } + + async shouldSpiderJavaScriptDependencies(path) { + let extensions = this.getValidExtensionsForPath(path); + for (let extension of extensions) { + if (extension in this._spiderJsDepsCache) { + return this._spiderJsDepsCache[extension]; + } + + let cls = await this.engineManager.getEngineClassByExtension(extension); + if (cls) { + let entry = this.getCustomExtensionEntry(extension); + let shouldSpider = cls.shouldSpiderJavaScriptDependencies(entry); + this._spiderJsDepsCache[extension] = shouldSpider; + return shouldSpider; + } + } + + return false; + } + + getPassthroughCopyGlobs(inputDir) { + return this._getGlobs(this.passthroughCopyKeys, inputDir); + } + + getValidGlobs(inputDir) { + return this._getGlobs(this.validTemplateLanguageKeys, inputDir); + } + + getGlobs(inputDir) { + return this._getGlobs(this.unfilteredFormatKeys, inputDir); + } + + _getGlobs(formatKeys, inputDir = "") { + let extensions = new Set(); + + for (let key of formatKeys) { + if (this.hasExtension(key)) { + for (let extension of this.getExtensionsFromKey(key)) { + extensions.add(extension); + } + } else { + extensions.add(key); + } + } + + let dir = TemplatePath.convertToRecursiveGlobSync(inputDir); + if (extensions.size === 1) { + return [`${dir}/*.${Array.from(extensions)[0]}`]; + } else if (extensions.size > 1) { + return [ + // extra curly brackets /*.{cjs,txt} + `${dir}/*.{${Array.from(extensions).join(",")}}`, + ]; + } + + return []; + } + + hasExtension(key) { + for (let extension in this.extensionToKeyMap) { + if ( + this.extensionToKeyMap[extension].key === key || + this.extensionToKeyMap[extension].aliasKey === key + ) { + return true; + } + } + + return false; + } + + getExtensionsFromKey(key) { + let extensions = new Set(); + for (let extension in this.extensionToKeyMap) { + if (this.extensionToKeyMap[extension].aliasKey) { + // only add aliased extension if explicitly referenced in formats + // overrides will not have an aliasKey (md => md) + if (this.extensionToKeyMap[extension].aliasKey === key) { + extensions.add(extension); + } + } else if (this.extensionToKeyMap[extension].key === key) { + extensions.add(extension); + } + } + + return Array.from(extensions); + } + + // Only `addExtension` configuration API extensions + getExtensionEntriesFromKey(key) { + let entries = new Set(); + if ("extensionMap" in this.config) { + for (let entry of this.config.extensionMap) { + if (entry.key === key) { + entries.add(entry); + } + } + } + return Array.from(entries); + } + + // Determines whether a path is a passthrough copy file or a template (via TemplateWriter) + hasEngine(pathOrKey) { + return !!this.getKey(pathOrKey); + } + + getKey(pathOrKey) { + pathOrKey = (pathOrKey || "").toLowerCase(); + for (let extension in this.extensionToKeyMap) { + if (pathOrKey === extension || pathOrKey.endsWith("." + extension)) { + let key = + this.extensionToKeyMap[extension].aliasKey || this.extensionToKeyMap[extension].key; + // must be a valid format key passed (e.g. via --formats) + if (this.validTemplateLanguageKeys.includes(key)) { + return key; + } + } + } + } + + getExtensionEntry(pathOrKey) { + pathOrKey = (pathOrKey || "").toLowerCase(); + for (let extension in this.extensionToKeyMap) { + if (pathOrKey === extension || pathOrKey.endsWith("." + extension)) { + return this.extensionToKeyMap[extension]; + } + } + } + + removeTemplateExtension(path) { + for (let extension in this.extensionToKeyMap) { + if (path === extension || path.endsWith("." + extension)) { + return path.slice( + 0, + path.length - 1 - extension.length < 0 ? 0 : path.length - 1 - extension.length, + ); + } + } + return path; + } + + // keys are file extensions + // values are template language keys + get extensionToKeyMap() { + if (!this._extensionToKeyMap) { + this._extensionToKeyMap = { + md: { key: "md", extension: "md" }, + html: { key: "html", extension: "html" }, + njk: { key: "njk", extension: "njk" }, + liquid: { key: "liquid", extension: "liquid" }, + "11ty.js": { key: "11ty.js", extension: "11ty.js" }, + "11ty.cjs": { key: "11ty.js", extension: "11ty.cjs" }, + "11ty.mjs": { key: "11ty.js", extension: "11ty.mjs" }, + }; + + if ("extensionMap" in this.config) { + for (let entry of this.config.extensionMap) { + // extension and key are only different when aliasing. + this._extensionToKeyMap[entry.extension] = entry; + } + } + } + + return this._extensionToKeyMap; + } + + getReadableFileExtensions() { + return Object.keys(this.extensionToKeyMap).join(" "); + } +} + +export default EleventyExtensionMap; diff --git a/node_modules/@11ty/eleventy/src/EleventyFiles.js b/node_modules/@11ty/eleventy/src/EleventyFiles.js new file mode 100644 index 0000000..7ec6379 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/EleventyFiles.js @@ -0,0 +1,521 @@ +import fs from "node:fs"; + +import { TemplatePath, isPlainObject } from "@11ty/eleventy-utils"; +import debugUtil from "debug"; + +import DirContains from "./Util/DirContains.js"; +import TemplateData from "./Data/TemplateData.js"; +import TemplateGlob from "./TemplateGlob.js"; +import checkPassthroughCopyBehavior from "./Util/PassthroughCopyBehaviorCheck.js"; + +const debug = debugUtil("Eleventy:EleventyFiles"); + +class EleventyFiles { + #extensionMap; + #watcherGlobs; + + constructor(formats, templateConfig) { + if (!templateConfig) { + throw new Error("Internal error: Missing `templateConfig`` argument."); + } + + this.templateConfig = templateConfig; + this.config = templateConfig.getConfig(); + this.aggregateBench = this.config.benchmarkManager.get("Aggregate"); + + this.formats = formats; + this.eleventyIgnoreContent = false; + } + + get dirs() { + return this.templateConfig.directories; + } + + get inputDir() { + return this.dirs.input; + } + + get outputDir() { + return this.dirs.output; + } + + get includesDir() { + return this.dirs.includes; + } + + get layoutsDir() { + return this.dirs.layouts; + } + + get dataDir() { + return this.dirs.data; + } + + // Backwards compat + getDataDir() { + return this.dataDir; + } + + setFileSystemSearch(fileSystemSearch) { + this.fileSystemSearch = fileSystemSearch; + } + + init() { + if (this.dirs.inputFile || this.dirs.inputGlob) { + this.templateGlobs = TemplateGlob.map([this.dirs.inputFile || this.dirs.inputGlob]); + } else { + // Input is a directory + this.templateGlobs = this.extensionMap.getGlobs(this.inputDir); + } + + this.setupGlobs(); + } + + #getWatcherGlobs() { + if (!this.#watcherGlobs) { + let globs; + // Input is a file + if (this.inputFile) { + globs = this.templateGlobs; + } else { + // input is a directory + globs = this.extensionMap.getValidGlobs(this.inputDir); + } + this.#watcherGlobs = globs; + } + + return this.#watcherGlobs; + } + + get passthroughGlobs() { + let paths = new Set(); + // stuff added in addPassthroughCopy() + for (let path of this.passthroughManager.getConfigPathGlobs()) { + paths.add(path); + } + // non-template language extensions + for (let path of this.extensionMap.getPassthroughCopyGlobs(this.inputDir)) { + paths.add(path); + } + return Array.from(paths); + } + + restart() { + this.setupGlobs(); + this._glob = null; + } + + /* For testing */ + _setConfig(config) { + if (!config.ignores) { + config.ignores = new Set(); + config.ignores.add("**/node_modules/**"); + } + + this.config = config; + + this.init(); + } + + /* Set command root for local project paths */ + // This is only used by tests + _setLocalPathRoot(dir) { + this.localPathRoot = dir; + } + + set extensionMap(extensionMap) { + this.#extensionMap = extensionMap; + } + + get extensionMap() { + // for tests + if (!this.#extensionMap) { + throw new Error("Internal error: missing `extensionMap` in EleventyFiles."); + } + return this.#extensionMap; + } + + setRunMode(runMode) { + this.runMode = runMode; + } + + setPassthroughManager(mgr) { + this.passthroughManager = mgr; + } + + set templateData(templateData) { + this._templateData = templateData; + } + + get templateData() { + if (!this._templateData) { + this._templateData = new TemplateData(this.templateConfig); + } + + return this._templateData; + } + + setupGlobs() { + this.fileIgnores = this.getIgnores(); + this.extraIgnores = this.getIncludesAndDataDirs(); + this.uniqueIgnores = this.getIgnoreGlobs(); + + // Conditional added for tests that don’t have a config + if (this.config?.events) { + this.config.events.emit("eleventy.ignores", this.uniqueIgnores); + } + + this.normalizedTemplateGlobs = this.templateGlobs; + } + + normalizeIgnoreEntry(entry) { + if (!entry.startsWith("**/")) { + return TemplateGlob.normalizePath(this.localPathRoot || ".", entry); + } + return entry; + } + + getIgnoreGlobs() { + let uniqueIgnores = new Set(); + for (let ignore of this.fileIgnores) { + uniqueIgnores.add(ignore); + } + for (let ignore of this.extraIgnores) { + uniqueIgnores.add(ignore); + } + + // Placing the config ignores last here is important to the tests + for (let ignore of this.config.ignores) { + uniqueIgnores.add(this.normalizeIgnoreEntry(ignore)); + } + + return Array.from(uniqueIgnores); + } + + static getFileIgnores(ignoreFiles) { + if (!Array.isArray(ignoreFiles)) { + ignoreFiles = [ignoreFiles]; + } + + let ignores = []; + for (let ignorePath of ignoreFiles) { + ignorePath = TemplatePath.normalize(ignorePath); + + let dir = TemplatePath.getDirFromFilePath(ignorePath); + + if (fs.existsSync(ignorePath) && fs.statSync(ignorePath).size > 0) { + let ignoreContent = fs.readFileSync(ignorePath, "utf8"); + + ignores = ignores.concat(EleventyFiles.normalizeIgnoreContent(dir, ignoreContent)); + } + } + + ignores.forEach((path) => debug(`${ignoreFiles} ignoring: ${path}`)); + + return ignores; + } + + static normalizeIgnoreContent(dir, ignoreContent) { + let ignores = []; + + if (ignoreContent) { + ignores = ignoreContent + .split("\n") + .map((line) => { + return line.trim(); + }) + .filter((line) => { + if (line.charAt(0) === "!") { + debug( + ">>> When processing .gitignore/.eleventyignore, Eleventy does not currently support negative patterns but encountered one:", + ); + debug(">>>", line); + debug("Follow along at https://github.com/11ty/eleventy/issues/693 to track support."); + } + + // empty lines or comments get filtered out + return line.length > 0 && line.charAt(0) !== "#" && line.charAt(0) !== "!"; + }) + .map((line) => { + let path = TemplateGlob.normalizePath(dir, "/", line); + path = TemplatePath.addLeadingDotSlash(TemplatePath.relativePath(path)); + + try { + // Note these folders must exist to get /** suffix + let stat = fs.statSync(path); + if (stat.isDirectory()) { + return path + "/**"; + } + return path; + } catch (e) { + return path; + } + }); + } + + return ignores; + } + + /* Tests only */ + _setEleventyIgnoreContent(content) { + this.eleventyIgnoreContent = content; + } + + getIgnores() { + let files = new Set(); + + for (let ignore of EleventyFiles.getFileIgnores(this.getIgnoreFiles())) { + files.add(ignore); + } + + // testing API + if (this.eleventyIgnoreContent !== false) { + files.add(this.eleventyIgnoreContent); + } + + // Make sure output dir isn’t in the input dir (or it will ignore all input!) + // input: . and output: . (skip ignore) + // input: ./content and output . (skip ignore) + // input: . and output: ./_site (add ignore) + let outputContainsInputDir = DirContains(this.outputDir, this.inputDir); + if (!outputContainsInputDir) { + // both are already normalized in 3.0 + files.add(TemplateGlob.map(this.outputDir + "/**")); + } + + return Array.from(files); + } + + getIgnoreFiles() { + let ignoreFiles = new Set(); + let rootDirectory = this.localPathRoot || "."; + + if (this.config.useGitIgnore) { + ignoreFiles.add(TemplatePath.join(rootDirectory, ".gitignore")); + } + + if (this.eleventyIgnoreContent === false) { + let absoluteInputDir = TemplatePath.absolutePath(this.inputDir); + ignoreFiles.add(TemplatePath.join(rootDirectory, ".eleventyignore")); + + if (rootDirectory !== absoluteInputDir) { + ignoreFiles.add(TemplatePath.join(this.inputDir, ".eleventyignore")); + } + } + + return Array.from(ignoreFiles); + } + + /* Backwards compat */ + getIncludesDir() { + return this.includesDir; + } + + /* Backwards compat */ + getLayoutsDir() { + return this.layoutsDir; + } + + getFileGlobs() { + return this.normalizedTemplateGlobs; + } + + getRawFiles() { + return this.templateGlobs; + } + + async getWatchPathCache() { + // Issue #1325: make sure passthrough copy files are not included here + if (!this.pathCache) { + throw new Error("Watching requires `.getFiles()` to be called first in EleventyFiles"); + } + + let ret = []; + // Filter out the passthrough copy paths. + for (let path of this.pathCache) { + if ( + this.extensionMap.isFullTemplateFilePath(path) && + (await this.extensionMap.shouldSpiderJavaScriptDependencies(path)) + ) { + ret.push(path); + } + } + return ret; + } + + _globSearch() { + let globs = this.getFileGlobs(); + + // returns a promise + debug("Searching for: %o", globs); + return this.fileSystemSearch.search("templates", globs, { + ignore: this.uniqueIgnores, + }); + } + + getPathsWithVirtualTemplates(paths) { + // Support for virtual templates added in 3.0 + if (this.config.virtualTemplates && isPlainObject(this.config.virtualTemplates)) { + let virtualTemplates = Object.keys(this.config.virtualTemplates) + .filter((path) => { + // Filter out includes/layouts + return this.dirs.isTemplateFile(path); + }) + .map((path) => { + let fullVirtualPath = this.dirs.getInputPath(path); + if (!this.extensionMap.getKey(fullVirtualPath)) { + this.templateConfig.logger.warn( + `The virtual template at ${fullVirtualPath} is using a template format that’s not valid for your project. Your project is using: "${this.formats}". Read more about formats: https://v3.11ty.dev/docs/config/#template-formats`, + ); + } + return fullVirtualPath; + }); + + paths = paths.concat(virtualTemplates); + + // Virtual templates can not live at the same place as files on the file system! + if (paths.length !== new Set(paths).size) { + let conflicts = {}; + for (let path of paths) { + if (conflicts[path]) { + throw new Error( + `A virtual template had the same path as a file on the file system: "${path}"`, + ); + } + + conflicts[path] = true; + } + } + } + + return paths; + } + + async getFiles() { + let bench = this.aggregateBench.get("Searching the file system (templates)"); + bench.before(); + let globResults = await this._globSearch(); + let paths = TemplatePath.addLeadingDotSlashArray(globResults); + bench.after(); + + // Note 2.0.0-canary.19 removed a `filter` option for custom template syntax here that was unpublished and unused. + + paths = this.getPathsWithVirtualTemplates(paths); + + this.pathCache = paths; + return paths; + } + + getFileShape(paths, filePath) { + if (!filePath) { + return; + } + if (this.isPassthroughCopyFile(paths, filePath)) { + return "copy"; + } + if (this.isFullTemplateFile(paths, filePath)) { + return "template"; + } + // include/layout/unknown + } + + isPassthroughCopyFile(paths, filePath) { + return this.passthroughManager.isPassthroughCopyFile(paths, filePath); + } + + // Assumption here that filePath is not a passthrough copy file + isFullTemplateFile(paths, filePath) { + if (!filePath) { + return false; + } + + for (let path of paths) { + if (path === filePath) { + return true; + } + } + + return false; + } + + /* For `eleventy --watch` */ + getGlobWatcherFiles() { + // TODO improvement: tie the includes and data to specific file extensions (currently using `**`) + let directoryGlobs = this.getIncludesAndDataDirs(); + + let globs = this.#getWatcherGlobs(); + + if (checkPassthroughCopyBehavior(this.config, this.runMode)) { + return globs.concat(directoryGlobs); + } + + // Revert to old passthroughcopy copy files behavior + return globs.concat(this.passthroughGlobs).concat(directoryGlobs); + } + + /* For `eleventy --watch` */ + getGlobWatcherFilesForPassthroughCopy() { + return this.passthroughGlobs; + } + + /* For `eleventy --watch` */ + async getGlobWatcherTemplateDataFiles() { + let templateData = this.templateData; + return await templateData.getTemplateDataFileGlob(); + } + + /* For `eleventy --watch` */ + // TODO this isn’t great but reduces complexity avoiding using TemplateData:getLocalDataPaths for each template in the cache + async getWatcherTemplateJavaScriptDataFiles() { + let globs = this.templateData.getTemplateJavaScriptDataFileGlob(); + let bench = this.aggregateBench.get("Searching the file system (watching)"); + bench.before(); + let results = TemplatePath.addLeadingDotSlashArray( + await this.fileSystemSearch.search("js-dependencies", globs, { + ignore: [ + "**/node_modules/**", + ".git/**", + // TODO outputDir + // this.outputDir, + ], + }), + ); + bench.after(); + return results; + } + + /* Ignored by `eleventy --watch` */ + getGlobWatcherIgnores() { + // convert to format without ! since they are passed in as a separate argument to glob watcher + let entries = new Set( + this.fileIgnores.map((ignore) => TemplatePath.stripLeadingDotSlash(ignore)), + ); + + for (let ignore of this.config.watchIgnores) { + entries.add(this.normalizeIgnoreEntry(ignore)); + } + + // de-duplicated + return Array.from(entries); + } + + getIncludesAndDataDirs() { + let rawPaths = new Set(); + rawPaths.add(this.includesDir); + if (this.layoutsDir) { + rawPaths.add(this.layoutsDir); + } + rawPaths.add(this.dataDir); + + return Array.from(rawPaths) + .filter((entry) => { + // never ignore the input directory (even if config file returns "" for these) + return entry && entry !== this.inputDir; + }) + .map((entry) => { + return TemplateGlob.map(entry + "**"); + }); + } +} + +export default EleventyFiles; diff --git a/node_modules/@11ty/eleventy/src/EleventyServe.js b/node_modules/@11ty/eleventy/src/EleventyServe.js new file mode 100644 index 0000000..65525ef --- /dev/null +++ b/node_modules/@11ty/eleventy/src/EleventyServe.js @@ -0,0 +1,321 @@ +import assert from "node:assert"; + +import debugUtil from "debug"; +import { Merge, DeepCopy, TemplatePath } from "@11ty/eleventy-utils"; + +import EleventyBaseError from "./Errors/EleventyBaseError.js"; +import ConsoleLogger from "./Util/ConsoleLogger.js"; +import PathPrefixer from "./Util/PathPrefixer.js"; +import checkPassthroughCopyBehavior from "./Util/PassthroughCopyBehaviorCheck.js"; +import { getModulePackageJson } from "./Util/ImportJsonSync.js"; +import { EleventyImport } from "./Util/Require.js"; +import { isGlobMatch } from "./Util/GlobMatcher.js"; + +const debug = debugUtil("Eleventy:EleventyServe"); + +class EleventyServeConfigError extends EleventyBaseError {} + +const DEFAULT_SERVER_OPTIONS = { + module: "@11ty/eleventy-dev-server", + port: 8080, + // pathPrefix: "/", + // setup: function() {}, + // ready: function(server) {}, + // logger: { info: function() {}, error: function() {} } +}; + +class EleventyServe { + #eleventyConfig; + + constructor() { + this.logger = new ConsoleLogger(); + this._initOptionsFetched = false; + this._aliases = undefined; + this._watchedFiles = new Set(); + } + + get config() { + if (!this.eleventyConfig) { + throw new EleventyServeConfigError( + "You need to set the eleventyConfig property on EleventyServe.", + ); + } + + return this.eleventyConfig.getConfig(); + } + + set config(config) { + throw new Error("It’s not allowed to set config on EleventyServe. Set eleventyConfig instead."); + } + + setAliases(aliases) { + this._aliases = aliases; + + if (this._server && "setAliases" in this._server) { + this._server.setAliases(aliases); + } + } + + get eleventyConfig() { + if (!this.#eleventyConfig) { + throw new EleventyServeConfigError( + "You need to set the eleventyConfig property on EleventyServe.", + ); + } + + return this.#eleventyConfig; + } + + set eleventyConfig(config) { + this.#eleventyConfig = config; + + if (checkPassthroughCopyBehavior(this.#eleventyConfig.userConfig, "serve")) { + this.#eleventyConfig.userConfig.events.on("eleventy.passthrough", ({ map }) => { + // for-free passthrough copy + this.setAliases(map); + }); + } + } + + // TODO directorynorm + setOutputDir(outputDir) { + // TODO check if this is different and if so, restart server (if already running) + // This applies if you change the output directory in your config file during watch/serve + this.outputDir = outputDir; + } + + async getServerModule(name) { + try { + if (!name || name === DEFAULT_SERVER_OPTIONS.module) { + return import("@11ty/eleventy-dev-server").then((i) => i.default); + } + + // Look for peer dep in local project + let projectNodeModulesPath = TemplatePath.absolutePath("./node_modules/"); + let serverPath = TemplatePath.absolutePath(projectNodeModulesPath, name); + // No references outside of the project node_modules are allowed + if (!serverPath.startsWith(projectNodeModulesPath)) { + throw new Error("Invalid node_modules name for Eleventy server instance, received:" + name); + } + + let serverPackageJson = getModulePackageJson(serverPath); + // Normalize with `main` entry from + if (TemplatePath.isDirectorySync(serverPath)) { + if (serverPackageJson.main) { + serverPath = TemplatePath.absolutePath( + projectNodeModulesPath, + name, + serverPackageJson.main, + ); + } else { + throw new Error( + `Eleventy server ${name} is missing a \`main\` entry in its package.json file. Traversed up from ${serverPath}.`, + ); + } + } + + let module = await EleventyImport(serverPath); + + if (!("getServer" in module)) { + throw new Error( + `Eleventy server module requires a \`getServer\` static method. Could not find one on module: \`${name}\``, + ); + } + + if (serverPackageJson["11ty"]?.compatibility) { + try { + this.eleventyConfig.userConfig.versionCheck(serverPackageJson["11ty"].compatibility); + } catch (e) { + this.logger.warn(`Warning: \`${name}\` Plugin Compatibility: ${e.message}`); + } + } + + return module; + } catch (e) { + this.logger.error( + "There was an error with your custom Eleventy server. We’re using the default server instead.\n" + + e.message, + ); + debug("Eleventy server error %o", e); + return import("@11ty/eleventy-dev-server").then((i) => i.default); + } + } + + get options() { + if (this._options) { + return this._options; + } + + this._options = Object.assign( + { + pathPrefix: PathPrefixer.normalizePathPrefix(this.config.pathPrefix), + logger: this.logger, + }, + DEFAULT_SERVER_OPTIONS, + this.config.serverOptions, + ); + + this._savedConfigOptions = DeepCopy({}, this.config.serverOptions); + + if (!this._initOptionsFetched && this.getSetupCallback()) { + throw new Error( + "Init options have not yet been fetched in the setup callback. This probably means that `init()` has not yet been called.", + ); + } + + return this._options; + } + + get server() { + if (!this._server) { + throw new Error("Missing server instance. Did you call .initServerInstance?"); + } + + return this._server; + } + + async initServerInstance() { + if (this._server) { + return; + } + + let serverModule = await this.getServerModule(this.options.module); + + // Static method `getServer` was already checked in `getServerModule` + this._server = serverModule.getServer("eleventy-server", this.outputDir, this.options); + + this.setAliases(this._aliases); + + if (this._globsNeedWatching) { + this._server.watchFiles(this._watchedFiles); + this._globsNeedWatching = false; + } + } + + getSetupCallback() { + let setupCallback = this.config.serverOptions.setup; + if (setupCallback && typeof setupCallback === "function") { + return setupCallback; + } + } + + async #init() { + let setupCallback = this.getSetupCallback(); + if (setupCallback) { + let opts = await setupCallback(); + this._initOptionsFetched = true; + + if (opts) { + Merge(this.options, opts); + } + } + } + + async init() { + if (!this._initPromise) { + this._initPromise = this.#init(); + } + + return this._initPromise; + } + + // Port comes in here from --port on the command line + async serve(port) { + this._commandLinePort = port; + + await this.init(); + await this.initServerInstance(); + + this.server.serve(port || this.options.port); + + if (typeof this.config.serverOptions?.ready === "function") { + if (typeof this.server.ready === "function") { + // Dev Server 2.0.7+ + // wait for ready promise to resolve before triggering ready callback + await this.server.ready(); + await this.config.serverOptions?.ready(this.server); + } else { + throw new Error( + "The `ready` option in Eleventy’s `setServerOptions` method requires a `ready` function on the Dev Server instance. If you’re using Eleventy Dev Server, you will need Dev Server 2.0.7+ or newer to use this feature.", + ); + } + } + } + + async close() { + if (this._server) { + await this._server.close(); + + this._server = undefined; + } + } + + async sendError({ error }) { + if (this._server) { + await this.server.sendError({ + error, + }); + } + } + + // Restart the server entirely + // We don’t want to use a native `restart` method (e.g. restart() in Vite) so that + // we can correctly handle a `module` property change (changing the server type) + async restart() { + // Blow away cached options + delete this._options; + + await this.close(); + + // saved --port in `serve()` + await this.serve(this._commandLinePort); + + // rewatch the saved watched files (passthrough copy) + if ("watchFiles" in this.server) { + this.server.watchFiles(this._watchedFiles); + } + } + + // checkPassthroughCopyBehavior check is called upstream in Eleventy.js + // TODO globs are not removed from watcher + watchPassthroughCopy(globs) { + this._watchedFiles = globs; + + if (this._server && "watchFiles" in this.server) { + this.server.watchFiles(globs); + this._globsNeedWatching = false; + } else { + this._globsNeedWatching = true; + } + } + + isEmulatedPassthroughCopyMatch(filepath) { + return isGlobMatch(filepath, this._watchedFiles); + } + + hasOptionsChanged() { + try { + assert.deepStrictEqual(this.config.serverOptions, this._savedConfigOptions); + return false; + } catch (e) { + return true; + } + } + + // Live reload the server + async reload(reloadEvent = {}) { + if (!this._server) { + return; + } + + // Restart the server if the options have changed + if (this.hasOptionsChanged()) { + debug("Server options changed, we’re restarting the server"); + await this.restart(); + } else { + await this.server.reload(reloadEvent); + } + } +} + +export default EleventyServe; diff --git a/node_modules/@11ty/eleventy/src/EleventyWatch.js b/node_modules/@11ty/eleventy/src/EleventyWatch.js new file mode 100755 index 0000000..22dffbe --- /dev/null +++ b/node_modules/@11ty/eleventy/src/EleventyWatch.js @@ -0,0 +1,131 @@ +import { TemplatePath } from "@11ty/eleventy-utils"; + +import PathNormalizer from "./Util/PathNormalizer.js"; + +/* Decides when to watch and in what mode to watch + * Incremental builds don’t batch changes, they queue. + * Nonincremental builds batch. + */ + +class EleventyWatch { + constructor() { + this.incremental = false; + this.isActive = false; + this.activeQueue = []; + } + + isBuildRunning() { + return this.isActive; + } + + setBuildRunning() { + this.isActive = true; + + // pop waiting queue into the active queue + this.activeQueue = this.popNextActiveQueue(); + } + + setBuildFinished() { + this.isActive = false; + this.activeQueue = []; + } + + getIncrementalFile() { + if (this.incremental) { + return this.activeQueue.length ? this.activeQueue[0] : false; + } + + return false; + } + + /* Returns the changed files currently being operated on in the current `watch` build + * Works with or without incremental (though in incremental only one file per time will be processed) + */ + getActiveQueue() { + if (!this.isActive) { + return []; + } else if (this.incremental && this.activeQueue.length === 0) { + return []; + } else if (this.incremental) { + return [this.activeQueue[0]]; + } + + return this.activeQueue; + } + + _queueMatches(file) { + let filterCallback; + if (typeof file === "function") { + filterCallback = file; + } else { + filterCallback = (path) => path === file; + } + + return this.activeQueue.filter(filterCallback); + } + + hasAllQueueFiles(file) { + return ( + this.activeQueue.length > 0 && this.activeQueue.length === this._queueMatches(file).length + ); + } + + hasQueuedFile(file) { + if (file) { + return this._queueMatches(file).length > 0; + } + return false; + } + + hasQueuedFiles(files) { + for (const file of files) { + if (this.hasQueuedFile(file)) { + return true; + } + } + return false; + } + + get pendingQueue() { + if (!this._queue) { + this._queue = []; + } + return this._queue; + } + + set pendingQueue(value) { + this._queue = value; + } + + addToPendingQueue(path) { + if (path) { + path = PathNormalizer.normalizeSeperator(TemplatePath.addLeadingDotSlash(path)); + this.pendingQueue.push(path); + } + } + + getPendingQueueSize() { + return this.pendingQueue.length; + } + + getPendingQueue() { + return this.pendingQueue; + } + + getActiveQueueSize() { + return this.activeQueue.length; + } + + // returns array + popNextActiveQueue() { + if (this.incremental) { + return this.pendingQueue.length ? [this.pendingQueue.shift()] : []; + } + + let ret = this.pendingQueue.slice(); + this.pendingQueue = []; + return ret; + } +} + +export default EleventyWatch; diff --git a/node_modules/@11ty/eleventy/src/EleventyWatchTargets.js b/node_modules/@11ty/eleventy/src/EleventyWatchTargets.js new file mode 100644 index 0000000..aec2036 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/EleventyWatchTargets.js @@ -0,0 +1,164 @@ +import { TemplatePath } from "@11ty/eleventy-utils"; +import { DepGraph } from "dependency-graph"; + +import JavaScriptDependencies from "./Util/JavaScriptDependencies.js"; +import eventBus from "./EventBus.js"; + +class EleventyWatchTargets { + #templateConfig; + + constructor(templateConfig) { + this.targets = new Set(); + this.dependencies = new Set(); + this.newTargets = new Set(); + this.isEsm = false; + + this.graph = new DepGraph(); + this.#templateConfig = templateConfig; + } + + setProjectUsingEsm(isEsmProject) { + this.isEsm = !!isEsmProject; + } + + isJavaScriptDependency(path) { + return this.dependencies.has(path); + } + + reset() { + this.newTargets = new Set(); + } + + isWatched(target) { + return this.targets.has(target); + } + + addToDependencyGraph(parent, deps) { + if (!this.graph.hasNode(parent)) { + this.graph.addNode(parent); + } + for (let dep of deps) { + if (!this.graph.hasNode(dep)) { + this.graph.addNode(dep); + } + this.graph.addDependency(parent, dep); + } + } + + uses(parent, dep) { + return this.getDependenciesOf(parent).includes(dep); + } + + getDependenciesOf(parent) { + if (!this.graph.hasNode(parent)) { + return []; + } + return this.graph.dependenciesOf(parent); + } + + getDependantsOf(child) { + if (!this.graph.hasNode(child)) { + return []; + } + return this.graph.dependantsOf(child); + } + + addRaw(targets, isDependency) { + for (let target of targets) { + let path = TemplatePath.addLeadingDotSlash(target); + if (!this.isWatched(path)) { + this.newTargets.add(path); + } + + this.targets.add(path); + + if (isDependency) { + this.dependencies.add(path); + } + } + } + + static normalize(targets) { + if (!targets) { + return []; + } else if (Array.isArray(targets)) { + return targets; + } + + return [targets]; + } + + // add only a target + add(targets) { + this.addRaw(EleventyWatchTargets.normalize(targets)); + } + + static normalizeToGlobs(targets) { + return EleventyWatchTargets.normalize(targets).map((entry) => + TemplatePath.convertToRecursiveGlobSync(entry), + ); + } + + addAndMakeGlob(targets) { + this.addRaw(EleventyWatchTargets.normalizeToGlobs(targets)); + } + + // add only a target’s dependencies + async addDependencies(targets, filterCallback) { + if (this.#templateConfig && !this.#templateConfig.shouldSpiderJavaScriptDependencies()) { + return; + } + + targets = EleventyWatchTargets.normalize(targets); + let deps = await JavaScriptDependencies.getDependencies(targets, this.isEsm); + if (filterCallback) { + deps = deps.filter(filterCallback); + } + + for (let target of targets) { + this.addToDependencyGraph(target, deps); + } + this.addRaw(deps, true); + } + + setWriter(templateWriter) { + this.writer = templateWriter; + } + + clearImportCacheFor(filePathArray) { + let paths = new Set(); + for (const filePath of filePathArray) { + paths.add(filePath); + + // Delete from require cache so that updates to the module are re-required + let importsTheChangedFile = this.getDependantsOf(filePath); + for (let dep of importsTheChangedFile) { + paths.add(dep); + } + + let isImportedInTheChangedFile = this.getDependenciesOf(filePath); + for (let dep of isImportedInTheChangedFile) { + paths.add(dep); + } + + // Use GlobalDependencyMap + if (this.#templateConfig) { + for (let dep of this.#templateConfig.usesGraph.getDependantsFor(filePath)) { + paths.add(dep); + } + } + } + + eventBus.emit("eleventy.importCacheReset", paths); + } + + getNewTargetsSinceLastReset() { + return Array.from(this.newTargets); + } + + getTargets() { + return Array.from(this.targets); + } +} + +export default EleventyWatchTargets; diff --git a/node_modules/@11ty/eleventy/src/Engines/Custom.js b/node_modules/@11ty/eleventy/src/Engines/Custom.js new file mode 100644 index 0000000..17a0da1 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Engines/Custom.js @@ -0,0 +1,339 @@ +import TemplateEngine from "./TemplateEngine.js"; +import getJavaScriptData from "../Util/GetJavaScriptData.js"; + +export default class CustomEngine extends TemplateEngine { + constructor(name, eleventyConfig) { + super(name, eleventyConfig); + + this.entry = this.getExtensionMapEntry(); + this.needsInit = "init" in this.entry && typeof this.entry.init === "function"; + + this.setDefaultEngine(undefined); + } + + getExtensionMapEntry() { + if ("extensionMap" in this.config) { + let name = this.name.toLowerCase(); + // Iterates over only the user config `addExtension` entries + for (let entry of this.config.extensionMap) { + let entryKey = (entry.aliasKey || entry.key || "").toLowerCase(); + if (entryKey === name) { + return entry; + } + } + } + + throw Error( + `Could not find a custom extension for ${this.name}. Did you add it to your config file?`, + ); + } + + setDefaultEngine(defaultEngine) { + this._defaultEngine = defaultEngine; + } + + get cacheable() { + // Enable cacheability for this template + if (this.entry?.compileOptions?.cache !== undefined) { + return this.entry.compileOptions.cache; + } else if (this.needsToReadFileContents()) { + return true; + } else if (this._defaultEngine?.cacheable !== undefined) { + return this._defaultEngine.cacheable; + } + + return super.cacheable; + } + + async getInstanceFromInputPath(inputPath) { + if ( + "getInstanceFromInputPath" in this.entry && + typeof this.entry.getInstanceFromInputPath === "function" + ) { + // returns Promise + return this.entry.getInstanceFromInputPath(inputPath); + } + + // aliased upstream type + if ( + this._defaultEngine && + "getInstanceFromInputPath" in this._defaultEngine && + typeof this._defaultEngine.getInstanceFromInputPath === "function" + ) { + // returns Promise + return this._defaultEngine.getInstanceFromInputPath(inputPath); + } + + return false; + } + + /** + * Whether to use the module loader directly + * + * @override + */ + useJavaScriptImport() { + if ("useJavaScriptImport" in this.entry) { + return this.entry.useJavaScriptImport; + } + + if ( + this._defaultEngine && + "useJavaScriptImport" in this._defaultEngine && + typeof this._defaultEngine.useJavaScriptImport === "function" + ) { + return this._defaultEngine.useJavaScriptImport(); + } + + return false; + } + + /** + * @override + */ + needsToReadFileContents() { + if ("read" in this.entry) { + return this.entry.read; + } + + // Handle aliases to `11ty.js` templates, avoid reading files in the alias, see #2279 + // Here, we are short circuiting fallback to defaultRenderer, does not account for compile + // functions that call defaultRenderer explicitly + if (this._defaultEngine && "needsToReadFileContents" in this._defaultEngine) { + return this._defaultEngine.needsToReadFileContents(); + } + + return true; + } + + // If we init from multiple places, wait for the first init to finish before continuing on. + async _runningInit() { + if (this.needsInit) { + if (!this._initing) { + this._initBench = this.benchmarks.aggregate.get(`Engine (${this.name}) Init`); + this._initBench.before(); + this._initing = this.entry.init.bind({ + config: this.config, + bench: this.benchmarks.aggregate, + })(); + } + await this._initing; + this.needsInit = false; + + if (this._initBench) { + this._initBench.after(); + this._initBench = undefined; + } + } + } + + async getExtraDataFromFile(inputPath) { + if (this.entry.getData === false) { + return; + } + + if (!("getData" in this.entry)) { + // Handle aliases to `11ty.js` templates, use upstream default engine data fetch, see #2279 + if (this._defaultEngine && "getExtraDataFromFile" in this._defaultEngine) { + return this._defaultEngine.getExtraDataFromFile(inputPath); + } + + return; + } + + await this._runningInit(); + + if (typeof this.entry.getData === "function") { + let dataBench = this.benchmarks.aggregate.get( + `Engine (${this.name}) Get Data From File (Function)`, + ); + dataBench.before(); + let data = this.entry.getData(inputPath); + dataBench.after(); + return data; + } + + let keys = new Set(); + if (this.entry.getData === true) { + keys.add("data"); + } else if (Array.isArray(this.entry.getData)) { + for (let key of this.entry.getData) { + keys.add(key); + } + } + + let dataBench = this.benchmarks.aggregate.get(`Engine (${this.name}) Get Data From File`); + dataBench.before(); + + let inst = await this.getInstanceFromInputPath(inputPath); + + if (inst === false) { + dataBench.after(); + + return Promise.reject( + new Error( + `\`getInstanceFromInputPath\` callback missing from '${this.name}' template engine plugin. It is required when \`getData\` is in use. You can set \`getData: false\` to opt-out of this.`, + ), + ); + } + + // override keys set at the plugin level in the individual template + if (inst.eleventyDataKey) { + keys = new Set(inst.eleventyDataKey); + } + + let mixins; + if (this.config) { + // Object.assign usage: see TemplateRenderCustomTest.js: `JavaScript functions should not be mutable but not *that* mutable` + mixins = Object.assign({}, this.config.javascriptFunctions); + } + + let promises = []; + for (let key of keys) { + promises.push( + getJavaScriptData(inst, inputPath, key, { + mixins, + isObjectRequired: key === "data", + }), + ); + } + + let results = await Promise.all(promises); + let data = {}; + for (let result of results) { + Object.assign(data, result); + } + dataBench.after(); + + return data; + } + + async compile(str, inputPath, ...args) { + await this._runningInit(); + let defaultCompilationFn; + if (this._defaultEngine) { + defaultCompilationFn = async (data) => { + const renderFn = await this._defaultEngine.compile(str, inputPath, ...args); + return renderFn(data); + }; + } + + // Fall back to default compiler if the user does not provide their own + if (!this.entry.compile) { + if (defaultCompilationFn) { + return defaultCompilationFn; + } else { + throw new Error( + `Missing \`compile\` property for custom template syntax definition eleventyConfig.addExtension("${this.name}"). This is not necessary when aliasing to an existing template syntax.`, + ); + } + } + + // TODO generalize this (look at JavaScript.js) + let compiledFn = this.entry.compile.bind({ + config: this.config, + addDependencies: (from, toArray = []) => { + this.config.uses.addDependency(from, toArray); + }, + defaultRenderer: defaultCompilationFn, // bind defaultRenderer to compile function + })(str, inputPath); + + // Support `undefined` to skip compile/render + if (compiledFn) { + // Bind defaultRenderer to render function + if ("then" in compiledFn && typeof compiledFn.then === "function") { + // Promise, wait to bind + return compiledFn.then((fn) => { + if (typeof fn === "function") { + return fn.bind({ + defaultRenderer: defaultCompilationFn, + }); + } + return fn; + }); + } else if ("bind" in compiledFn && typeof compiledFn.bind === "function") { + return compiledFn.bind({ + defaultRenderer: defaultCompilationFn, + }); + } + } + + return compiledFn; + } + + get defaultTemplateFileExtension() { + return this.entry.outputFileExtension ?? "html"; + } + + // Whether or not to wrap in Eleventy layouts + useLayouts() { + // TODO future change fallback to `this.defaultTemplateFileExtension === "html"` + return this.entry.useLayouts ?? true; + } + + hasDependencies(inputPath) { + if (this.config.uses.getDependencies(inputPath) === false) { + return false; + } + return true; + } + + isFileRelevantTo(inputPath, comparisonFile, includeLayouts) { + return this.config.uses.isFileRelevantTo(inputPath, comparisonFile, includeLayouts); + } + + getCompileCacheKey(str, inputPath) { + let lastModifiedFile = this.eleventyConfig.getPreviousBuildModifiedFile(); + // Return this separately so we know whether or not to use the cached version + // but still return a key to cache this new render for next time + let isRelevant = this.isFileRelevantTo(inputPath, lastModifiedFile, false); + let useCache = !isRelevant; + + if (this.entry.compileOptions && "getCacheKey" in this.entry.compileOptions) { + if (typeof this.entry.compileOptions.getCacheKey !== "function") { + throw new Error( + `\`compileOptions.getCacheKey\` must be a function in addExtension for the ${this.name} type`, + ); + } + + return { + useCache, + key: this.entry.compileOptions.getCacheKey(str, inputPath), + }; + } + + let { key } = super.getCompileCacheKey(str, inputPath); + return { + useCache, + key, + }; + } + + permalinkNeedsCompilation(/*str*/) { + if (this.entry.compileOptions && "permalink" in this.entry.compileOptions) { + let p = this.entry.compileOptions.permalink; + if (p === "raw") { + return false; + } + + // permalink: false is aliased to permalink: () => false + if (p === false) { + return () => false; + } + + return this.entry.compileOptions.permalink; + } + + // Breaking: default changed from `true` to `false` in 3.0.0-alpha.13 + // Note: `false` is the same as "raw" here. + return false; + } + + static shouldSpiderJavaScriptDependencies(entry) { + if (entry.compileOptions && "spiderJavaScriptDependencies" in entry.compileOptions) { + return entry.compileOptions.spiderJavaScriptDependencies; + } + + return false; + } +} diff --git a/node_modules/@11ty/eleventy/src/Engines/FrontMatter/JavaScript.js b/node_modules/@11ty/eleventy/src/Engines/FrontMatter/JavaScript.js new file mode 100644 index 0000000..b91ba36 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Engines/FrontMatter/JavaScript.js @@ -0,0 +1,34 @@ +import { RetrieveGlobals } from "node-retrieve-globals"; + +// `javascript` Front Matter Type +export default function (frontMatterCode, context = {}) { + let { filePath } = context; + + // context.language would be nice as a guard, but was unreliable + if (frontMatterCode.trimStart().startsWith("{")) { + return context.engines.jsLegacy.parse(frontMatterCode, context); + } + + let vm = new RetrieveGlobals(frontMatterCode, { + filePath, + // ignored if vm.Module is stable (or --experimental-vm-modules) + transformEsmImports: true, + }); + + // Future warning until vm.Module is stable: + // If the frontMatterCode uses `import` this uses the `experimentalModuleApi` + // option in node-retrieve-globals to workaround https://github.com/zachleat/node-retrieve-globals/issues/2 + let data = { + page: { + // Theoretically fileSlug and filePathStem could be added here but require extensionMap + inputPath: filePath, + }, + }; + + // this is async, but it’s handled in Eleventy upstream. + return vm.getGlobalContext(data, { + reuseGlobal: true, + dynamicImport: true, + // addRequire: true, + }); +} diff --git a/node_modules/@11ty/eleventy/src/Engines/Html.js b/node_modules/@11ty/eleventy/src/Engines/Html.js new file mode 100644 index 0000000..a0f4101 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Engines/Html.js @@ -0,0 +1,33 @@ +import TemplateEngine from "./TemplateEngine.js"; + +export default class Html extends TemplateEngine { + constructor(name, eleventyConfig) { + super(name, eleventyConfig); + } + + get cacheable() { + return true; + } + + async #getPreEngine(preTemplateEngine) { + return this.engineManager.getEngine(preTemplateEngine, this.extensionMap); + } + + async compile(str, inputPath, preTemplateEngine) { + if (preTemplateEngine) { + let engine = await this.#getPreEngine(preTemplateEngine); + let fnReady = engine.compile(str, inputPath); + + return async function (data) { + let fn = await fnReady; + + return fn(data); + }; + } + + return function () { + // do nothing with data if preTemplateEngine is falsy + return str; + }; + } +} diff --git a/node_modules/@11ty/eleventy/src/Engines/JavaScript.js b/node_modules/@11ty/eleventy/src/Engines/JavaScript.js new file mode 100644 index 0000000..29b3b7c --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Engines/JavaScript.js @@ -0,0 +1,240 @@ +import { TemplatePath, isPlainObject } from "@11ty/eleventy-utils"; + +import TemplateEngine from "./TemplateEngine.js"; +import EleventyBaseError from "../Errors/EleventyBaseError.js"; +import getJavaScriptData from "../Util/GetJavaScriptData.js"; +import { EleventyImport } from "../Util/Require.js"; +import { augmentFunction, augmentObject } from "./Util/ContextAugmenter.js"; + +class JavaScriptTemplateNotDefined extends EleventyBaseError {} + +export default class JavaScript extends TemplateEngine { + constructor(name, templateConfig) { + super(name, templateConfig); + this.instances = {}; + + this.config.events.on("eleventy#templateModified", (inputPath, metadata = {}) => { + let { usedByDependants, relevantLayouts } = metadata; + // Remove from cached instances when modified + let instancesToDelete = [ + inputPath, + ...(usedByDependants || []), + ...(relevantLayouts || []), + ].map((entry) => TemplatePath.addLeadingDotSlash(entry)); + for (let inputPath of instancesToDelete) { + if (inputPath in this.instances) { + delete this.instances[inputPath]; + } + } + }); + } + + get cacheable() { + return false; + } + + normalize(result) { + if (Buffer.isBuffer(result)) { + return result.toString(); + } + + return result; + } + + // String, Buffer, Promise + // Function, Class + // Object + // Module + _getInstance(mod) { + let noop = function () { + return ""; + }; + + let originalModData = mod?.data; + + if (typeof mod === "object" && mod.default && this.eleventyConfig.getIsProjectUsingEsm()) { + mod = mod.default; + } + + if (typeof mod === "string" || mod instanceof Buffer || mod.then) { + return { render: () => mod }; + } else if (typeof mod === "function") { + if (mod.prototype?.data || mod.prototype?.render) { + if (!("render" in mod.prototype)) { + mod.prototype.render = noop; + } + + if (!("data" in mod.prototype) && !mod.data && originalModData) { + mod.prototype.data = originalModData; + } + + return new mod(); + } else { + return { + ...(originalModData ? { data: originalModData } : undefined), + render: mod, + }; + } + } else if ("data" in mod || "render" in mod) { + if (!mod.render) { + mod.render = noop; + } + if (!mod.data && originalModData) { + mod.data = originalModData; + } + return mod; + } + } + + async #getInstanceFromInputPath(inputPath) { + let mod; + let relativeInputPath = + this.eleventyConfig.directories.getInputPathRelativeToInputDirectory(inputPath); + if (this.eleventyConfig.userConfig.isVirtualTemplate(relativeInputPath)) { + mod = this.eleventyConfig.userConfig.virtualTemplates[relativeInputPath].content; + } else { + let isEsm = this.eleventyConfig.getIsProjectUsingEsm(); + let cacheBust = !this.cacheable || !this.config.useTemplateCache; + mod = await EleventyImport(inputPath, isEsm ? "esm" : "cjs", { + cacheBust, + }); + } + + let inst = this._getInstance(mod); + if (inst) { + this.instances[inputPath] = inst; + } else { + throw new JavaScriptTemplateNotDefined( + `No JavaScript template returned from ${inputPath}. Did you assign module.exports (CommonJS) or export (ESM)?`, + ); + } + return inst; + } + + async getInstanceFromInputPath(inputPath) { + if (!this.instances[inputPath]) { + this.instances[inputPath] = this.#getInstanceFromInputPath(inputPath); + } + + return this.instances[inputPath]; + } + + /** + * JavaScript files defer to the module loader rather than read the files to strings + * + * @override + */ + needsToReadFileContents() { + return false; + } + + /** + * Use the module loader directly + * + * @override + */ + useJavaScriptImport() { + return true; + } + + async getExtraDataFromFile(inputPath) { + let inst = await this.getInstanceFromInputPath(inputPath); + return getJavaScriptData(inst, inputPath); + } + + getJavaScriptFunctions(inst) { + let fns = {}; + let configFns = this.config.javascriptFunctions; + + for (let key in configFns) { + // prefer pre-existing `page` javascriptFunction, if one exists + fns[key] = augmentFunction(configFns[key], { + source: inst, + overwrite: false, + }); + } + return fns; + } + + // Backwards compat + static wrapJavaScriptFunction(inst, fn) { + return augmentFunction(fn, { + source: inst, + }); + } + + addExportsToBundles(inst, url) { + let cfg = this.eleventyConfig.userConfig; + if (!("getBundleManagers" in cfg)) { + return; + } + + let managers = cfg.getBundleManagers(); + for (let name in managers) { + let mgr = managers[name]; + let key = mgr.getBundleExportKey(); + if (!key) { + continue; + } + + if (typeof inst[key] === "string") { + // export const css = ``; + mgr.addToPage(url, inst[key]); + } else if (isPlainObject(inst[key])) { + if (typeof inst[key][name] === "string") { + // Object with bundle names: + // export const bundle = { + // css: `` + // }; + mgr.addToPage(url, inst[key][name]); + } else if (isPlainObject(inst[key][name])) { + // Object with bucket names: + // export const bundle = { + // css: { + // default: `` + // } + // }; + for (let bucketName in inst[key][name]) { + mgr.addToPage(url, inst[key][name][bucketName], bucketName); + } + } + } + } + } + + async compile(str, inputPath) { + let inst; + if (str) { + // When str has a value, it's being used for permalinks in data + inst = this._getInstance(str); + } else { + // For normal templates, str will be falsy. + inst = await this.getInstanceFromInputPath(inputPath); + } + + if (inst?.render) { + return (data = {}) => { + // TODO does this do anything meaningful for non-classes? + // `inst` should have a normalized `render` function from _getInstance + + // Map exports to bundles + if (data.page?.url) { + this.addExportsToBundles(inst, data.page.url); + } + + augmentObject(inst, { + source: data, + overwrite: false, + }); + + Object.assign(inst, this.getJavaScriptFunctions(inst)); + + return this.normalize(inst.render.call(inst, data)); + }; + } + } + + static shouldSpiderJavaScriptDependencies() { + return true; + } +} diff --git a/node_modules/@11ty/eleventy/src/Engines/Liquid.js b/node_modules/@11ty/eleventy/src/Engines/Liquid.js new file mode 100644 index 0000000..44fdab4 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Engines/Liquid.js @@ -0,0 +1,331 @@ +import moo from "moo"; +import { Tokenizer, TokenKind, evalToken, Liquid as LiquidJs } from "liquidjs"; +import { TemplatePath } from "@11ty/eleventy-utils"; +// import debugUtil from "debug"; + +import TemplateEngine from "./TemplateEngine.js"; +import { augmentObject } from "./Util/ContextAugmenter.js"; + +// const debug = debugUtil("Eleventy:Liquid"); + +export default class Liquid extends TemplateEngine { + static argumentLexerOptions = { + number: /[0-9]+\.*[0-9]*/, + doubleQuoteString: /"(?:\\["\\]|[^\n"\\])*"/, + singleQuoteString: /'(?:\\['\\]|[^\n'\\])*'/, + keyword: /[a-zA-Z0-9.\-_]+/, + "ignore:whitespace": /[, \t]+/, // includes comma separator + }; + + constructor(name, eleventyConfig) { + super(name, eleventyConfig); + + this.liquidOptions = this.config.liquidOptions || {}; + + this.setLibrary(this.config.libraryOverrides.liquid); + + this.argLexer = moo.compile(Liquid.argumentLexerOptions); + } + + get cacheable() { + return true; + } + + setLibrary(override) { + // warning, the include syntax supported here does not exactly match what Jekyll uses. + this.liquidLib = override || new LiquidJs(this.getLiquidOptions()); + this.setEngineLib(this.liquidLib, Boolean(this.config.libraryOverrides.liquid)); + + this.addFilters(this.config.liquidFilters); + + // TODO these all go to the same place (addTag), add warnings for overwrites + this.addCustomTags(this.config.liquidTags); + this.addAllShortcodes(this.config.liquidShortcodes); + this.addAllPairedShortcodes(this.config.liquidPairedShortcodes); + } + + getLiquidOptions() { + let defaults = { + root: [this.dirs.includes, this.dirs.input], // supplemented in compile with inputPath below + extname: ".liquid", + strictFilters: true, + // TODO? + // cache: true, + }; + + let options = Object.assign(defaults, this.liquidOptions || {}); + // debug("Liquid constructor options: %o", options); + + return options; + } + + static wrapFilter(name, fn) { + /** + * @this {object} + */ + return function (...args) { + // Set this.eleventy and this.page + if (typeof this.context?.get === "function") { + augmentObject(this, { + source: this.context, + getter: (key, context) => context.get([key]), + + lazy: this.context.strictVariables, + }); + } + + // We *don’t* wrap this in an EleventyFilterError because Liquid has a better error message with line/column information in the template + return fn.call(this, ...args); + }; + } + + // Shortcodes + static normalizeScope(context) { + let obj = {}; + if (context) { + obj.ctx = context; // Full context available on `ctx` + + // Set this.eleventy and this.page + augmentObject(obj, { + source: context, + getter: (key, context) => context.get([key]), + lazy: context.strictVariables, + }); + } + + return obj; + } + + addCustomTags(tags) { + for (let name in tags) { + this.addTag(name, tags[name]); + } + } + + addFilters(filters) { + for (let name in filters) { + this.addFilter(name, filters[name]); + } + } + + addFilter(name, filter) { + this.liquidLib.registerFilter(name, Liquid.wrapFilter(name, filter)); + } + + addTag(name, tagFn) { + let tagObj; + if (typeof tagFn === "function") { + tagObj = tagFn(this.liquidLib); + } else { + throw new Error( + "Liquid.addTag expects a callback function to be passed in: addTag(name, function(liquidEngine) { return { parse: …, render: … } })", + ); + } + this.liquidLib.registerTag(name, tagObj); + } + + addAllShortcodes(shortcodes) { + for (let name in shortcodes) { + this.addShortcode(name, shortcodes[name]); + } + } + + addAllPairedShortcodes(shortcodes) { + for (let name in shortcodes) { + this.addPairedShortcode(name, shortcodes[name]); + } + } + + static parseArguments(lexer, str) { + let argArray = []; + + if (!lexer) { + lexer = moo.compile(Liquid.argumentLexerOptions); + } + + if (typeof str === "string") { + lexer.reset(str); + + let arg = lexer.next(); + while (arg) { + /*{ + type: 'doubleQuoteString', + value: '"test 2"', + text: '"test 2"', + toString: [Function: tokenToString], + offset: 0, + lineBreaks: 0, + line: 1, + col: 1 }*/ + if (arg.type.indexOf("ignore:") === -1) { + // Push the promise into an array instead of awaiting it here. + // This forces the promises to run in order with the correct scope value for each arg. + // Otherwise they run out of order and can lead to undefined values for arguments in layout template shortcodes. + // console.log( arg.value, scope, engine ); + argArray.push(arg.value); + } + arg = lexer.next(); + } + } + + return argArray; + } + + static parseArgumentsBuiltin(args) { + let tokenizer = new Tokenizer(args); + let parsedArgs = []; + + let value = tokenizer.readValue(); + while (value) { + parsedArgs.push(value); + tokenizer.skipBlank(); + if (tokenizer.peek() === ",") { + tokenizer.advance(); + } + value = tokenizer.readValue(); + } + tokenizer.end(); + + return parsedArgs; + } + + addShortcode(shortcodeName, shortcodeFn) { + let _t = this; + this.addTag(shortcodeName, function (liquidEngine) { + return { + parse(tagToken) { + this.name = tagToken.name; + if (_t.config.liquidParameterParsing === "builtin") { + this.orderedArgs = Liquid.parseArgumentsBuiltin(tagToken.args); + // note that Liquid does have a Hash class for name-based argument parsing but offers no easy to support both modes in one class + } else { + this.legacyArgs = tagToken.args; + } + }, + render: function* (ctx) { + let argArray = []; + + if (this.legacyArgs) { + let rawArgs = Liquid.parseArguments(_t.argLexer, this.legacyArgs); + for (let arg of rawArgs) { + let b = yield liquidEngine.evalValue(arg, ctx); + argArray.push(b); + } + } else if (this.orderedArgs) { + for (let arg of this.orderedArgs) { + let b = yield evalToken(arg, ctx); + argArray.push(b); + } + } + + let ret = yield shortcodeFn.call(Liquid.normalizeScope(ctx), ...argArray); + return ret; + }, + }; + }); + } + + addPairedShortcode(shortcodeName, shortcodeFn) { + let _t = this; + this.addTag(shortcodeName, function (liquidEngine) { + return { + parse(tagToken, remainTokens) { + this.name = tagToken.name; + + if (_t.config.liquidParameterParsing === "builtin") { + this.orderedArgs = Liquid.parseArgumentsBuiltin(tagToken.args); + // note that Liquid does have a Hash class for name-based argument parsing but offers no easy to support both modes in one class + } else { + this.legacyArgs = tagToken.args; + } + + this.templates = []; + + var stream = liquidEngine.parser + .parseStream(remainTokens) + .on("template", (tpl) => this.templates.push(tpl)) + .on("tag:end" + shortcodeName, () => stream.stop()) + .on("end", () => { + throw new Error(`tag ${tagToken.raw} not closed`); + }); + + stream.start(); + }, + render: function* (ctx /*, emitter*/) { + let argArray = []; + if (this.legacyArgs) { + let rawArgs = Liquid.parseArguments(_t.argLexer, this.legacyArgs); + for (let arg of rawArgs) { + let b = yield liquidEngine.evalValue(arg, ctx); + argArray.push(b); + } + } else if (this.orderedArgs) { + for (let arg of this.orderedArgs) { + let b = yield evalToken(arg, ctx); + argArray.push(b); + } + } + + const html = yield liquidEngine.renderer.renderTemplates(this.templates, ctx); + + let ret = yield shortcodeFn.call(Liquid.normalizeScope(ctx), html, ...argArray); + + return ret; + }, + }; + }); + } + + parseForSymbols(str) { + if (!str) { + return []; + } + + let tokenizer = new Tokenizer(str); + /** @type {Array} */ + let tokens = tokenizer.readTopLevelTokens(); + let symbols = tokens + .filter((token) => token.kind === TokenKind.Output) + .map((token) => { + // manually remove filters 😅 + return token.content.split("|").map((entry) => entry.trim())[0]; + }); + return symbols; + } + + // Don’t return a boolean if permalink is a function (see TemplateContent->renderPermalink) + /** @returns {boolean|undefined} */ + permalinkNeedsCompilation(str) { + if (typeof str === "string") { + return this.needsCompilation(str); + } + } + + needsCompilation(str) { + let options = this.liquidLib.options; + + return ( + str.indexOf(options.tagDelimiterLeft) !== -1 || + str.indexOf(options.outputDelimiterLeft) !== -1 + ); + } + + async compile(str, inputPath) { + let engine = this.liquidLib; + let tmplReady = engine.parse(str, inputPath); + + // Required for relative includes + let options = {}; + if (!inputPath || inputPath === "liquid" || inputPath === "md") { + // do nothing + } else { + options.root = [TemplatePath.getDirFromFilePath(inputPath)]; + } + + return async function (data) { + let tmpl = await tmplReady; + + return engine.render(tmpl, data, options); + }; + } +} diff --git a/node_modules/@11ty/eleventy/src/Engines/Markdown.js b/node_modules/@11ty/eleventy/src/Engines/Markdown.js new file mode 100644 index 0000000..ec1e1f6 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Engines/Markdown.js @@ -0,0 +1,100 @@ +import markdownIt from "markdown-it"; + +import TemplateEngine from "./TemplateEngine.js"; + +export default class Markdown extends TemplateEngine { + constructor(name, eleventyConfig) { + super(name, eleventyConfig); + + this.markdownOptions = {}; + + this.setLibrary(this.config.libraryOverrides.md); + } + + get cacheable() { + return true; + } + + setLibrary(mdLib) { + this.mdLib = mdLib || markdownIt(this.getMarkdownOptions()); + + // Overrides a highlighter set in `markdownOptions` + // This is separate so devs can pass in a new mdLib and still use the official eleventy plugin for markdown highlighting + if (this.config.markdownHighlighter && typeof this.mdLib.set === "function") { + this.mdLib.set({ + highlight: this.config.markdownHighlighter, + }); + } + + if (typeof this.mdLib.disable === "function") { + // Disable indented code blocks by default (Issue #2438) + this.mdLib.disable("code"); + } + + this.setEngineLib(this.mdLib, Boolean(this.config.libraryOverrides.md)); + } + + setMarkdownOptions(options) { + this.markdownOptions = options; + } + + getMarkdownOptions() { + // work with "mode" presets https://github.com/markdown-it/markdown-it#init-with-presets-and-options + if (typeof this.markdownOptions === "string") { + return this.markdownOptions; + } + + return Object.assign( + { + html: true, + }, + this.markdownOptions || {}, + ); + } + + // TODO use preTemplateEngine to help inform this + // needsCompilation() { + // return super.needsCompilation(); + // } + + async #getPreEngine(preTemplateEngine) { + if (typeof preTemplateEngine === "string") { + return this.engineManager.getEngine(preTemplateEngine, this.extensionMap); + } + + return preTemplateEngine; + } + + async compile(str, inputPath, preTemplateEngine, bypassMarkdown) { + let mdlib = this.mdLib; + + if (preTemplateEngine) { + let engine = await this.#getPreEngine(preTemplateEngine); + let fnReady = engine.compile(str, inputPath); + + if (bypassMarkdown) { + return async function (data) { + let fn = await fnReady; + return fn(data); + }; + } else { + return async function (data) { + let fn = await fnReady; + let preTemplateEngineRender = await fn(data); + let finishedRender = mdlib.render(preTemplateEngineRender, data); + return finishedRender; + }; + } + } else { + if (bypassMarkdown) { + return function () { + return str; + }; + } else { + return function (data) { + return mdlib.render(str, data); + }; + } + } + } +} diff --git a/node_modules/@11ty/eleventy/src/Engines/Nunjucks.js b/node_modules/@11ty/eleventy/src/Engines/Nunjucks.js new file mode 100755 index 0000000..70cca17 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Engines/Nunjucks.js @@ -0,0 +1,482 @@ +import NunjucksLib from "nunjucks"; +import debugUtil from "debug"; +import { TemplatePath } from "@11ty/eleventy-utils"; + +import TemplateEngine from "./TemplateEngine.js"; +import EleventyBaseError from "../Errors/EleventyBaseError.js"; +import { augmentObject } from "./Util/ContextAugmenter.js"; +import { withResolvers } from "../Util/PromiseUtil.js"; + +const debug = debugUtil("Eleventy:Nunjucks"); + +class EleventyNunjucksError extends EleventyBaseError {} + +export default class Nunjucks extends TemplateEngine { + constructor(name, eleventyConfig) { + super(name, eleventyConfig); + + this.nunjucksEnvironmentOptions = this.config.nunjucksEnvironmentOptions || { dev: true }; + + this.nunjucksPrecompiledTemplates = this.config.nunjucksPrecompiledTemplates || {}; + this._usingPrecompiled = Object.keys(this.nunjucksPrecompiledTemplates).length > 0; + + this.setLibrary(this.config.libraryOverrides.njk); + } + + // v3.1.0-alpha.1 we’ve moved to use Nunjucks’ internal cache instead of Eleventy’s + // get cacheable() { + // return false; + // } + + #getFileSystemDirs() { + let paths = new Set(); + paths.add(super.getIncludesDir()); + paths.add(TemplatePath.getWorkingDir()); + + // Filter out undefined paths + return Array.from(paths).filter(Boolean); + } + + #setEnv(override) { + if (override) { + this.njkEnv = override; + } else if (this._usingPrecompiled) { + // Precompiled templates to avoid eval! + const NodePrecompiledLoader = function () {}; + + NodePrecompiledLoader.prototype.getSource = (name) => { + // https://github.com/mozilla/nunjucks/blob/fd500902d7c88672470c87170796de52fc0f791a/nunjucks/src/precompiled-loader.js#L5 + return { + src: { + type: "code", + obj: this.nunjucksPrecompiledTemplates[name], + }, + // Maybe add this? + // path, + // noCache: true + }; + }; + + this.njkEnv = new NunjucksLib.Environment( + new NodePrecompiledLoader(), + this.nunjucksEnvironmentOptions, + ); + } else { + let fsLoader = new NunjucksLib.FileSystemLoader(this.#getFileSystemDirs()); + this.njkEnv = new NunjucksLib.Environment(fsLoader, this.nunjucksEnvironmentOptions); + } + + this.config.events.emit("eleventy.engine.njk", { + nunjucks: NunjucksLib, + environment: this.njkEnv, + }); + } + + setLibrary(override) { + this.#setEnv(override); + + // Note that a new Nunjucks engine instance is created for subsequent builds + // Eleventy Nunjucks is set to `cacheable` false above to opt out of Eleventy cache + this.config.events.on("eleventy#templateModified", (templatePath) => { + // NunjucksEnvironment: + // loader.pathToNames: {'ABSOLUTE_PATH/src/_includes/components/possum-home.css': 'components/possum-home.css'} + // loader.cache: { 'components/possum-home.css': [Template] } + // Nunjucks stores these as Operating System native paths + let absTmplPath = TemplatePath.normalizeOperatingSystemFilePath( + TemplatePath.absolutePath(templatePath), + ); + for (let loader of this.njkEnv.loaders) { + let nunjucksName = loader.pathsToNames[absTmplPath]; + if (nunjucksName) { + debug( + "Match found in Nunjucks cache via templateModified for %o, clearing this entry", + templatePath, + ); + delete loader.pathsToNames[absTmplPath]; + delete loader.cache[nunjucksName]; + } + } + + // Behavior prior to v3.1.0-alpha.1: + // this.njkEnv.invalidateCache(); + }); + + this.setEngineLib(this.njkEnv, Boolean(this.config.libraryOverrides.njk)); + + this.addFilters(this.config.nunjucksFilters); + this.addFilters(this.config.nunjucksAsyncFilters, true); + + // TODO these all go to the same place (addTag), add warnings for overwrites + // TODO(zachleat): variableName should work with quotes or without quotes (same as {% set %}) + this.addPairedShortcode("setAsync", function (content, variableName) { + this.ctx[variableName] = content; + return ""; + }); + + this.addCustomTags(this.config.nunjucksTags); + this.addAllShortcodes(this.config.nunjucksShortcodes); + this.addAllShortcodes(this.config.nunjucksAsyncShortcodes, true); + this.addAllPairedShortcodes(this.config.nunjucksPairedShortcodes); + this.addAllPairedShortcodes(this.config.nunjucksAsyncPairedShortcodes, true); + this.addGlobals(this.config.nunjucksGlobals); + } + + addFilters(filters, isAsync) { + for (let name in filters) { + this.njkEnv.addFilter(name, Nunjucks.wrapFilter(name, filters[name]), isAsync); + } + } + + static wrapFilter(name, fn) { + return function (...args) { + try { + augmentObject(this, { + source: this.ctx, + lazy: false, // context.env?.opts.throwOnUndefined, + }); + + return fn.call(this, ...args); + } catch (e) { + throw new EleventyNunjucksError( + `Error in Nunjucks Filter \`${name}\`${this.page ? ` (${this.page.inputPath})` : ""}`, + e, + ); + } + }; + } + + // Shortcodes + static normalizeContext(context) { + let obj = {}; + if (context.ctx) { + obj.ctx = context.ctx; + obj.env = context.env; + + augmentObject(obj, { + source: context.ctx, + lazy: false, // context.env?.opts.throwOnUndefined, + }); + } + return obj; + } + + addCustomTags(tags) { + for (let name in tags) { + this.addTag(name, tags[name]); + } + } + + addTag(name, tagFn) { + let tagObj; + if (typeof tagFn === "function") { + tagObj = tagFn(NunjucksLib, this.njkEnv); + } else { + throw new Error( + "Nunjucks.addTag expects a callback function to be passed in: addTag(name, function(nunjucksEngine) {})", + ); + } + + this.njkEnv.addExtension(name, tagObj); + } + + addGlobals(globals) { + for (let name in globals) { + this.addGlobal(name, globals[name]); + } + } + + addGlobal(name, globalFn) { + this.njkEnv.addGlobal(name, globalFn); + } + + addAllShortcodes(shortcodes, isAsync = false) { + for (let name in shortcodes) { + this.addShortcode(name, shortcodes[name], isAsync); + } + } + + addAllPairedShortcodes(shortcodes, isAsync = false) { + for (let name in shortcodes) { + this.addPairedShortcode(name, shortcodes[name], isAsync); + } + } + + _getShortcodeFn(shortcodeName, shortcodeFn, isAsync = false) { + return function ShortcodeFunction() { + this.tags = [shortcodeName]; + + this.parse = function (parser, nodes) { + let args; + let tok = parser.nextToken(); + + args = parser.parseSignature(true, true); + + // Nunjucks bug with non-paired custom tags bug still exists even + // though this issue is closed. Works fine for paired. + // https://github.com/mozilla/nunjucks/issues/158 + if (args.children.length === 0) { + args.addChild(new nodes.Literal(0, 0, "")); + } + + parser.advanceAfterBlockEnd(tok.value); + if (isAsync) { + return new nodes.CallExtensionAsync(this, "run", args); + } + return new nodes.CallExtension(this, "run", args); + }; + + this.run = function (...args) { + let resolve; + if (isAsync) { + resolve = args.pop(); + } + + let [context, ...argArray] = args; + + if (isAsync) { + let ret = shortcodeFn.call(Nunjucks.normalizeContext(context), ...argArray); + + // #3286 error messaging when the shortcode is not a promise + if (!ret?.then) { + resolve( + new EleventyNunjucksError( + `Error with Nunjucks shortcode \`${shortcodeName}\`: it was defined as asynchronous but was actually synchronous. This is important for Nunjucks.`, + ), + ); + } + + ret.then( + function (returnValue) { + resolve(null, new NunjucksLib.runtime.SafeString("" + returnValue)); + }, + function (e) { + resolve( + new EleventyNunjucksError(`Error with Nunjucks shortcode \`${shortcodeName}\``, e), + ); + }, + ); + } else { + try { + let ret = shortcodeFn.call(Nunjucks.normalizeContext(context), ...argArray); + return new NunjucksLib.runtime.SafeString("" + ret); + } catch (e) { + throw new EleventyNunjucksError( + `Error with Nunjucks shortcode \`${shortcodeName}\``, + e, + ); + } + } + }; + }; + } + + _getPairedShortcodeFn(shortcodeName, shortcodeFn, isAsync = false) { + return function PairedShortcodeFunction() { + this.tags = [shortcodeName]; + + this.parse = function (parser, nodes) { + var tok = parser.nextToken(); + + var args = parser.parseSignature(true, true); + parser.advanceAfterBlockEnd(tok.value); + + var body = parser.parseUntilBlocks("end" + shortcodeName); + parser.advanceAfterBlockEnd(); + + return new nodes.CallExtensionAsync(this, "run", args, [body]); + }; + + this.run = function (...args) { + let resolve = args.pop(); + let body = args.pop(); + let [context, ...argArray] = args; + + body(function (e, bodyContent) { + if (e) { + resolve( + new EleventyNunjucksError( + `Error with Nunjucks paired shortcode \`${shortcodeName}\``, + e, + ), + ); + } + + if (isAsync) { + let ret = shortcodeFn.call( + Nunjucks.normalizeContext(context), + bodyContent, + ...argArray, + ); + + // #3286 error messaging when the shortcode is not a promise + if (!ret?.then) { + throw new EleventyNunjucksError( + `Error with Nunjucks shortcode \`${shortcodeName}\`: it was defined as asynchronous but was actually synchronous. This is important for Nunjucks.`, + ); + } + + ret.then( + function (returnValue) { + resolve(null, new NunjucksLib.runtime.SafeString(returnValue)); + }, + function (e) { + resolve( + new EleventyNunjucksError( + `Error with Nunjucks paired shortcode \`${shortcodeName}\``, + e, + ), + ); + }, + ); + } else { + try { + resolve( + null, + new NunjucksLib.runtime.SafeString( + shortcodeFn.call(Nunjucks.normalizeContext(context), bodyContent, ...argArray), + ), + ); + } catch (e) { + resolve( + new EleventyNunjucksError( + `Error with Nunjucks paired shortcode \`${shortcodeName}\``, + e, + ), + ); + } + } + }); + }; + }; + } + + addShortcode(shortcodeName, shortcodeFn, isAsync = false) { + let fn = this._getShortcodeFn(shortcodeName, shortcodeFn, isAsync); + this.njkEnv.addExtension(shortcodeName, new fn()); + } + + addPairedShortcode(shortcodeName, shortcodeFn, isAsync = false) { + let fn = this._getPairedShortcodeFn(shortcodeName, shortcodeFn, isAsync); + this.njkEnv.addExtension(shortcodeName, new fn()); + } + + // Don’t return a boolean if permalink is a function (see TemplateContent->renderPermalink) + permalinkNeedsCompilation(str) { + if (typeof str === "string") { + return this.needsCompilation(str); + } + } + + needsCompilation(str) { + // Defend against syntax customisations: + // https://mozilla.github.io/nunjucks/api.html#customizing-syntax + let optsTags = this.njkEnv.opts.tags || {}; + let blockStart = optsTags.blockStart || "{%"; + let variableStart = optsTags.variableStart || "{{"; + let commentStart = optsTags.variableStart || "{#"; + + return ( + str.indexOf(blockStart) !== -1 || + str.indexOf(variableStart) !== -1 || + str.indexOf(commentStart) !== -1 + ); + } + + _getParseExtensions() { + if (this._parseExtensions) { + return this._parseExtensions; + } + + // add extensions so the parser knows about our custom tags/blocks + let ext = []; + for (let name in this.config.nunjucksTags) { + let fn = this._getShortcodeFn(name, () => {}); + ext.push(new fn()); + } + for (let name in this.config.nunjucksShortcodes) { + let fn = this._getShortcodeFn(name, () => {}); + ext.push(new fn()); + } + for (let name in this.config.nunjucksAsyncShortcodes) { + let fn = this._getShortcodeFn(name, () => {}, true); + ext.push(new fn()); + } + for (let name in this.config.nunjucksPairedShortcodes) { + let fn = this._getPairedShortcodeFn(name, () => {}); + ext.push(new fn()); + } + for (let name in this.config.nunjucksAsyncPairedShortcodes) { + let fn = this._getPairedShortcodeFn(name, () => {}, true); + ext.push(new fn()); + } + + this._parseExtensions = ext; + return ext; + } + + /* Outputs an Array of lodash get selectors */ + parseForSymbols(str) { + if (!str) { + return []; + } + const { parser, nodes } = NunjucksLib; + let obj = parser.parse(str, this._getParseExtensions()); + if (!obj) { + return []; + } + let linesplit = str.split("\n"); + let values = obj.findAll(nodes.Value); + let symbols = obj.findAll(nodes.Symbol).map((entry) => { + let name = [entry.value]; + let nestedIndex = -1; + for (let val of values) { + if (nestedIndex > -1) { + /* deep.object.syntax */ + if (linesplit[val.lineno].charAt(nestedIndex) === ".") { + name.push(val.value); + nestedIndex += val.value.length + 1; + } else { + nestedIndex = -1; + } + } else if ( + val.lineno === entry.lineno && + val.colno === entry.colno && + val.value === entry.value + ) { + nestedIndex = entry.colno + entry.value.length; + } + } + return name.join("."); + }); + + let uniqueSymbols = Array.from(new Set(symbols)); + return uniqueSymbols; + } + + async compile(str, inputPath) { + let tmpl; + + // *All* templates are precompiled to avoid runtime eval + if (this._usingPrecompiled) { + tmpl = this.njkEnv.getTemplate(str, true); + } else if (!inputPath || inputPath === "njk" || inputPath === "md") { + tmpl = new NunjucksLib.Template(str, this.njkEnv, null, false); + } else { + tmpl = new NunjucksLib.Template(str, this.njkEnv, inputPath, false); + } + + return function (data) { + let { promise, resolve, reject } = withResolvers(); + + tmpl.render(data, (error, result) => { + if (error) { + reject(error); + } else { + resolve(result); + } + }); + + return promise; + }; + } +} diff --git a/node_modules/@11ty/eleventy/src/Engines/TemplateEngine.js b/node_modules/@11ty/eleventy/src/Engines/TemplateEngine.js new file mode 100644 index 0000000..234aa4e --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Engines/TemplateEngine.js @@ -0,0 +1,206 @@ +import debugUtil from "debug"; +import EleventyBaseError from "../Errors/EleventyBaseError.js"; + +class TemplateEngineConfigError extends EleventyBaseError {} + +const debug = debugUtil("Eleventy:TemplateEngine"); + +const AMENDED_INSTANCES = new Set(); + +export default class TemplateEngine { + #extensionMap; + #engineManager; + #benchmarks; + + constructor(name, eleventyConfig) { + this.name = name; + + this.engineLib = null; + + if (!eleventyConfig) { + throw new TemplateEngineConfigError("Missing `eleventyConfig` argument."); + } + this.eleventyConfig = eleventyConfig; + } + + get cacheable() { + return false; + } + + get dirs() { + return this.eleventyConfig.directories; + } + + get inputDir() { + return this.dirs.input; + } + + get includesDir() { + return this.dirs.includes; + } + + get config() { + if (this.eleventyConfig.constructor.name !== "TemplateConfig") { + throw new Error("Expecting a TemplateConfig instance."); + } + + return this.eleventyConfig.getConfig(); + } + + get benchmarks() { + if (!this.#benchmarks) { + this.#benchmarks = { + aggregate: this.config.benchmarkManager.get("Aggregate"), + }; + } + return this.#benchmarks; + } + + get engineManager() { + return this.#engineManager; + } + + set engineManager(manager) { + this.#engineManager = manager; + } + + get extensionMap() { + if (!this.#extensionMap) { + throw new Error("Internal error: missing `extensionMap` in TemplateEngine."); + } + return this.#extensionMap; + } + + set extensionMap(map) { + this.#extensionMap = map; + } + + get extensions() { + if (!this._extensions) { + this._extensions = this.extensionMap.getExtensionsFromKey(this.name); + } + return this._extensions; + } + + get extensionEntries() { + if (!this._extensionEntries) { + this._extensionEntries = this.extensionMap.getExtensionEntriesFromKey(this.name); + } + return this._extensionEntries; + } + + getName() { + return this.name; + } + + // Backwards compat + getIncludesDir() { + return this.includesDir; + } + + /** + * @protected + */ + setEngineLib(engineLib, isOverrideViaSetLibrary = false) { + this.engineLib = engineLib; + + // Run engine amendments (via issue #2438) + // Issue #3816: this isn’t ideal but there is no other way to reset a markdown instance if it was also overridden by addLibrary + if (AMENDED_INSTANCES.has(engineLib)) { + return; + } + + if (isOverrideViaSetLibrary) { + AMENDED_INSTANCES.add(engineLib); + } + debug( + "Running amendLibrary for %o (number of amendments: %o)", + this.name, + this.config.libraryAmendments[this.name]?.length, + ); + + for (let amendment of this.config.libraryAmendments[this.name] || []) { + // TODO it’d be nice if this were async friendly + amendment(engineLib); + } + } + + getEngineLib() { + return this.engineLib; + } + + async _testRender(str, data) { + // @ts-ignore + let fn = await this.compile(str); + return fn(data); + } + + useJavaScriptImport() { + return false; + } + + // JavaScript files defer to the module loader rather than read the files to strings + needsToReadFileContents() { + return true; + } + + getExtraDataFromFile() { + return {}; + } + + getCompileCacheKey(str, inputPath) { + // Changing to use inputPath and contents, using only file contents (`str`) caused issues when two + // different files had identical content (2.0.0-canary.16) + + // Caches are now segmented based on inputPath so using inputPath here is superfluous (2.0.0-canary.19) + // But we do want a non-falsy value here even if `str` is an empty string. + return { + useCache: true, + key: inputPath + str, + }; + } + + get defaultTemplateFileExtension() { + return "html"; + } + + // Whether or not to wrap in Eleventy layouts + useLayouts() { + return true; + } + + /** @returns {boolean|undefined} */ + permalinkNeedsCompilation(str) { + return this.needsCompilation(); + } + + // whether or not compile is needed or can we return the plaintext? + needsCompilation(str) { + return true; + } + + /** + * Make sure compile is implemented downstream. + * @abstract + * @return {Promise} + */ + async compile() { + throw new Error("compile() must be implemented by engine"); + } + + // See https://v3.11ty.dev/docs/watch-serve/#watch-javascript-dependencies + static shouldSpiderJavaScriptDependencies() { + return false; + } + + hasDependencies(inputPath) { + if (this.config.uses.getDependencies(inputPath) === false) { + return false; + } + return true; + } + + isFileRelevantTo(inputPath, comparisonFile) { + return this.config.uses.isFileRelevantTo(inputPath, comparisonFile); + } +} diff --git a/node_modules/@11ty/eleventy/src/Engines/TemplateEngineManager.js b/node_modules/@11ty/eleventy/src/Engines/TemplateEngineManager.js new file mode 100644 index 0000000..913a803 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Engines/TemplateEngineManager.js @@ -0,0 +1,193 @@ +import debugUtil from "debug"; +import EleventyBaseError from "../Errors/EleventyBaseError.js"; + +const debug = debugUtil("Eleventy:TemplateEngineManager"); + +class TemplateEngineManager { + constructor(eleventyConfig) { + if (!eleventyConfig || eleventyConfig.constructor.name !== "TemplateConfig") { + throw new EleventyBaseError("Missing or invalid `config` argument."); + } + this.eleventyConfig = eleventyConfig; + + this.engineCache = {}; + this.importCache = {}; + } + + get config() { + return this.eleventyConfig.getConfig(); + } + + static isAlias(entry) { + if (entry.aliasKey) { + return true; + } + + return entry.key !== entry.extension; + } + + static isSimpleAlias(entry) { + if (!this.isAlias(entry)) { + return false; + } + + // has keys other than key, extension, and aliasKey + return ( + Object.keys(entry).some((key) => { + return key !== "key" && key !== "extension" && key !== "aliasKey"; + }) === false + ); + } + + get keyToClassNameMap() { + if (!this._keyToClassNameMap) { + this._keyToClassNameMap = { + md: "Markdown", + html: "Html", + njk: "Nunjucks", + liquid: "Liquid", + "11ty.js": "JavaScript", + }; + + // Custom entries *can* overwrite default entries above + if ("extensionMap" in this.config) { + for (let entry of this.config.extensionMap) { + // either the key does not already exist or it is not a simple alias and is an override: https://v3.11ty.dev/docs/languages/custom/#overriding-an-existing-template-language + let existingTarget = this._keyToClassNameMap[entry.key]; + let isAlias = TemplateEngineManager.isAlias(entry); + + if (!existingTarget && isAlias) { + throw new Error( + `An attempt to alias ${entry.aliasKey} to ${entry.key} was made, but ${entry.key} is not a recognized template syntax.`, + ); + } + + if (isAlias) { + // only `key` and `extension`, not `compile` or other options + if (!TemplateEngineManager.isSimpleAlias(entry)) { + this._keyToClassNameMap[entry.aliasKey] = "Custom"; + } else { + this._keyToClassNameMap[entry.aliasKey] = this._keyToClassNameMap[entry.key]; + } + } else { + // not an alias, so `key` and `extension` are the same here. + // *can* override a built-in extension! + this._keyToClassNameMap[entry.key] = "Custom"; + } + } + } + } + + return this._keyToClassNameMap; + } + + reset() { + this.engineCache = {}; + } + + getClassNameFromTemplateKey(key) { + return this.keyToClassNameMap[key]; + } + + hasEngine(name) { + return !!this.getClassNameFromTemplateKey(name); + } + + async getEngineClassByExtension(extension) { + if (this.importCache[extension]) { + return this.importCache[extension]; + } + + let promise; + + // We include these as raw strings (and not more readable variables) so they’re parsed by a bundler. + if (extension === "md") { + promise = import("./Markdown.js").then((mod) => mod.default); + } else if (extension === "html") { + promise = import("./Html.js").then((mod) => mod.default); + } else if (extension === "njk") { + promise = import("./Nunjucks.js").then((mod) => mod.default); + } else if (extension === "liquid") { + promise = import("./Liquid.js").then((mod) => mod.default); + } else if (extension === "11ty.js") { + promise = import("./JavaScript.js").then((mod) => mod.default); + } else { + promise = this.getCustomEngineClass(); + } + + this.importCache[extension] = promise; + + return promise; + } + + async getCustomEngineClass() { + if (!this._CustomEngine) { + this._CustomEngine = import("./Custom.js").then((mod) => mod.default); + } + return this._CustomEngine; + } + + async #getEngine(name, extensionMap) { + let cls = await this.getEngineClassByExtension(name); + let instance = new cls(name, this.eleventyConfig); + instance.extensionMap = extensionMap; + instance.engineManager = this; + + let extensionEntry = extensionMap.getExtensionEntry(name); + + // Override a built-in extension (md => md) + // If provided a "Custom" engine using addExtension, but that engine's instance is *not* custom, + // The user must be overriding a built-in engine i.e. addExtension('md', { ...overrideBehavior }) + let className = this.getClassNameFromTemplateKey(name); + + if (className === "Custom" && instance.constructor.name !== "CustomEngine") { + let CustomEngine = await this.getCustomEngineClass(); + let overrideCustomEngine = new CustomEngine(name, this.eleventyConfig); + + // Keep track of the "default" engine 11ty would normally use + // This allows the user to access the default engine in their override + overrideCustomEngine.setDefaultEngine(instance); + + instance = overrideCustomEngine; + // Alias to a built-in extension (11ty.tsx => 11ty.js) + } else if ( + instance.constructor.name === "CustomEngine" && + TemplateEngineManager.isAlias(extensionEntry) + ) { + // add defaultRenderer for complex aliases with their own compile functions. + let originalEngineInstance = await this.getEngine(extensionEntry.key, extensionMap); + instance.setDefaultEngine(originalEngineInstance); + } + + return instance; + } + + isEngineRemovedFromCore(name) { + return ["ejs", "hbs", "mustache", "haml", "pug"].includes(name) && !this.hasEngine(name); + } + + async getEngine(name, extensionMap) { + // Bundled engine deprecation + if (this.isEngineRemovedFromCore(name)) { + throw new Error( + `Per the 11ty Community Survey (2023), the "${name}" template language was moved from core to an officially supported plugin in v3.0. These plugins live here: https://github.com/11ty/eleventy-plugin-template-languages and are documented on their respective template language docs at https://v3.11ty.dev/docs/languages/ You are also empowered to implement *any* template language yourself using https://v3.11ty.dev/docs/languages/custom/`, + ); + } + + if (!this.hasEngine(name)) { + throw new Error(`Template Engine ${name} does not exist in getEngine()`); + } + // TODO these cached engines should be based on extensions not name, then we can remove the error in + // "Double override (not aliases) throws an error" test in TemplateRenderCustomTest.js + if (!this.engineCache[name]) { + debug("Engine cache miss %o (should only happen once per engine type)", name); + // Make sure cache key is based on name and not path + // Custom class is used for all plugins, cache once per plugin + this.engineCache[name] = this.#getEngine(name, extensionMap); + } + + return this.engineCache[name]; + } +} + +export default TemplateEngineManager; diff --git a/node_modules/@11ty/eleventy/src/Engines/Util/ContextAugmenter.js b/node_modules/@11ty/eleventy/src/Engines/Util/ContextAugmenter.js new file mode 100644 index 0000000..dd5fbc6 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Engines/Util/ContextAugmenter.js @@ -0,0 +1,67 @@ +const DATA_KEYS = ["page", "eleventy"]; + +function augmentFunction(fn, options = {}) { + let t = typeof fn; + if (t !== "function") { + throw new Error( + "Invalid type passed to `augmentFunction`. A function was expected and received: " + t, + ); + } + + /** @this {object} */ + return function (...args) { + let context = augmentObject(this || {}, options); + return fn.call(context, ...args); + }; +} + +function augmentObject(targetObject, options = {}) { + options = Object.assign( + { + source: undefined, // where to copy from + overwrite: true, + lazy: false, // lazily fetch the property + // getter: function() {}, + }, + options, + ); + + for (let key of DATA_KEYS) { + // Skip if overwrite: false and prop already exists on target + if (!options.overwrite && targetObject[key]) { + continue; + } + + if (options.lazy) { + let value; + if (typeof options.getter == "function") { + value = () => options.getter(key, options.source); + } else { + value = () => options.source?.[key]; + } + + // lazy getter important for Liquid strictVariables support + Object.defineProperty(targetObject, key, { + writable: true, + configurable: true, + enumerable: true, + value, + }); + } else { + let value; + if (typeof options.getter == "function") { + value = options.getter(key, options.source); + } else { + value = options.source?.[key]; + } + + if (value) { + targetObject[key] = value; + } + } + } + + return targetObject; +} + +export { DATA_KEYS as augmentKeys, augmentFunction, augmentObject }; diff --git a/node_modules/@11ty/eleventy/src/Errors/DuplicatePermalinkOutputError.js b/node_modules/@11ty/eleventy/src/Errors/DuplicatePermalinkOutputError.js new file mode 100644 index 0000000..444195c --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Errors/DuplicatePermalinkOutputError.js @@ -0,0 +1,9 @@ +import EleventyBaseError from "./EleventyBaseError.js"; + +class DuplicatePermalinkOutputError extends EleventyBaseError { + get removeDuplicateErrorStringFromOutput() { + return true; + } +} + +export default DuplicatePermalinkOutputError; diff --git a/node_modules/@11ty/eleventy/src/Errors/EleventyBaseError.js b/node_modules/@11ty/eleventy/src/Errors/EleventyBaseError.js new file mode 100644 index 0000000..6e76c5f --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Errors/EleventyBaseError.js @@ -0,0 +1,24 @@ +/** + * This class serves as basis for all Eleventy-specific errors. + * @ignore + */ +class EleventyBaseError extends Error { + /** + * @param {string} message - The error message to display. + * @param {unknown} [originalError] - The original error caught. + */ + constructor(message, originalError) { + super(message); + + this.name = this.constructor.name; + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + if (originalError) { + this.originalError = originalError; + } + } +} +export default EleventyBaseError; diff --git a/node_modules/@11ty/eleventy/src/Errors/EleventyErrorHandler.js b/node_modules/@11ty/eleventy/src/Errors/EleventyErrorHandler.js new file mode 100644 index 0000000..879e65c --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Errors/EleventyErrorHandler.js @@ -0,0 +1,152 @@ +import util from "node:util"; +import debugUtil from "debug"; + +import ConsoleLogger from "../Util/ConsoleLogger.js"; +import EleventyErrorUtil from "./EleventyErrorUtil.js"; + +const debug = debugUtil("Eleventy:EleventyErrorHandler"); + +class EleventyErrorHandler { + constructor() { + this._isVerbose = true; + } + + get isVerbose() { + return this._isVerbose; + } + + set isVerbose(verbose) { + this._isVerbose = !!verbose; + this.logger.isVerbose = !!verbose; + } + + get logger() { + if (!this._logger) { + this._logger = new ConsoleLogger(); + this._logger.isVerbose = this.isVerbose; + } + + return this._logger; + } + + set logger(logger) { + this._logger = logger; + } + + warn(e, msg) { + if (msg) { + this.initialMessage(msg, "warn", "yellow"); + } + this.log(e, "warn"); + } + + fatal(e, msg) { + this.error(e, msg); + process.exitCode = 1; + } + + once(type, e, msg) { + if (e.__errorAlreadyLogged) { + return; + } + + this[type || "error"](e, msg); + + Object.defineProperty(e, "__errorAlreadyLogged", { + value: true, + }); + } + + error(e, msg) { + if (msg) { + this.initialMessage(msg, "error", "red", true); + } + this.log(e, "error", undefined, true); + } + + static getTotalErrorCount(e) { + let totalErrorCount = 0; + let errorCountRef = e; + while (errorCountRef) { + totalErrorCount++; + errorCountRef = errorCountRef.originalError; + } + return totalErrorCount; + } + + //https://nodejs.org/api/process.html + log(e, type = "log", chalkColor = "", forceToConsole = false) { + if (process.env.DEBUG) { + debug("Full error object: %o", util.inspect(e, { showHidden: false, depth: null })); + } + + let showStack = true; + if (e.skipOriginalStack) { + // Don’t show the full error stack trace + showStack = false; + } + + let totalErrorCount = EleventyErrorHandler.getTotalErrorCount(e); + let ref = e; + let index = 1; + while (ref) { + let nextRef = ref.originalError; + + // Unwrap cause from error and assign it to what Eleventy expects + if (nextRef?.cause) { + nextRef.originalError = nextRef.cause?.originalError ?? nextRef?.cause; + } + + if (!nextRef && EleventyErrorUtil.hasEmbeddedError(ref.message)) { + nextRef = EleventyErrorUtil.deconvertErrorToObject(ref); + } + + if (nextRef?.skipOriginalStack) { + showStack = false; + } + + this.logger.message( + `${totalErrorCount > 1 ? `${index}. ` : ""}${( + EleventyErrorUtil.cleanMessage(ref.message) || "(No error message provided)" + ).trim()}${ref.name !== "Error" ? ` (via ${ref.name})` : ""}`, + type, + chalkColor, + forceToConsole, + ); + + if (process.env.DEBUG) { + debug(`(${type} stack): ${ref.stack}`); + } else if (!nextRef) { + // last error in the loop + + // remove duplicate error messages if the stack contains the original message output above + let stackStr = ref.stack || ""; + if (e.removeDuplicateErrorStringFromOutput) { + stackStr = stackStr.replace( + `${ref.name}: ${ref.message}`, + "(Repeated output has been truncated…)", + ); + } + + if (showStack) { + this.logger.message( + "\nOriginal error stack trace: " + stackStr, + type, + chalkColor, + forceToConsole, + ); + } + } + ref = nextRef; + index++; + } + } + + initialMessage(message, type = "log", chalkColor = "blue", forceToConsole = false) { + if (message) { + this.logger.message(message + ":", type, chalkColor, forceToConsole); + } + } +} + +export { EleventyErrorHandler }; diff --git a/node_modules/@11ty/eleventy/src/Errors/EleventyErrorUtil.js b/node_modules/@11ty/eleventy/src/Errors/EleventyErrorUtil.js new file mode 100644 index 0000000..6b374d0 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Errors/EleventyErrorUtil.js @@ -0,0 +1,70 @@ +import TemplateContentPrematureUseError from "./TemplateContentPrematureUseError.js"; + +/* Hack to workaround the variety of error handling schemes in template languages */ +class EleventyErrorUtil { + static get prefix() { + return ">>>>>11ty>>>>>"; + } + static get suffix() { + return "<<<<<11ty<<<<<"; + } + + static hasEmbeddedError(msg) { + if (!msg) { + return false; + } + + return msg.includes(EleventyErrorUtil.prefix) && msg.includes(EleventyErrorUtil.suffix); + } + + static cleanMessage(msg) { + if (!msg) { + return ""; + } + + if (!EleventyErrorUtil.hasEmbeddedError(msg)) { + return "" + msg; + } + + return msg.slice(0, Math.max(0, msg.indexOf(EleventyErrorUtil.prefix))); + } + + static deconvertErrorToObject(error) { + if (!error || !error.message) { + throw new Error(`Could not convert error object from: ${error}`); + } + if (!EleventyErrorUtil.hasEmbeddedError(error.message)) { + return error; + } + + let msg = error.message; + let objectString = msg.substring( + msg.indexOf(EleventyErrorUtil.prefix) + EleventyErrorUtil.prefix.length, + msg.lastIndexOf(EleventyErrorUtil.suffix), + ); + let obj = JSON.parse(objectString); + obj.name = error.name; + return obj; + } + + // pass an error through a random template engine’s error handling unscathed + static convertErrorToString(error) { + return ( + EleventyErrorUtil.prefix + + JSON.stringify({ message: error.message, stack: error.stack }) + + EleventyErrorUtil.suffix + ); + } + + static isPrematureTemplateContentError(e) { + // TODO the rest of the template engines + return ( + e instanceof TemplateContentPrematureUseError || + e?.cause instanceof TemplateContentPrematureUseError || // Custom (per Node-convention) + ["RenderError", "UndefinedVariableError"].includes(e?.originalError?.name) && e?.originalError?.originalError instanceof TemplateContentPrematureUseError || // Liquid + e?.message?.includes("TemplateContentPrematureUseError") // Nunjucks + ); + } +} + +export default EleventyErrorUtil; diff --git a/node_modules/@11ty/eleventy/src/Errors/TemplateContentPrematureUseError.js b/node_modules/@11ty/eleventy/src/Errors/TemplateContentPrematureUseError.js new file mode 100644 index 0000000..5266cd2 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Errors/TemplateContentPrematureUseError.js @@ -0,0 +1,5 @@ +import EleventyBaseError from "./EleventyBaseError.js"; + +class TemplateContentPrematureUseError extends EleventyBaseError {} + +export default TemplateContentPrematureUseError; diff --git a/node_modules/@11ty/eleventy/src/Errors/TemplateContentUnrenderedTemplateError.js b/node_modules/@11ty/eleventy/src/Errors/TemplateContentUnrenderedTemplateError.js new file mode 100644 index 0000000..ee270d5 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Errors/TemplateContentUnrenderedTemplateError.js @@ -0,0 +1,5 @@ +import EleventyBaseError from "./EleventyBaseError.js"; + +class TemplateContentUnrenderedTemplateError extends EleventyBaseError {} + +export default TemplateContentUnrenderedTemplateError; diff --git a/node_modules/@11ty/eleventy/src/Errors/UsingCircularTemplateContentReferenceError.js b/node_modules/@11ty/eleventy/src/Errors/UsingCircularTemplateContentReferenceError.js new file mode 100644 index 0000000..5608feb --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Errors/UsingCircularTemplateContentReferenceError.js @@ -0,0 +1,5 @@ +import EleventyBaseError from "./EleventyBaseError.js"; + +class UsingCircularTemplateContentReferenceError extends EleventyBaseError {} + +export default UsingCircularTemplateContentReferenceError; diff --git a/node_modules/@11ty/eleventy/src/EventBus.js b/node_modules/@11ty/eleventy/src/EventBus.js new file mode 100644 index 0000000..0aa4126 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/EventBus.js @@ -0,0 +1,23 @@ +import debugUtil from "debug"; + +import EventEmitter from "./Util/AsyncEventEmitter.js"; + +const debug = debugUtil("Eleventy:EventBus"); + +/** + * @module 11ty/eleventy/EventBus + * @ignore + */ + +debug("Setting up global EventBus."); +/** + * Provides a global event bus that modules deep down in the stack can + * subscribe to from a global singleton for decoupled pub/sub. + * @type {module:11ty/eleventy/Util/AsyncEventEmitter~AsyncEventEmitter} + */ +let bus = new EventEmitter(); +bus.setMaxListeners(100); // defaults to 10 + +debug("EventBus max listener count: %o", bus.getMaxListeners()); + +export default bus; diff --git a/node_modules/@11ty/eleventy/src/FileSystemSearch.js b/node_modules/@11ty/eleventy/src/FileSystemSearch.js new file mode 100644 index 0000000..972e80b --- /dev/null +++ b/node_modules/@11ty/eleventy/src/FileSystemSearch.js @@ -0,0 +1,129 @@ +import { glob } from "tinyglobby"; +import { TemplatePath } from "@11ty/eleventy-utils"; +import debugUtil from "debug"; + +import FileSystemRemap from "./Util/GlobRemap.js"; +import { isGlobMatch } from "./Util/GlobMatcher.js"; + +const debug = debugUtil("Eleventy:FileSystemSearch"); + +class FileSystemSearch { + constructor() { + this.inputs = {}; + this.outputs = {}; + this.promises = {}; + this.count = 0; + } + + getCacheKey(key, globs, options) { + if (Array.isArray(globs)) { + globs = globs.sort(); + } + return key + JSON.stringify(globs) + JSON.stringify(options); + } + + // returns a promise + search(key, globs, options = {}) { + debug("Glob search (%o) searching for: %o", key, globs); + + if (!Array.isArray(globs)) { + globs = [globs]; + } + + // Strip leading slashes from everything! + globs = globs.map((entry) => TemplatePath.stripLeadingDotSlash(entry)); + + let cwd = FileSystemRemap.getCwd(globs); + if (cwd) { + options.cwd = cwd; + } + + if (options.ignore && Array.isArray(options.ignore)) { + options.ignore = options.ignore.map((entry) => { + entry = TemplatePath.stripLeadingDotSlash(entry); + + return FileSystemRemap.remapInput(entry, cwd); + }); + debug("Glob search (%o) ignoring: %o", key, options.ignore); + } + + let cacheKey = this.getCacheKey(key, globs, options); + + // Only after the promise has resolved + if (this.outputs[cacheKey]) { + return Array.from(this.outputs[cacheKey]); + } + + if (!this.promises[cacheKey]) { + this.inputs[cacheKey] = { + input: globs, + options, + }; + + this.count++; + + globs = globs.map((entry) => { + if (cwd && entry.startsWith(cwd)) { + return FileSystemRemap.remapInput(entry, cwd); + } + + return entry; + }); + + this.promises[cacheKey] = glob( + globs, + Object.assign( + { + caseSensitiveMatch: false, // insensitive + dot: true, + }, + options, + ), + ).then((results) => { + this.outputs[cacheKey] = new Set( + results.map((entry) => { + let remapped = FileSystemRemap.remapOutput(entry, options.cwd); + return TemplatePath.standardizeFilePath(remapped); + }), + ); + + return Array.from(this.outputs[cacheKey]); + }); + } + + // may be an unresolved promise + return this.promises[cacheKey]; + } + + _modify(path, setOperation) { + path = TemplatePath.stripLeadingDotSlash(path); + + let normalized = TemplatePath.standardizeFilePath(path); + + for (let key in this.inputs) { + let { input, options } = this.inputs[key]; + if ( + isGlobMatch(path, input, { + ignore: options.ignore, + }) + ) { + this.outputs[key][setOperation](normalized); + } + } + } + + add(path) { + this._modify(path, "add"); + } + + delete(path) { + this._modify(path, "delete"); + } + + // Issue #3859 get rid of chokidar globs + // getAllOutputFiles() { + // return Object.values(this.outputs).map(set => Array.from(set)).flat(); + // } +} + +export default FileSystemSearch; diff --git a/node_modules/@11ty/eleventy/src/Filters/GetCollectionItem.js b/node_modules/@11ty/eleventy/src/Filters/GetCollectionItem.js new file mode 100644 index 0000000..7512940 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Filters/GetCollectionItem.js @@ -0,0 +1,20 @@ +export default function getCollectionItem(collection, page, modifier = 0) { + let j = 0; + let index; + for (let item of collection) { + if ( + item.inputPath === page.inputPath && + (item.outputPath === page.outputPath || item.url === page.url) + ) { + index = j; + break; + } + j++; + } + + if (index !== undefined && collection?.length) { + if (index + modifier >= 0 && index + modifier < collection.length) { + return collection[index + modifier]; + } + } +} diff --git a/node_modules/@11ty/eleventy/src/Filters/GetCollectionItemIndex.js b/node_modules/@11ty/eleventy/src/Filters/GetCollectionItemIndex.js new file mode 100644 index 0000000..9e12854 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Filters/GetCollectionItemIndex.js @@ -0,0 +1,17 @@ +// TODO locale-friendly, see GetLocaleCollectionItem.js) +export default function getCollectionItemIndex(collection, page) { + if (!page) { + page = this.page; + } + + let j = 0; + for (let item of collection) { + if ( + item.inputPath === page.inputPath && + (item.outputPath === page.outputPath || item.url === page.url) + ) { + return j; + } + j++; + } +} diff --git a/node_modules/@11ty/eleventy/src/Filters/GetLocaleCollectionItem.js b/node_modules/@11ty/eleventy/src/Filters/GetLocaleCollectionItem.js new file mode 100644 index 0000000..1f96622 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Filters/GetLocaleCollectionItem.js @@ -0,0 +1,47 @@ +import getCollectionItem from "./GetCollectionItem.js"; + +// Work with I18n Plugin src/Plugins/I18nPlugin.js to retrieve root pages (not i18n pages) +function resolveRootPage(config, pageOverride, languageCode) { + let localeFilter = config.getFilter("locale_page"); + if (!localeFilter || typeof localeFilter !== "function") { + return pageOverride; + } + + // returns root/default-language `page` object + return localeFilter.call(this, pageOverride, languageCode); +} + +function getLocaleCollectionItem(config, collection, pageOverride, langCode, indexModifier = 0) { + if (!langCode) { + // if page.lang exists (2.0.0-canary.14 and i18n plugin added, use page language) + if (this.page.lang) { + langCode = this.page.lang; + } else { + return getCollectionItem(collection, pageOverride || this.page, indexModifier); + } + } + + let rootPage = resolveRootPage.call(this, config, pageOverride); // implied current page, default language + let modifiedRootItem = getCollectionItem(collection, rootPage, indexModifier); + if (!modifiedRootItem) { + return; // no root item exists for the previous/next page + } + + // Resolve modified root `page` back to locale `page` + // This will return a non localized version of the page as a fallback + let modifiedLocalePage = resolveRootPage.call(this, config, modifiedRootItem.data.page, langCode); + // already localized (or default language) + if (!("__locale_page_resolved" in modifiedLocalePage)) { + return modifiedRootItem; + } + + // find the modified locale `page` again in `collections.all` + let all = + this.collections?.all || + this.ctx?.collections?.all || + this.context?.environments?.collections?.all || + []; + return getCollectionItem(all, modifiedLocalePage, 0); +} + +export default getLocaleCollectionItem; diff --git a/node_modules/@11ty/eleventy/src/Filters/Slug.js b/node_modules/@11ty/eleventy/src/Filters/Slug.js new file mode 100644 index 0000000..03a77cc --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Filters/Slug.js @@ -0,0 +1,14 @@ +import slugify from "slugify"; + +export default function (str, options = {}) { + return slugify( + "" + str, + Object.assign( + { + replacement: "-", + lower: true, + }, + options, + ), + ); +} diff --git a/node_modules/@11ty/eleventy/src/Filters/Slugify.js b/node_modules/@11ty/eleventy/src/Filters/Slugify.js new file mode 100644 index 0000000..e84b42d --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Filters/Slugify.js @@ -0,0 +1,14 @@ +import slugify from "@sindresorhus/slugify"; + +export default function (str, options = {}) { + return slugify( + "" + str, + Object.assign( + { + // lowercase: true, // default + decamelize: false, + }, + options, + ), + ); +} diff --git a/node_modules/@11ty/eleventy/src/Filters/Url.js b/node_modules/@11ty/eleventy/src/Filters/Url.js new file mode 100644 index 0000000..87fc1e2 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Filters/Url.js @@ -0,0 +1,35 @@ +import { TemplatePath } from "@11ty/eleventy-utils"; + +import isValidUrl from "../Util/ValidUrl.js"; + +// Note: This filter is used in the Eleventy Navigation plugin in versions prior to 0.3.4 +export default function (url, pathPrefix) { + // work with undefined + url = url || ""; + + if (isValidUrl(url) || (url.startsWith("//") && url !== "//")) { + return url; + } + + if (pathPrefix === undefined || typeof pathPrefix !== "string") { + // When you retrieve this with config.getFilter("url") it + // grabs the pathPrefix argument from your config for you (see defaultConfig.js) + throw new Error("pathPrefix (String) is required in the `url` filter."); + } + + let normUrl = TemplatePath.normalizeUrlPath(url); + let normRootDir = TemplatePath.normalizeUrlPath("/", pathPrefix); + let normFull = TemplatePath.normalizeUrlPath("/", pathPrefix, url); + let isRootDirTrailingSlash = + normRootDir.length && normRootDir.charAt(normRootDir.length - 1) === "/"; + + // minor difference with straight `normalize`, "" resolves to root dir and not "." + // minor difference with straight `normalize`, "/" resolves to root dir + if (normUrl === "/" || normUrl === normRootDir) { + return normRootDir + (!isRootDirTrailingSlash ? "/" : ""); + } else if (normUrl.indexOf("/") === 0) { + return normFull; + } + + return normUrl; +} diff --git a/node_modules/@11ty/eleventy/src/GlobalDependencyMap.js b/node_modules/@11ty/eleventy/src/GlobalDependencyMap.js new file mode 100644 index 0000000..7e169da --- /dev/null +++ b/node_modules/@11ty/eleventy/src/GlobalDependencyMap.js @@ -0,0 +1,463 @@ +import debugUtil from "debug"; +import { TemplatePath } from "@11ty/eleventy-utils"; + +import JavaScriptDependencies from "./Util/JavaScriptDependencies.js"; +import PathNormalizer from "./Util/PathNormalizer.js"; +import { TemplateDepGraph } from "./Util/TemplateDepGraph.js"; + +const debug = debugUtil("Eleventy:Dependencies"); + +class GlobalDependencyMap { + // dependency-graph requires these keys to be alphabetic strings + static LAYOUT_KEY = "layout"; + static COLLECTION_PREFIX = "__collection:"; // must match TemplateDepGraph key + + #map; + #templateConfig; + #cachedUserConfigurationCollectionApiNames; + + static isCollection(entry) { + return entry.startsWith(this.COLLECTION_PREFIX); + } + + static getTagName(entry) { + if (this.isCollection(entry)) { + return entry.slice(this.COLLECTION_PREFIX.length); + } + } + + static getCollectionKeyForEntry(entry) { + return `${GlobalDependencyMap.COLLECTION_PREFIX}${entry}`; + } + + reset() { + this.#map = undefined; + } + + setIsEsm(isEsm) { + this.isEsm = isEsm; + } + + setTemplateConfig(templateConfig) { + this.#templateConfig = templateConfig; + + // These have leading dot slashes, but so do the paths from Eleventy + this.#templateConfig.userConfig.events.once("eleventy.layouts", async (layouts) => { + await this.addLayoutsToMap(layouts); + }); + } + + get userConfigurationCollectionApiNames() { + if (this.#cachedUserConfigurationCollectionApiNames) { + return this.#cachedUserConfigurationCollectionApiNames; + } + return Object.keys(this.#templateConfig.userConfig.getCollections()) || []; + } + + initializeUserConfigurationApiCollections() { + this.addCollectionApiNames(this.userConfigurationCollectionApiNames); + } + + // For Testing + setCollectionApiNames(names = []) { + this.#cachedUserConfigurationCollectionApiNames = names; + } + + addCollectionApiNames(names = []) { + if (!names || names.length === 0) { + return; + } + + for (let collectionName of names) { + this.map.addConfigCollectionName(collectionName); + } + } + + filterOutLayouts(nodes = []) { + return nodes.filter((node) => { + if (GlobalDependencyMap.isLayoutNode(this.map, node)) { + return false; + } + return true; + }); + } + + filterOutCollections(nodes = []) { + return nodes.filter((node) => !node.startsWith(GlobalDependencyMap.COLLECTION_PREFIX)); + } + + static removeLayoutNodes(graph, nodeList) { + return nodeList.filter((node) => { + if (this.isLayoutNode(graph, node)) { + return false; + } + return true; + }); + } + + removeLayoutNodes(normalizedLayouts) { + let nodes = this.map.overallOrder(); + for (let node of nodes) { + if (!GlobalDependencyMap.isLayoutNode(this.map, node)) { + continue; + } + + // previous layout is not in the new layout map (no templates are using it) + if (!normalizedLayouts[node]) { + this.map.removeNode(node); + } + // important: if the layout map changed to have different templates (but was not removed) + // this is already handled by `resetNode` called via TemplateMap + } + } + + // Eleventy Layouts don’t show up in the dependency graph, so we handle those separately + async addLayoutsToMap(layouts) { + let normalizedLayouts = this.normalizeLayoutsObject(layouts); + + // Clear out any previous layout relationships to make way for the new ones + this.removeLayoutNodes(normalizedLayouts); + + for (let layout in normalizedLayouts) { + // We add this pre-emptively to add the `layout` data + if (!this.map.hasNode(layout)) { + this.map.addNode(layout, { + type: GlobalDependencyMap.LAYOUT_KEY, + }); + } else { + this.map.setNodeData(layout, { + type: GlobalDependencyMap.LAYOUT_KEY, + }); + } + + // Potential improvement: only add the first template in the chain for a template and manage any upstream layouts by their own relationships + for (let pageTemplate of normalizedLayouts[layout]) { + this.addDependency(pageTemplate, [layout]); + } + + if (this.#templateConfig?.shouldSpiderJavaScriptDependencies()) { + let deps = await JavaScriptDependencies.getDependencies([layout], this.isEsm); + this.addDependency(layout, deps); + } + } + } + + get map() { + if (!this.#map) { + // this.#map = new DepGraph({ circular: true }); + this.#map = new TemplateDepGraph(); + } + + return this.#map; + } + + set map(graph) { + this.#map = graph; + } + + normalizeNode(node) { + if (!node) { + return; + } + + // TODO tests for this + // Fix URL objects passed in (sass does this) + if (typeof node !== "string" && "toString" in node) { + node = node.toString(); + } + + if (typeof node !== "string") { + throw new Error("`addDependencies` files must be strings. Received:" + node); + } + + return PathNormalizer.fullNormalization(node); + } + + normalizeLayoutsObject(layouts) { + let o = {}; + for (let rawLayout in layouts) { + let layout = this.normalizeNode(rawLayout); + o[layout] = layouts[rawLayout].map((entry) => this.normalizeNode(entry)); + } + return o; + } + + getDependantsFor(node) { + if (!node) { + return []; + } + + node = this.normalizeNode(node); + + if (!this.map.hasNode(node)) { + return []; + } + + // Direct dependants and dependencies, both publish and consume from collections + return this.map.directDependantsOf(node); + } + + hasNode(node) { + return this.map.hasNode(this.normalizeNode(node)); + } + + findCollectionsRemovedFrom(node, collectionNames) { + if (!this.hasNode(node)) { + return new Set(); + } + + let prevDeps = this.getDependantsFor(node) + .map((entry) => GlobalDependencyMap.getTagName(entry)) + .filter(Boolean); + + let prevDepsSet = new Set(prevDeps); + let deleted = new Set(); + for (let dep of prevDepsSet) { + if (!collectionNames.has(dep)) { + deleted.add(dep); + } + } + + return deleted; + } + + resetNode(node) { + node = this.normalizeNode(node); + + if (!this.map.hasNode(node)) { + return; + } + + // We don’t want to remove relationships that consume this, controlled by the upstream content + // for (let dep of this.map.directDependantsOf(node)) { + // this.map.removeDependency(dep, node); + // } + + for (let dep of this.map.directDependenciesOf(node)) { + this.map.removeDependency(node, dep); + } + } + + getTemplatesThatConsumeCollections(collectionNames) { + let templates = new Set(); + for (let name of collectionNames) { + let collectionKey = GlobalDependencyMap.getCollectionKeyForEntry(name); + if (!this.map.hasNode(collectionKey)) { + continue; + } + for (let node of this.map.dependantsOf(collectionKey)) { + if (!node.startsWith(GlobalDependencyMap.COLLECTION_PREFIX)) { + if (!GlobalDependencyMap.isLayoutNode(this.map, node)) { + templates.add(node); + } + } + } + } + return templates; + } + + static isLayoutNode(graph, node) { + if (!graph.hasNode(node)) { + return false; + } + return graph.getNodeData(node)?.type === GlobalDependencyMap.LAYOUT_KEY; + } + + getLayoutsUsedBy(node) { + node = this.normalizeNode(node); + + if (!this.map.hasNode(node)) { + return []; + } + + let layouts = []; + + // include self, if layout + if (GlobalDependencyMap.isLayoutNode(this.map, node)) { + layouts.push(node); + } + + this.map.dependantsOf(node).forEach((node) => { + // we only want layouts + if (GlobalDependencyMap.isLayoutNode(this.map, node)) { + return layouts.push(node); + } + }); + + return layouts; + } + + // In order + // Does not include original templatePaths (unless *they* are second-order relevant) + getTemplatesRelevantToTemplateList(templatePaths) { + let overallOrder = this.map.overallOrder(); + overallOrder = this.filterOutLayouts(overallOrder); + overallOrder = this.filterOutCollections(overallOrder); + + let relevantLookup = {}; + for (let inputPath of templatePaths) { + inputPath = TemplatePath.stripLeadingDotSlash(inputPath); + + let deps = this.getDependencies(inputPath, false); + + if (Array.isArray(deps)) { + let paths = this.filterOutCollections(deps); + for (let node of paths) { + relevantLookup[node] = true; + } + } + } + + return overallOrder.filter((node) => { + if (relevantLookup[node]) { + return true; + } + return false; + }); + } + + // Layouts are not relevant to compile cache and can be ignored + getDependencies(node, includeLayouts = true) { + node = this.normalizeNode(node); + + // `false` means the Node was unknown + if (!this.map.hasNode(node)) { + return false; + } + + if (includeLayouts) { + return this.map.dependenciesOf(node).filter(Boolean); + } + + return GlobalDependencyMap.removeLayoutNodes(this.map, this.map.dependenciesOf(node)); + } + + #addNode(name) { + if (this.map.hasNode(name)) { + return; + } + + this.map.addNode(name); + } + + // node arguments are already normalized + #addDependency(from, toArray = []) { + this.#addNode(from); // only if not already added + + if (!Array.isArray(toArray)) { + throw new Error("Second argument to `addDependency` must be an Array."); + } + + // debug("%o depends on %o", from, toArray); + for (let to of toArray) { + this.#addNode(to); // only if not already added + if (from !== to) { + this.map.addDependency(from, to); + } + } + } + + addDependency(from, toArray = []) { + this.#addDependency( + this.normalizeNode(from), + toArray.map((to) => this.normalizeNode(to)), + ); + } + + addNewNodeRelationships(from, consumes = [], publishes = []) { + consumes = consumes.filter(Boolean); + publishes = publishes.filter(Boolean); + + debug("%o consumes %o and publishes to %o", from, consumes, publishes); + from = this.normalizeNode(from); + + this.map.addTemplate(from, consumes, publishes); + } + + // Layouts are not relevant to compile cache and can be ignored + hasDependency(from, to, includeLayouts) { + to = this.normalizeNode(to); + + let deps = this.getDependencies(from, includeLayouts); // normalizes `from` + + if (!deps) { + return false; + } + + return deps.includes(to); + } + + // Layouts are not relevant to compile cache and can be ignored + isFileRelevantTo(fullTemplateInputPath, comparisonFile, includeLayouts) { + fullTemplateInputPath = this.normalizeNode(fullTemplateInputPath); + comparisonFile = this.normalizeNode(comparisonFile); + + // No watch/serve changed file + if (!comparisonFile) { + return false; + } + + // The file that changed is the relevant file + if (fullTemplateInputPath === comparisonFile) { + return true; + } + + // The file that changed is a dependency of the template + // comparisonFile is used by fullTemplateInputPath + if (this.hasDependency(fullTemplateInputPath, comparisonFile, includeLayouts)) { + return true; + } + + return false; + } + + isFileUsedBy(parent, child, includeLayouts) { + if (this.hasDependency(parent, child, includeLayouts)) { + // child is used by parent + return true; + } + return false; + } + + getTemplateOrder() { + let order = []; + for (let entry of this.map.overallOrder()) { + order.push(entry); + } + + return order; + } + + stringify() { + return JSON.stringify(this.map, function replacer(key, value) { + // Serialize internal Map objects. + if (value instanceof Map) { + let obj = {}; + for (let [k, v] of value) { + obj[k] = v; + } + return obj; + } + + return value; + }); + } + + restore(persisted) { + let obj = JSON.parse(persisted); + let graph = new TemplateDepGraph(); + + // https://github.com/jriecken/dependency-graph/issues/44 + // Restore top level serialized Map objects (in stringify above) + for (let key in obj) { + let map = graph[key]; + for (let k in obj[key]) { + let v = obj[key][k]; + map.set(k, v); + } + } + this.map = graph; + } +} + +export default GlobalDependencyMap; diff --git a/node_modules/@11ty/eleventy/src/LayoutCache.js b/node_modules/@11ty/eleventy/src/LayoutCache.js new file mode 100644 index 0000000..006f502 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/LayoutCache.js @@ -0,0 +1,98 @@ +import { TemplatePath } from "@11ty/eleventy-utils"; + +import eventBus from "./EventBus.js"; + +// Note: this is only used for TemplateLayout right now but could be used for more +// Just be careful because right now the TemplateLayout cache keys are not directly mapped to paths +// So you may get collisions if you use this for other things. +class LayoutCache { + constructor() { + this.cache = {}; + this.cacheByInputPath = {}; + } + + clear() { + this.cache = {}; + this.cacheByInputPath = {}; + } + + // alias + removeAll() { + for (let layoutFilePath in this.cacheByInputPath) { + this.remove(layoutFilePath); + } + this.clear(); + } + + size() { + return Object.keys(this.cacheByInputPath).length; + } + + add(layoutTemplate) { + let keys = new Set(); + + if (typeof layoutTemplate === "string") { + throw new Error( + "Invalid argument type passed to LayoutCache->add(). Should be a TemplateLayout.", + ); + } + + if ("getFullKey" in layoutTemplate) { + keys.add(layoutTemplate.getFullKey()); + } + + if ("getKey" in layoutTemplate) { + // if `key` was an alias, also set to the pathed layout value too + // e.g. `layout: "default"` and `layout: "default.liquid"` will both map to the same template. + keys.add(layoutTemplate.getKey()); + } + + for (let key of keys) { + this.cache[key] = layoutTemplate; + } + + // also the full template input path for use with eleventy --serve/--watch e.g. `_includes/default.liquid` (see `remove` below) + let fullPath = TemplatePath.stripLeadingDotSlash(layoutTemplate.inputPath); + this.cacheByInputPath[fullPath] = layoutTemplate; + } + + has(key) { + return key in this.cache; + } + + get(key) { + if (!this.has(key)) { + throw new Error(`Could not find ${key} in LayoutCache.`); + } + + return this.cache[key]; + } + + remove(layoutFilePath) { + layoutFilePath = TemplatePath.stripLeadingDotSlash(layoutFilePath); + if (!this.cacheByInputPath[layoutFilePath]) { + // not a layout file + return; + } + + let layoutTemplate = this.cacheByInputPath[layoutFilePath]; + layoutTemplate.resetCaches(); + + let keys = layoutTemplate.getCacheKeys(); + for (let key of keys) { + delete this.cache[key]; + } + + delete this.cacheByInputPath[layoutFilePath]; + } +} + +let layoutCache = new LayoutCache(); + +eventBus.on("eleventy.resourceModified", () => { + // https://github.com/11ty/eleventy-plugin-bundle/issues/10 + layoutCache.removeAll(); +}); + +// singleton +export default layoutCache; diff --git a/node_modules/@11ty/eleventy/src/Plugins/HtmlBasePlugin.js b/node_modules/@11ty/eleventy/src/Plugins/HtmlBasePlugin.js new file mode 100644 index 0000000..304c0a2 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Plugins/HtmlBasePlugin.js @@ -0,0 +1,160 @@ +import { DeepCopy } from "@11ty/eleventy-utils"; +import urlFilter from "../Filters/Url.js"; +import PathPrefixer from "../Util/PathPrefixer.js"; +import { HtmlTransformer } from "../Util/HtmlTransformer.js"; +import isValidUrl from "../Util/ValidUrl.js"; + +function addPathPrefixToUrl(url, pathPrefix, base) { + let u; + if (base) { + u = new URL(url, base); + } else { + u = new URL(url); + } + + // Add pathPrefix **after** url is transformed using base + if (pathPrefix) { + u.pathname = PathPrefixer.joinUrlParts(pathPrefix, u.pathname); + } + return u.toString(); +} + +// pathprefix is only used when overrideBase is a full URL +function transformUrl(url, base, opts = {}) { + let { pathPrefix, pageUrl, htmlContext } = opts; + + // Warning, this will not work with HtmlTransformer, as we’ll receive "false" (string) here instead of `false` (boolean) + if (url === false) { + throw new Error( + `Invalid url transformed in the HTML \`\` plugin.${url === false ? ` Did you attempt to link to a \`permalink: false\` page?` : ""} Received: ${url}`, + ); + } + + // full URL, return as-is + if (isValidUrl(url)) { + return url; + } + + // Not a full URL, but with a full base URL + // e.g. relative urls like "subdir/", "../subdir", "./subdir" + if (isValidUrl(base)) { + // convert relative paths to absolute path first using pageUrl + if (pageUrl && !url.startsWith("/")) { + let urlObj = new URL(url, `http://example.com${pageUrl}`); + url = urlObj.pathname + (urlObj.hash || ""); + } + + return addPathPrefixToUrl(url, pathPrefix, base); + } + + // Not a full URL, nor a full base URL (call the built-in `url` filter) + return urlFilter(url, base); +} + +function eleventyHtmlBasePlugin(eleventyConfig, defaultOptions = {}) { + let opts = DeepCopy( + { + // eleventyConfig.pathPrefix is new in Eleventy 2.0.0-canary.15 + // `base` can be a directory (for path prefix transformations) + // OR a full URL with origin and pathname + baseHref: eleventyConfig.pathPrefix, + + extensions: "html", + }, + defaultOptions, + ); + + // `filters` option to rename filters was removed in 3.0.0-alpha.13 + // Renaming these would cause issues in other plugins (e.g. RSS) + if (opts.filters !== undefined) { + throw new Error( + "The `filters` option in the HTML Base plugin was removed to prevent future cross-plugin compatibility issues.", + ); + } + + if (opts.baseHref === undefined) { + throw new Error("The `baseHref` option is required in the HTML Base plugin."); + } + + eleventyConfig.addFilter("addPathPrefixToFullUrl", function (url) { + return addPathPrefixToUrl(url, eleventyConfig.pathPrefix); + }); + + // Apply to one URL + eleventyConfig.addFilter( + "htmlBaseUrl", + + /** @this {object} */ + function (url, baseOverride, pageUrlOverride) { + let base = baseOverride || opts.baseHref; + + // Do nothing with a default base + if (base === "/") { + return url; + } + + return transformUrl(url, base, { + pathPrefix: eleventyConfig.pathPrefix, + pageUrl: pageUrlOverride || this.page?.url, + }); + }, + ); + + // Apply to a block of HTML + eleventyConfig.addAsyncFilter( + "transformWithHtmlBase", + + /** @this {object} */ + function (content, baseOverride, pageUrlOverride) { + let base = baseOverride || opts.baseHref; + + // Do nothing with a default base + if (base === "/") { + return content; + } + + return HtmlTransformer.transformStandalone(content, (url, htmlContext) => { + return transformUrl(url.trim(), base, { + pathPrefix: eleventyConfig.pathPrefix, + pageUrl: pageUrlOverride || this.page?.url, + htmlContext, + }); + }); + }, + ); + + // Apply to all HTML output in your project + eleventyConfig.htmlTransformer.addUrlTransform( + opts.extensions, + + /** @this {object} */ + function (urlInMarkup, htmlContext) { + // baseHref override is via renderTransforms filter for adding the absolute URL (e.g. https://example.com/pathPrefix/) for RSS/Atom/JSON feeds + return transformUrl(urlInMarkup.trim(), this.baseHref || opts.baseHref, { + pathPrefix: eleventyConfig.pathPrefix, + pageUrl: this.url, + htmlContext, + }); + }, + { + priority: -2, // priority is descending, so this runs last (especially after AutoCopy and InputPathToUrl transform) + enabled: function (context) { + // Enabled when pathPrefix is non-default or via renderTransforms + return Boolean(context.baseHref) || opts.baseHref !== "/"; + }, + }, + ); +} + +Object.defineProperty(eleventyHtmlBasePlugin, "eleventyPackage", { + value: "@11ty/eleventy/html-base-plugin", +}); + +Object.defineProperty(eleventyHtmlBasePlugin, "eleventyPluginOptions", { + value: { + unique: true, + }, +}); + +export default eleventyHtmlBasePlugin; +export { transformUrl as applyBaseToUrl }; diff --git a/node_modules/@11ty/eleventy/src/Plugins/HtmlRelativeCopyPlugin.js b/node_modules/@11ty/eleventy/src/Plugins/HtmlRelativeCopyPlugin.js new file mode 100644 index 0000000..ac1391d --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Plugins/HtmlRelativeCopyPlugin.js @@ -0,0 +1,52 @@ +import { HtmlRelativeCopy } from "../Util/HtmlRelativeCopy.js"; + +// one HtmlRelativeCopy instance per entry +function init(eleventyConfig, options) { + let opts = Object.assign( + { + extensions: "html", + match: false, // can be one glob string or an array of globs + paths: [], // directories to also look in for files + failOnError: true, // fails when a path matches (via `match`) but not found on file system + copyOptions: undefined, + }, + options, + ); + + let htmlrel = new HtmlRelativeCopy(); + htmlrel.setUserConfig(eleventyConfig); + htmlrel.addMatchingGlob(opts.match); + htmlrel.setFailOnError(opts.failOnError); + htmlrel.setCopyOptions(opts.copyOptions); + + eleventyConfig.htmlTransformer.addUrlTransform( + opts.extensions, + function (targetFilepathOrUrl) { + // @ts-ignore + htmlrel.copy(targetFilepathOrUrl, this.page.inputPath, this.page.outputPath); + + // TODO front matter option for manual copy + return targetFilepathOrUrl; + }, + { + enabled: () => htmlrel.isEnabled(), + // - MUST run after other plugins but BEFORE HtmlBase plugin + priority: -1, + }, + ); + + htmlrel.addPaths(opts.paths); +} + +function HtmlRelativeCopyPlugin(eleventyConfig) { + // Important: if this is empty, no URL transforms are added + for (let options of eleventyConfig.passthroughCopiesHtmlRelative) { + init(eleventyConfig, options); + } +} + +Object.defineProperty(HtmlRelativeCopyPlugin, "eleventyPackage", { + value: "@11ty/eleventy/html-relative-copy-plugin", +}); + +export { HtmlRelativeCopyPlugin }; diff --git a/node_modules/@11ty/eleventy/src/Plugins/I18nPlugin.js b/node_modules/@11ty/eleventy/src/Plugins/I18nPlugin.js new file mode 100644 index 0000000..6f53825 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Plugins/I18nPlugin.js @@ -0,0 +1,317 @@ +import { bcp47Normalize } from "bcp-47-normalize"; +import iso639 from "iso-639-1"; +import { DeepCopy } from "@11ty/eleventy-utils"; + +// pathPrefix note: +// When using `locale_url` filter with the `url` filter, `locale_url` must run first like +// `| locale_url | url`. If you run `| url | locale_url` it won’t match correctly. + +// TODO improvement would be to throw an error if `locale_url` finds a url with the +// path prefix at the beginning? Would need a better way to know `url` has transformed a string +// rather than just raw comparison. +// e.g. --pathprefix=/en/ should return `/en/en/` for `/en/index.liquid` + +class LangUtils { + static getLanguageCodeFromInputPath(filepath) { + return (filepath || "").split("/").find((entry) => Comparator.isLangCode(entry)); + } + + static getLanguageCodeFromUrl(url) { + let s = (url || "").split("/"); + return s.length > 0 && Comparator.isLangCode(s[1]) ? s[1] : ""; + } + + static swapLanguageCodeNoCheck(str, langCode) { + let found = false; + return str + .split("/") + .map((entry) => { + // only match the first one + if (!found && Comparator.isLangCode(entry)) { + found = true; + return langCode; + } + return entry; + }) + .join("/"); + } + + static swapLanguageCode(str, langCode) { + if (!Comparator.isLangCode(langCode)) { + return str; + } + + return LangUtils.swapLanguageCodeNoCheck(str, langCode); + } +} + +class Comparator { + // https://en.wikipedia.org/wiki/IETF_language_tag#Relation_to_other_standards + // Requires a ISO-639-1 language code at the start (2 characters before the first -) + static isLangCode(code) { + let [s] = (code || "").split("-"); + if (!iso639.validate(s)) { + return false; + } + if (!bcp47Normalize(code)) { + return false; + } + return true; + } + + static urlHasLangCode(url, code) { + if (!Comparator.isLangCode(code)) { + return false; + } + + return url.split("/").some((entry) => entry === code); + } +} + +function normalizeInputPath(inputPath, extensionMap) { + if (extensionMap) { + return extensionMap.removeTemplateExtension(inputPath); + } + return inputPath; +} + +/* + * Input: { + * '/en-us/test/': './test/stubs-i18n/en-us/test.11ty.js', + * '/en/test/': './test/stubs-i18n/en/test.liquid', + * '/es/test/': './test/stubs-i18n/es/test.njk', + * '/non-lang-file/': './test/stubs-i18n/non-lang-file.njk' + * } + * + * Output: { + * '/en-us/test/': [ { url: '/en/test/' }, { url: '/es/test/' } ], + * '/en/test/': [ { url: '/en-us/test/' }, { url: '/es/test/' } ], + * '/es/test/': [ { url: '/en-us/test/' }, { url: '/en/test/' } ] + * } + */ +function getLocaleUrlsMap(urlToInputPath, extensionMap, options = {}) { + let filemap = {}; + + for (let url in urlToInputPath) { + // Group number comes from Pagination.js + let { inputPath: originalFilepath, groupNumber } = urlToInputPath[url]; + let filepath = normalizeInputPath(originalFilepath, extensionMap); + let replaced = + LangUtils.swapLanguageCodeNoCheck(filepath, "__11ty_i18n") + `_group:${groupNumber}`; + + if (!filemap[replaced]) { + filemap[replaced] = []; + } + + let langCode = LangUtils.getLanguageCodeFromInputPath(originalFilepath); + if (!langCode) { + langCode = LangUtils.getLanguageCodeFromUrl(url); + } + if (!langCode) { + langCode = options.defaultLanguage; + } + + if (langCode) { + filemap[replaced].push({ + url, + lang: langCode, + label: iso639.getNativeName(langCode.split("-")[0]), + }); + } else { + filemap[replaced].push({ url }); + } + } + + // Default sorted by lang code + for (let key in filemap) { + filemap[key].sort(function (a, b) { + if (a.lang < b.lang) { + return -1; + } + if (a.lang > b.lang) { + return 1; + } + return 0; + }); + } + + // map of input paths => array of localized urls + let urlMap = {}; + for (let filepath in filemap) { + for (let entry of filemap[filepath]) { + let url = entry.url; + if (!urlMap[url]) { + urlMap[url] = filemap[filepath].filter((entry) => { + if (entry.lang) { + return true; + } + return entry.url !== url; + }); + } + } + } + + return urlMap; +} + +function eleventyI18nPlugin(eleventyConfig, opts = {}) { + let options = DeepCopy( + { + defaultLanguage: "", + filters: { + url: "locale_url", + links: "locale_links", + }, + errorMode: "strict", // allow-fallback, never + }, + opts, + ); + + if (!options.defaultLanguage) { + throw new Error( + "You must specify a `defaultLanguage` in Eleventy’s Internationalization (I18N) plugin.", + ); + } + + let extensionMap; + eleventyConfig.on("eleventy.extensionmap", (map) => { + extensionMap = map; + }); + + let bench = eleventyConfig.benchmarkManager.get("Aggregate"); + let contentMaps = {}; + eleventyConfig.on("eleventy.contentMap", function ({ urlToInputPath, inputPathToUrl }) { + let b = bench.get("(i18n Plugin) Setting up content map."); + b.before(); + contentMaps.inputPathToUrl = inputPathToUrl; + contentMaps.urlToInputPath = urlToInputPath; + + contentMaps.localeUrlsMap = getLocaleUrlsMap(urlToInputPath, extensionMap, options); + b.after(); + }); + + eleventyConfig.addGlobalData("eleventyComputed.page.lang", () => { + // if addGlobalData receives a function it will execute it immediately, + // so we return a nested function for computed data + return (data) => { + return LangUtils.getLanguageCodeFromUrl(data.page.url) || options.defaultLanguage; + }; + }); + + // Normalize a theoretical URL based on the current page’s language + // If a non-localized file exists, returns the URL without a language assigned + // Fails if no file exists (localized and not localized) + eleventyConfig.addFilter(options.filters.url, function (url, langCodeOverride) { + let langCode = + langCodeOverride || + LangUtils.getLanguageCodeFromUrl(this.page?.url) || + options.defaultLanguage; + + // Already has a language code on it and has a relevant url with the target language code + if ( + contentMaps.localeUrlsMap[url] || + (!url.endsWith("/") && contentMaps.localeUrlsMap[`${url}/`]) + ) { + for (let existingUrlObj of contentMaps.localeUrlsMap[url] || + contentMaps.localeUrlsMap[`${url}/`]) { + if (Comparator.urlHasLangCode(existingUrlObj.url, langCode)) { + return existingUrlObj.url; + } + } + } + + // Needs the language code prepended to the URL + let prependedLangCodeUrl = `/${langCode}${url}`; + if ( + contentMaps.localeUrlsMap[prependedLangCodeUrl] || + (!prependedLangCodeUrl.endsWith("/") && contentMaps.localeUrlsMap[`${prependedLangCodeUrl}/`]) + ) { + return prependedLangCodeUrl; + } + + if ( + contentMaps.urlToInputPath[url] || + (!url.endsWith("/") && contentMaps.urlToInputPath[`${url}/`]) + ) { + // this is not a localized file (independent of a language code) + if (options.errorMode === "strict") { + throw new Error( + `Localized file for URL ${prependedLangCodeUrl} was not found in your project. A non-localized version does exist—are you sure you meant to use the \`${options.filters.url}\` filter for this? You can bypass this error using the \`errorMode\` option in the I18N plugin (current value: "${options.errorMode}").`, + ); + } + } else if (options.errorMode === "allow-fallback") { + // You’re linking to a localized file that doesn’t exist! + throw new Error( + `Localized file for URL ${prependedLangCodeUrl} was not found in your project! You will need to add it if you want to link to it using the \`${options.filters.url}\` filter. You can bypass this error using the \`errorMode\` option in the I18N plugin (current value: "${options.errorMode}").`, + ); + } + + return url; + }); + + // Refactor to use url + // Find the links that are localized alternates to the inputPath argument + eleventyConfig.addFilter(options.filters.links, function (urlOverride) { + let url = urlOverride || this.page?.url; + return (contentMaps.localeUrlsMap[url] || []).filter((entry) => { + return entry.url !== url; + }); + }); + + // Returns a `page`-esque variable for the root default language page + // If paginated, returns first result only + eleventyConfig.addFilter( + "locale_page", // This is not exposed in `options` because it is an Eleventy internals filter (used in get*CollectionItem filters) + function (pageOverride, languageCode) { + // both args here are optional + if (!languageCode) { + languageCode = options.defaultLanguage; + } + + let page = pageOverride || this.page; + let url; // new url + if (contentMaps.localeUrlsMap[page.url]) { + for (let entry of contentMaps.localeUrlsMap[page.url]) { + if (entry.lang === languageCode) { + url = entry.url; + } + } + } + + let inputPath = LangUtils.swapLanguageCode(page.inputPath, languageCode); + + if ( + !url || + !Array.isArray(contentMaps.inputPathToUrl[inputPath]) || + contentMaps.inputPathToUrl[inputPath].length === 0 + ) { + // no internationalized pages found + return page; + } + + let result = { + // // note that the permalink/slug may be different for the localized file! + url, + inputPath, + filePathStem: LangUtils.swapLanguageCode(page.filePathStem, languageCode), + // outputPath is omitted here, not necessary for GetCollectionItem.js if url is provided + __locale_page_resolved: true, + }; + return result; + }, + ); +} + +export { Comparator, LangUtils }; + +Object.defineProperty(eleventyI18nPlugin, "eleventyPackage", { + value: "@11ty/eleventy/i18n-plugin", +}); + +Object.defineProperty(eleventyI18nPlugin, "eleventyPluginOptions", { + value: { + unique: true, + }, +}); + +export default eleventyI18nPlugin; diff --git a/node_modules/@11ty/eleventy/src/Plugins/IdAttributePlugin.js b/node_modules/@11ty/eleventy/src/Plugins/IdAttributePlugin.js new file mode 100644 index 0000000..a55a13e --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Plugins/IdAttributePlugin.js @@ -0,0 +1,110 @@ +import matchHelper from "posthtml-match-helper"; +import { decodeHTML } from "entities"; + +import slugifyFilter from "../Filters/Slugify.js"; +import MemoizeUtil from "../Util/MemoizeFunction.js"; + +const POSTHTML_PLUGIN_NAME = "11ty/eleventy/id-attribute"; + +function getTextNodeContent(node) { + if (node.attrs?.["eleventy:id-ignore"] === "") { + delete node.attrs["eleventy:id-ignore"]; + return ""; + } + if (!node.content) { + return ""; + } + + return node.content + .map((entry) => { + if (typeof entry === "string") { + return entry; + } + if (Array.isArray(entry.content)) { + return getTextNodeContent(entry); + } + return ""; + }) + .join(""); +} + +function IdAttributePlugin(eleventyConfig, options = {}) { + if (!options.slugify) { + options.slugify = MemoizeUtil(slugifyFilter); + } + if (!options.selector) { + options.selector = "[id],h1,h2,h3,h4,h5,h6"; + } + options.decodeEntities = options.decodeEntities ?? true; + options.checkDuplicates = options.checkDuplicates ?? "error"; + + eleventyConfig.htmlTransformer.addPosthtmlPlugin( + "html", + function idAttributePosthtmlPlugin(pluginOptions = {}) { + if (typeof options.filter === "function") { + if (options.filter(pluginOptions) === false) { + return function () {}; + } + } + + return function (tree) { + // One per page + let conflictCheck = {}; + // Cache heading nodes for conflict resolution + let headingNodes = {}; + + tree.match(matchHelper(options.selector), function (node) { + if (node.attrs?.id) { + let id = node.attrs?.id; + if (conflictCheck[id]) { + conflictCheck[id]++; + if (headingNodes[id]) { + // Rename conflicting assigned heading id + let newId = `${id}-${conflictCheck[id]}`; + headingNodes[newId] = headingNodes[id]; + headingNodes[newId].attrs.id = newId; + delete headingNodes[id]; + } else if (options.checkDuplicates === "error") { + // Existing `id` conflicts with assigned heading id, throw error + throw new Error( + 'You have more than one HTML `id` attribute using the same value (id="' + + id + + '") in your template (' + + pluginOptions.page.inputPath + + "). You can disable this error in the IdAttribute plugin with the `checkDuplicates: false` option.", + ); + } + } else { + conflictCheck[id] = 1; + } + } else if (!node.attrs?.id && node.content) { + node.attrs = node.attrs || {}; + let textContent = getTextNodeContent(node); + if (options.decodeEntities) { + textContent = decodeHTML(textContent); + } + let id = options.slugify(textContent); + + if (conflictCheck[id]) { + conflictCheck[id]++; + id = `${id}-${conflictCheck[id]}`; + } else { + conflictCheck[id] = 1; + } + + headingNodes[id] = node; + node.attrs.id = id; + } + + return node; + }); + }; + }, + { + // pluginOptions + name: POSTHTML_PLUGIN_NAME, + }, + ); +} + +export { IdAttributePlugin }; diff --git a/node_modules/@11ty/eleventy/src/Plugins/InputPathToUrl.js b/node_modules/@11ty/eleventy/src/Plugins/InputPathToUrl.js new file mode 100644 index 0000000..aca148b --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Plugins/InputPathToUrl.js @@ -0,0 +1,191 @@ +import path from "node:path"; +import { TemplatePath } from "@11ty/eleventy-utils"; +import isValidUrl from "../Util/ValidUrl.js"; + +function getValidPath(contentMap, testPath) { + // if the path is coming from Markdown, it may be encoded + let normalized = TemplatePath.addLeadingDotSlash(decodeURIComponent(testPath)); + + // it must exist in the content map to be valid + if (contentMap[normalized]) { + return normalized; + } +} + +function normalizeInputPath(targetInputPath, inputDir, sourceInputPath, contentMap) { + // inputDir is optional at the beginning of the developer supplied-path + + // Input directory already on the input path + if (TemplatePath.join(targetInputPath).startsWith(TemplatePath.join(inputDir))) { + let absolutePath = getValidPath(contentMap, targetInputPath); + if (absolutePath) { + return absolutePath; + } + } + + // Relative to project input directory + let relativeToInputDir = getValidPath(contentMap, TemplatePath.join(inputDir, targetInputPath)); + if (relativeToInputDir) { + return relativeToInputDir; + } + + if (targetInputPath && !path.isAbsolute(targetInputPath)) { + // Relative to source file’s input path + let sourceInputDir = TemplatePath.getDirFromFilePath(sourceInputPath); + let relativeToSourceFile = getValidPath( + contentMap, + TemplatePath.join(sourceInputDir, targetInputPath), + ); + if (relativeToSourceFile) { + return relativeToSourceFile; + } + } + + // the transform may have sent in a URL so we just return it as-is + return targetInputPath; +} + +function parseFilePath(filepath) { + if (filepath.startsWith("#") || filepath.startsWith("?")) { + return [filepath, ""]; + } + + try { + /* u: URL { + href: 'file:///tmpl.njk#anchor', + origin: 'null', + protocol: 'file:', + username: '', + password: '', + host: '', + hostname: '', + port: '', + pathname: '/tmpl.njk', + search: '', + searchParams: URLSearchParams {}, + hash: '#anchor' + } */ + + // Note that `node:url` -> pathToFileURL creates an absolute path, which we don’t want + // URL(`file:#anchor`) gives back a pathname of `/` + let u = new URL(`file:${filepath}`); + filepath = filepath.replace(u.search, ""); // includes ? + filepath = filepath.replace(u.hash, ""); // includes # + + return [ + // search includes ?, hash includes # + u.search + u.hash, + filepath, + ]; + } catch (e) { + return ["", filepath]; + } +} + +function FilterPlugin(eleventyConfig) { + let contentMap; + eleventyConfig.on("eleventy.contentMap", function ({ inputPathToUrl }) { + contentMap = inputPathToUrl; + }); + + eleventyConfig.addFilter("inputPathToUrl", function (targetFilePath) { + if (!contentMap) { + throw new Error("Internal error: contentMap not available for `inputPathToUrl` filter."); + } + + if (isValidUrl(targetFilePath)) { + return targetFilePath; + } + + let inputDir = eleventyConfig.directories.input; + let suffix = ""; + [suffix, targetFilePath] = parseFilePath(targetFilePath); + if (targetFilePath) { + targetFilePath = normalizeInputPath( + targetFilePath, + inputDir, + // @ts-ignore + this.page.inputPath, + contentMap, + ); + } + + let urls = contentMap[targetFilePath]; + if (!urls || urls.length === 0) { + throw new Error( + "`inputPathToUrl` filter could not find a matching target for " + targetFilePath, + ); + } + + return `${urls[0]}${suffix}`; + }); +} + +function TransformPlugin(eleventyConfig, defaultOptions = {}) { + let opts = Object.assign( + { + extensions: "html", + }, + defaultOptions, + ); + + let contentMap = null; + eleventyConfig.on("eleventy.contentMap", function ({ inputPathToUrl }) { + contentMap = inputPathToUrl; + }); + + eleventyConfig.htmlTransformer.addUrlTransform(opts.extensions, function (targetFilepathOrUrl) { + if (!contentMap) { + throw new Error("Internal error: contentMap not available for the `pathToUrl` Transform."); + } + if (isValidUrl(targetFilepathOrUrl)) { + return targetFilepathOrUrl; + } + + let inputDir = eleventyConfig.directories.input; + + let suffix = ""; + [suffix, targetFilepathOrUrl] = parseFilePath(targetFilepathOrUrl); + if (targetFilepathOrUrl) { + targetFilepathOrUrl = normalizeInputPath( + targetFilepathOrUrl, + inputDir, + // @ts-ignore + this.page.inputPath, + contentMap, + ); + } + + let urls = contentMap[targetFilepathOrUrl]; + if (!targetFilepathOrUrl || !urls || urls.length === 0) { + // fallback, transforms don’t error on missing paths (though the pathToUrl filter does) + return `${targetFilepathOrUrl}${suffix}`; + } + + return `${urls[0]}${suffix}`; + }); +} + +Object.defineProperty(FilterPlugin, "eleventyPackage", { + value: "@11ty/eleventy/inputpath-to-url-filter-plugin", +}); + +Object.defineProperty(FilterPlugin, "eleventyPluginOptions", { + value: { + unique: true, + }, +}); + +Object.defineProperty(TransformPlugin, "eleventyPackage", { + value: "@11ty/eleventy/inputpath-to-url-transform-plugin", +}); + +Object.defineProperty(TransformPlugin, "eleventyPluginOptions", { + value: { + unique: true, + }, +}); + +export default TransformPlugin; + +export { FilterPlugin, TransformPlugin }; diff --git a/node_modules/@11ty/eleventy/src/Plugins/Pagination.js b/node_modules/@11ty/eleventy/src/Plugins/Pagination.js new file mode 100755 index 0000000..8e5b1de --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Plugins/Pagination.js @@ -0,0 +1,379 @@ +import { isPlainObject } from "@11ty/eleventy-utils"; +import lodash from "@11ty/lodash-custom"; +import { DeepCopy } from "@11ty/eleventy-utils"; + +import EleventyBaseError from "../Errors/EleventyBaseError.js"; +import { ProxyWrap } from "../Util/Objects/ProxyWrap.js"; +// import { DeepFreeze } from "../Util/Objects/DeepFreeze.js"; +import TemplateData from "../Data/TemplateData.js"; + +const { set: lodashSet, get: lodashGet, chunk: lodashChunk } = lodash; + +class PaginationConfigError extends EleventyBaseError {} +class PaginationError extends EleventyBaseError {} + +class Pagination { + constructor(tmpl, data, config) { + if (!config) { + throw new PaginationConfigError("Expected `config` argument to Pagination class."); + } + + this.config = config; + + this.setTemplate(tmpl); + this.setData(data); + } + + get inputPathForErrorMessages() { + if (this.template) { + return ` (${this.template.inputPath})`; + } + return ""; + } + + static hasPagination(data) { + return "pagination" in data; + } + + hasPagination() { + if (!this.data) { + throw new Error( + `Missing \`setData\` call for Pagination object${this.inputPathForErrorMessages}`, + ); + } + return Pagination.hasPagination(this.data); + } + + circularReferenceCheck(data) { + let key = data.pagination.data; + let includedTags = TemplateData.getIncludedTagNames(data); + + for (let tag of includedTags) { + if (`collections.${tag}` === key) { + throw new PaginationError( + `Pagination circular reference${this.inputPathForErrorMessages}, data:\`${key}\` iterates over both the \`${tag}\` collection and also supplies pages to that collection.`, + ); + } + } + } + + setData(data) { + this.data = data || {}; + this.target = []; + + if (!this.hasPagination()) { + return; + } + + if (!data.pagination) { + throw new Error( + `Misconfigured pagination data in template front matter${this.inputPathForErrorMessages} (YAML front matter precaution: did you use tabs and not spaces for indentation?).`, + ); + } else if (!("size" in data.pagination)) { + throw new Error( + `Missing pagination size in front matter data${this.inputPathForErrorMessages}`, + ); + } + this.circularReferenceCheck(data); + + this.size = data.pagination.size; + this.alias = data.pagination.alias; + this.fullDataSet = this._get(this.data, this._getDataKey()); + // this returns an array + this.target = this._resolveItems(); + this.chunkedItems = this.pagedItems; + } + + setTemplate(tmpl) { + this.template = tmpl; + } + + _getDataKey() { + return this.data.pagination.data; + } + + shouldResolveDataToObjectValues() { + if ("resolve" in this.data.pagination) { + return this.data.pagination.resolve === "values"; + } + return false; + } + + isFiltered(value) { + if ("filter" in this.data.pagination) { + let filtered = this.data.pagination.filter; + if (Array.isArray(filtered)) { + return filtered.indexOf(value) > -1; + } + + return filtered === value; + } + + return false; + } + + _has(target, key) { + let notFoundValue = "__NOT_FOUND_ERROR__"; + let data = lodashGet(target, key, notFoundValue); + return data !== notFoundValue; + } + + _get(target, key) { + let notFoundValue = "__NOT_FOUND_ERROR__"; + let data = lodashGet(target, key, notFoundValue); + if (data === notFoundValue) { + throw new Error( + `Could not find pagination data${this.inputPathForErrorMessages}, went looking for: ${key}`, + ); + } + return data; + } + + _resolveItems() { + let keys; + if (Array.isArray(this.fullDataSet)) { + keys = this.fullDataSet; + this.paginationTargetType = "array"; + } else if (isPlainObject(this.fullDataSet)) { + this.paginationTargetType = "object"; + if (this.shouldResolveDataToObjectValues()) { + keys = Object.values(this.fullDataSet); + } else { + keys = Object.keys(this.fullDataSet); + } + } else { + throw new Error( + `Unexpected data found in pagination target${this.inputPathForErrorMessages}: expected an Array or an Object.`, + ); + } + + // keys must be an array + let result = keys.slice(); + + if (this.data.pagination.before && typeof this.data.pagination.before === "function") { + // we don’t need to make a copy of this because we .slice() above to create a new copy + let fns = {}; + if (this.config) { + fns = this.config.javascriptFunctions; + } + result = this.data.pagination.before.call(fns, result, this.data); + } + + if (this.data.pagination.reverse === true) { + result = result.reverse(); + } + + if (this.data.pagination.filter) { + result = result.filter((value) => !this.isFiltered(value)); + } + + return result; + } + + get pagedItems() { + if (!this.data) { + throw new Error( + `Missing \`setData\` call for Pagination object${this.inputPathForErrorMessages}`, + ); + } + + const chunks = lodashChunk(this.target, this.size); + if (this.data.pagination?.generatePageOnEmptyData) { + return chunks.length ? chunks : [[]]; + } else { + return chunks; + } + } + + getPageCount() { + if (!this.hasPagination()) { + return 0; + } + + return this.chunkedItems.length; + } + + getNormalizedItems(pageItems) { + return this.size === 1 ? pageItems[0] : pageItems; + } + + getOverrideDataPages(items, pageNumber) { + return { + // See Issue #345 for more examples + page: { + previous: pageNumber > 0 ? this.getNormalizedItems(items[pageNumber - 1]) : null, + next: pageNumber < items.length - 1 ? this.getNormalizedItems(items[pageNumber + 1]) : null, + first: items.length ? this.getNormalizedItems(items[0]) : null, + last: items.length ? this.getNormalizedItems(items[items.length - 1]) : null, + }, + + pageNumber, + }; + } + + getOverrideDataLinks(pageNumber, templateCount, links) { + let obj = {}; + + // links are okay but hrefs are better + obj.previousPageLink = pageNumber > 0 ? links[pageNumber - 1] : null; + obj.previous = obj.previousPageLink; + + obj.nextPageLink = pageNumber < templateCount - 1 ? links[pageNumber + 1] : null; + obj.next = obj.nextPageLink; + + obj.firstPageLink = links.length > 0 ? links[0] : null; + obj.lastPageLink = links.length > 0 ? links[links.length - 1] : null; + + obj.links = links; + // todo deprecated, consistency with collections and use links instead + obj.pageLinks = links; + return obj; + } + + getOverrideDataHrefs(pageNumber, templateCount, hrefs) { + let obj = {}; + + // hrefs are better than links + obj.previousPageHref = pageNumber > 0 ? hrefs[pageNumber - 1] : null; + obj.nextPageHref = pageNumber < templateCount - 1 ? hrefs[pageNumber + 1] : null; + + obj.firstPageHref = hrefs.length > 0 ? hrefs[0] : null; + obj.lastPageHref = hrefs.length > 0 ? hrefs[hrefs.length - 1] : null; + + obj.hrefs = hrefs; + + // better names + obj.href = { + previous: obj.previousPageHref, + next: obj.nextPageHref, + first: obj.firstPageHref, + last: obj.lastPageHref, + }; + + return obj; + } + + async getPageTemplates() { + if (!this.data) { + throw new Error( + `Missing \`setData\` call for Pagination object${this.inputPathForErrorMessages}`, + ); + } + + if (!this.hasPagination()) { + return []; + } + + let entries = []; + let items = this.chunkedItems; + let pages = this.size === 1 ? items.map((entry) => entry[0]) : items; + + let links = []; + let hrefs = []; + + let hasPermalinkField = + Boolean(this.data[this.config.keys.permalink]) || + Boolean(this.data.eleventyComputed?.[this.config.keys.permalink]); + + // Do *not* pass collections through DeepCopy, we’ll re-add them back in later. + let collections = this.data.collections; + if (collections) { + delete this.data.collections; + } + + let parentData = DeepCopy( + { + pagination: { + data: this.data.pagination.data, + size: this.data.pagination.size, + alias: this.alias, + pages, + }, + }, + this.data, + ); + + // Restore skipped collections + if (collections) { + this.data.collections = collections; + // Keep the original reference to the collections, no deep copy!! + parentData.collections = collections; + } + + // TODO this does work fine but let’s wait on enabling it. + // DeepFreeze(parentData, ["collections"]); + + // TODO future improvement dea: use a light Template wrapper for paged template clones (PagedTemplate?) + // so that we don’t have the memory cost of the full template (and can reuse the parent + // template for some things) + + let indices = new Set(); + for (let j = 0; j <= items.length - 1; j++) { + indices.add(j); + } + + for (let pageNumber of indices) { + let cloned = await this.template.clone(); + + if (pageNumber > 0 && !hasPermalinkField) { + cloned.setExtraOutputSubdirectory(pageNumber); + } + + let paginationData = { + pagination: { + items: items[pageNumber], + }, + page: {}, + }; + Object.assign(paginationData.pagination, this.getOverrideDataPages(items, pageNumber)); + + if (this.alias) { + lodashSet(paginationData, this.alias, this.getNormalizedItems(items[pageNumber])); + } + + // Do *not* deep merge pagination data! See https://github.com/11ty/eleventy/issues/147#issuecomment-440802454 + let clonedData = ProxyWrap(paginationData, parentData); + + // Previous method: + // let clonedData = DeepCopy(paginationData, parentData); + + let { /*linkInstance,*/ rawPath, path, href } = await cloned.getOutputLocations(clonedData); + // TODO subdirectory to links if the site doesn’t live at / + if (rawPath) { + links.push("/" + rawPath); + } + + hrefs.push(href); + + // page.url and page.outputPath are used to avoid another getOutputLocations call later, see Template->addComputedData + clonedData.page.url = href; + clonedData.page.outputPath = path; + + entries.push({ + pageNumber, + + // This is used by i18n Plugin to allow subgroups of nested pagination to be separate + groupNumber: items[pageNumber]?.[0]?.eleventyPaginationGroupNumber, + + template: cloned, + data: clonedData, + }); + } + + // we loop twice to pass in the appropriate prev/next links (already full generated now) + let index = 0; + for (let pageEntry of entries) { + let linksObj = this.getOverrideDataLinks(index, items.length, links); + + Object.assign(pageEntry.data.pagination, linksObj); + + let hrefsObj = this.getOverrideDataHrefs(index, items.length, hrefs); + Object.assign(pageEntry.data.pagination, hrefsObj); + index++; + } + + return entries; + } +} + +export default Pagination; diff --git a/node_modules/@11ty/eleventy/src/Plugins/RenderPlugin.js b/node_modules/@11ty/eleventy/src/Plugins/RenderPlugin.js new file mode 100644 index 0000000..974b0e1 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Plugins/RenderPlugin.js @@ -0,0 +1,520 @@ +import fs from "node:fs"; +import { Merge, TemplatePath, isPlainObject } from "@11ty/eleventy-utils"; +import { evalToken } from "liquidjs"; + +// TODO add a first-class Markdown component to expose this using Markdown-only syntax (will need to be synchronous for markdown-it) + +import { ProxyWrap } from "../Util/Objects/ProxyWrap.js"; +import TemplateDataInitialGlobalData from "../Data/TemplateDataInitialGlobalData.js"; +import EleventyBaseError from "../Errors/EleventyBaseError.js"; +import TemplateRender from "../TemplateRender.js"; +import ProjectDirectories from "../Util/ProjectDirectories.js"; +import TemplateConfig from "../TemplateConfig.js"; +import EleventyExtensionMap from "../EleventyExtensionMap.js"; +import TemplateEngineManager from "../Engines/TemplateEngineManager.js"; +import Liquid from "../Engines/Liquid.js"; + +class EleventyNunjucksError extends EleventyBaseError {} + +/** @this {object} */ +async function compile(content, templateLang, options = {}) { + let { templateConfig, extensionMap } = options; + let strictMode = options.strictMode ?? false; + + if (!templateConfig) { + templateConfig = new TemplateConfig(null, false); + templateConfig.setDirectories(new ProjectDirectories()); + await templateConfig.init(); + } + + // Breaking change in 2.0+, previous default was `html` and now we default to the page template syntax + if (!templateLang) { + templateLang = this.page.templateSyntax; + } + + if (!extensionMap) { + if (strictMode) { + throw new Error("Internal error: missing `extensionMap` in RenderPlugin->compile."); + } + extensionMap = new EleventyExtensionMap(templateConfig); + extensionMap.engineManager = new TemplateEngineManager(templateConfig); + } + let tr = new TemplateRender(templateLang, templateConfig); + tr.extensionMap = extensionMap; + + if (templateLang) { + await tr.setEngineOverride(templateLang); + } else { + await tr.init(); + } + + // TODO tie this to the class, not the extension + if ( + tr.engine.name === "11ty.js" || + tr.engine.name === "11ty.cjs" || + tr.engine.name === "11ty.mjs" + ) { + throw new Error( + "11ty.js is not yet supported as a template engine for `renderTemplate`. Use `renderFile` instead!", + ); + } + + return tr.getCompiledTemplate(content); +} + +// No templateLang default, it should infer from the inputPath. +async function compileFile(inputPath, options = {}, templateLang) { + let { templateConfig, extensionMap, config } = options; + let strictMode = options.strictMode ?? false; + if (!inputPath) { + throw new Error("Missing file path argument passed to the `renderFile` shortcode."); + } + + let wasTemplateConfigMissing = false; + if (!templateConfig) { + templateConfig = new TemplateConfig(null, false); + templateConfig.setDirectories(new ProjectDirectories()); + wasTemplateConfigMissing = true; + } + if (config && typeof config === "function") { + await config(templateConfig.userConfig); + } + if (wasTemplateConfigMissing) { + await templateConfig.init(); + } + + let normalizedPath = TemplatePath.normalizeOperatingSystemFilePath(inputPath); + // Prefer the exists cache, if it’s available + if (!templateConfig.existsCache.exists(normalizedPath)) { + throw new Error( + "Could not find render plugin file for the `renderFile` shortcode, looking for: " + inputPath, + ); + } + + if (!extensionMap) { + if (strictMode) { + throw new Error("Internal error: missing `extensionMap` in RenderPlugin->compileFile."); + } + + extensionMap = new EleventyExtensionMap(templateConfig); + extensionMap.engineManager = new TemplateEngineManager(templateConfig); + } + let tr = new TemplateRender(inputPath, templateConfig); + tr.extensionMap = extensionMap; + + if (templateLang) { + await tr.setEngineOverride(templateLang); + } else { + await tr.init(); + } + + if (!tr.engine.needsToReadFileContents()) { + return tr.getCompiledTemplate(null); + } + + // TODO we could make this work with full templates (with front matter?) + let content = fs.readFileSync(inputPath, "utf8"); + return tr.getCompiledTemplate(content); +} + +/** @this {object} */ +async function renderShortcodeFn(fn, data) { + if (fn === undefined) { + return; + } else if (typeof fn !== "function") { + throw new Error(`The \`compile\` function did not return a function. Received ${fn}`); + } + + // if the user passes a string or other literal, remap to an object. + if (!isPlainObject(data)) { + data = { + _: data, + }; + } + + if ("data" in this && isPlainObject(this.data)) { + // when options.accessGlobalData is true, this allows the global data + // to be accessed inside of the shortcode as a fallback + + data = ProxyWrap(data, this.data); + } else { + // save `page` and `eleventy` for reuse + data.page = this.page; + data.eleventy = this.eleventy; + } + + return fn(data); +} + +/** + * @module 11ty/eleventy/Plugins/RenderPlugin + */ + +/** + * A plugin to add shortcodes to render an Eleventy template + * string (or file) inside of another template. {@link https://v3.11ty.dev/docs/plugins/render/} + * + * @since 1.0.0 + * @param {module:11ty/eleventy/UserConfig} eleventyConfig - User-land configuration instance. + * @param {object} options - Plugin options + */ +function eleventyRenderPlugin(eleventyConfig, options = {}) { + let templateConfig; + eleventyConfig.on("eleventy.config", (tmplConfigInstance) => { + templateConfig = tmplConfigInstance; + }); + + let extensionMap; + eleventyConfig.on("eleventy.extensionmap", (map) => { + extensionMap = map; + }); + + /** + * @typedef {object} options + * @property {string} [tagName] - The shortcode name to render a template string. + * @property {string} [tagNameFile] - The shortcode name to render a template file. + * @property {module:11ty/eleventy/TemplateConfig} [templateConfig] - Configuration object + * @property {boolean} [accessGlobalData] - Whether or not the template has access to the page’s data. + */ + let defaultOptions = { + tagName: "renderTemplate", + tagNameFile: "renderFile", + filterName: "renderContent", + templateConfig: null, + accessGlobalData: false, + }; + let opts = Object.assign(defaultOptions, options); + + function liquidTemplateTag(liquidEngine, tagName) { + // via https://github.com/harttle/liquidjs/blob/b5a22fa0910c708fe7881ef170ed44d3594e18f3/src/builtin/tags/raw.ts + return { + parse: function (tagToken, remainTokens) { + this.name = tagToken.name; + + if (eleventyConfig.liquid.parameterParsing === "builtin") { + this.orderedArgs = Liquid.parseArgumentsBuiltin(tagToken.args); + // note that Liquid does have a Hash class for name-based argument parsing but offers no easy to support both modes in one class + } else { + this.legacyArgs = tagToken.args; + } + + this.tokens = []; + + var stream = liquidEngine.parser + .parseStream(remainTokens) + .on("token", (token) => { + if (token.name === "end" + tagName) stream.stop(); + else this.tokens.push(token); + }) + .on("end", () => { + throw new Error(`tag ${tagToken.getText()} not closed`); + }); + + stream.start(); + }, + render: function* (ctx) { + let normalizedContext = {}; + if (ctx) { + if (opts.accessGlobalData) { + // parent template data cascade + normalizedContext.data = ctx.getAll(); + } + + normalizedContext.page = ctx.get(["page"]); + normalizedContext.eleventy = ctx.get(["eleventy"]); + } + + let argArray = []; + if (this.legacyArgs) { + let rawArgs = Liquid.parseArguments(null, this.legacyArgs); + for (let arg of rawArgs) { + let b = yield liquidEngine.evalValue(arg, ctx); + argArray.push(b); + } + } else if (this.orderedArgs) { + for (let arg of this.orderedArgs) { + let b = yield evalToken(arg, ctx); + argArray.push(b); + } + } + + // plaintext paired shortcode content + let body = this.tokens.map((token) => token.getText()).join(""); + + let ret = _renderStringShortcodeFn.call( + normalizedContext, + body, + // templateLang, data + ...argArray, + ); + yield ret; + return ret; + }, + }; + } + + // TODO I don’t think this works with whitespace control, e.g. {%- endrenderTemplate %} + function nunjucksTemplateTag(NunjucksLib, tagName) { + return new (function () { + this.tags = [tagName]; + + this.parse = function (parser, nodes) { + var tok = parser.nextToken(); + + var args = parser.parseSignature(true, true); + const begun = parser.advanceAfterBlockEnd(tok.value); + + // This code was ripped from the Nunjucks parser for `raw` + // https://github.com/mozilla/nunjucks/blob/fd500902d7c88672470c87170796de52fc0f791a/nunjucks/src/parser.js#L655 + const endTagName = "end" + tagName; + // Look for upcoming raw blocks (ignore all other kinds of blocks) + const rawBlockRegex = new RegExp( + "([\\s\\S]*?){%\\s*(" + tagName + "|" + endTagName + ")\\s*(?=%})%}", + ); + let rawLevel = 1; + let str = ""; + let matches = null; + + // Exit when there's nothing to match + // or when we've found the matching "endraw" block + while ((matches = parser.tokens._extractRegex(rawBlockRegex)) && rawLevel > 0) { + const all = matches[0]; + const pre = matches[1]; + const blockName = matches[2]; + + // Adjust rawlevel + if (blockName === tagName) { + rawLevel += 1; + } else if (blockName === endTagName) { + rawLevel -= 1; + } + + // Add to str + if (rawLevel === 0) { + // We want to exclude the last "endraw" + str += pre; + // Move tokenizer to beginning of endraw block + parser.tokens.backN(all.length - pre.length); + } else { + str += all; + } + } + + let body = new nodes.Output(begun.lineno, begun.colno, [ + new nodes.TemplateData(begun.lineno, begun.colno, str), + ]); + return new nodes.CallExtensionAsync(this, "run", args, [body]); + }; + + this.run = function (...args) { + let resolve = args.pop(); + let body = args.pop(); + let [context, ...argArray] = args; + + let normalizedContext = {}; + if (context.ctx?.page) { + normalizedContext.ctx = context.ctx; + + // TODO .data + // if(opts.accessGlobalData) { + // normalizedContext.data = context.ctx; + // } + + normalizedContext.page = context.ctx.page; + normalizedContext.eleventy = context.ctx.eleventy; + } + + body(function (e, bodyContent) { + if (e) { + resolve( + new EleventyNunjucksError(`Error with Nunjucks paired shortcode \`${tagName}\``, e), + ); + } + + Promise.resolve( + _renderStringShortcodeFn.call( + normalizedContext, + bodyContent, + // templateLang, data + ...argArray, + ), + ).then( + function (returnValue) { + resolve(null, new NunjucksLib.runtime.SafeString(returnValue)); + }, + function (e) { + resolve( + new EleventyNunjucksError(`Error with Nunjucks paired shortcode \`${tagName}\``, e), + null, + ); + }, + ); + }); + }; + })(); + } + + /** @this {object} */ + async function _renderStringShortcodeFn(content, templateLang, data = {}) { + // Default is fn(content, templateLang, data) but we want to support fn(content, data) too + if (typeof templateLang !== "string") { + data = templateLang; + templateLang = false; + } + + // TODO Render plugin `templateLang` is feeding bad input paths to the addDependencies call in Custom.js + let fn = await compile.call(this, content, templateLang, { + templateConfig: opts.templateConfig || templateConfig, + extensionMap, + }); + + return renderShortcodeFn.call(this, fn, data); + } + + /** @this {object} */ + async function _renderFileShortcodeFn(inputPath, data = {}, templateLang) { + let options = { + templateConfig: opts.templateConfig || templateConfig, + extensionMap, + }; + + let fn = await compileFile.call(this, inputPath, options, templateLang); + + return renderShortcodeFn.call(this, fn, data); + } + + // Render strings + if (opts.tagName) { + // use falsy to opt-out + eleventyConfig.addJavaScriptFunction(opts.tagName, _renderStringShortcodeFn); + + eleventyConfig.addLiquidTag(opts.tagName, function (liquidEngine) { + return liquidTemplateTag(liquidEngine, opts.tagName); + }); + + eleventyConfig.addNunjucksTag(opts.tagName, function (nunjucksLib) { + return nunjucksTemplateTag(nunjucksLib, opts.tagName); + }); + } + + // Filter for rendering strings + if (opts.filterName) { + eleventyConfig.addAsyncFilter(opts.filterName, _renderStringShortcodeFn); + } + + // Render File + // use `false` to opt-out + if (opts.tagNameFile) { + eleventyConfig.addAsyncShortcode(opts.tagNameFile, _renderFileShortcodeFn); + } +} + +// Will re-use the same configuration instance both at a top level and across any nested renders +class RenderManager { + /** @type {Promise|undefined} */ + #hasConfigInitialized; + #extensionMap; + #templateConfig; + + constructor() { + this.templateConfig = new TemplateConfig(null, false); + this.templateConfig.setDirectories(new ProjectDirectories()); + } + + get templateConfig() { + return this.#templateConfig; + } + + set templateConfig(templateConfig) { + if (!templateConfig || templateConfig === this.#templateConfig) { + return; + } + + this.#templateConfig = templateConfig; + + // This is the only plugin running on the Edge + this.#templateConfig.userConfig.addPlugin(eleventyRenderPlugin, { + templateConfig: this.#templateConfig, + accessGlobalData: true, + }); + + this.#extensionMap = new EleventyExtensionMap(this.#templateConfig); + this.#extensionMap.engineManager = new TemplateEngineManager(this.#templateConfig); + } + + async init() { + if (this.#hasConfigInitialized) { + return this.#hasConfigInitialized; + } + if (this.templateConfig.hasInitialized()) { + return true; + } + this.#hasConfigInitialized = this.templateConfig.init(); + await this.#hasConfigInitialized; + + return true; + } + + // `callback` is async-friendly but requires await upstream + config(callback) { + // run an extra `function(eleventyConfig)` configuration callbacks + if (callback && typeof callback === "function") { + return callback(this.templateConfig.userConfig); + } + } + + get initialGlobalData() { + if (!this._data) { + this._data = new TemplateDataInitialGlobalData(this.templateConfig); + } + return this._data; + } + + // because we don’t have access to the full data cascade—but + // we still want configuration data added via `addGlobalData` + async getData(...data) { + await this.init(); + + let globalData = await this.initialGlobalData.getData(); + let merged = Merge({}, globalData, ...data); + return merged; + } + + async compile(content, templateLang, options = {}) { + await this.init(); + + options.templateConfig = this.templateConfig; + options.extensionMap = this.#extensionMap; + options.strictMode = true; + + // We don’t need `compile.call(this)` here because the Edge always uses "liquid" as the template lang (instead of relying on this.page.templateSyntax) + // returns promise + return compile(content, templateLang, options); + } + + async render(fn, edgeData, buildTimeData) { + await this.init(); + + let mergedData = await this.getData(edgeData); + // Set .data for options.accessGlobalData feature + let context = { + data: mergedData, + }; + + return renderShortcodeFn.call(context, fn, buildTimeData); + } +} + +Object.defineProperty(eleventyRenderPlugin, "eleventyPackage", { + value: "@11ty/eleventy/render-plugin", +}); + +Object.defineProperty(eleventyRenderPlugin, "eleventyPluginOptions", { + value: { + unique: true, + }, +}); + +export default eleventyRenderPlugin; + +export { compileFile as File, compile as String, RenderManager }; diff --git a/node_modules/@11ty/eleventy/src/Template.js b/node_modules/@11ty/eleventy/src/Template.js new file mode 100755 index 0000000..64c4709 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Template.js @@ -0,0 +1,1200 @@ +import util from "node:util"; +import os from "node:os"; +import path from "node:path"; +import fs from "node:fs"; + +import lodash from "@11ty/lodash-custom"; +import { DateTime } from "luxon"; +import { TemplatePath, isPlainObject } from "@11ty/eleventy-utils"; +import debugUtil from "debug"; +import chalk from "kleur"; + +import ConsoleLogger from "./Util/ConsoleLogger.js"; +import getDateFromGitLastUpdated from "./Util/DateGitLastUpdated.js"; +import getDateFromGitFirstAdded from "./Util/DateGitFirstAdded.js"; +import TemplateData from "./Data/TemplateData.js"; +import TemplateContent from "./TemplateContent.js"; +import TemplatePermalink from "./TemplatePermalink.js"; +import TemplateLayout from "./TemplateLayout.js"; +import TemplateFileSlug from "./TemplateFileSlug.js"; +import ComputedData from "./Data/ComputedData.js"; +import Pagination from "./Plugins/Pagination.js"; +import TemplateBehavior from "./TemplateBehavior.js"; +import TemplateContentPrematureUseError from "./Errors/TemplateContentPrematureUseError.js"; +import TemplateContentUnrenderedTemplateError from "./Errors/TemplateContentUnrenderedTemplateError.js"; +import EleventyBaseError from "./Errors/EleventyBaseError.js"; +import ReservedData from "./Util/ReservedData.js"; +import TransformsUtil from "./Util/TransformsUtil.js"; +import { FileSystemManager } from "./Util/FileSystemManager.js"; + +const { set: lodashSet, get: lodashGet } = lodash; +const fsStat = util.promisify(fs.stat); + +const debug = debugUtil("Eleventy:Template"); +const debugDev = debugUtil("Dev:Eleventy:Template"); + +class Template extends TemplateContent { + #logger; + #fsManager; + + constructor(templatePath, templateData, extensionMap, config) { + debugDev("new Template(%o)", templatePath); + super(templatePath, config); + + this.parsed = path.parse(templatePath); + + // for pagination + this.extraOutputSubdirectory = ""; + + this.extensionMap = extensionMap; + this.templateData = templateData; + this.#initFileSlug(); + + this.linters = []; + this.transforms = {}; + + this.isVerbose = true; + this.isDryRun = false; + this.writeCount = 0; + + this.fileSlug = new TemplateFileSlug(this.inputPath, this.extensionMap, this.eleventyConfig); + this.fileSlugStr = this.fileSlug.getSlug(); + this.filePathStem = this.fileSlug.getFullPathWithoutExtension(); + + this.outputFormat = "fs"; + + this.behavior = new TemplateBehavior(this.config); + this.behavior.setOutputFormat(this.outputFormat); + } + + #initFileSlug() { + this.fileSlug = new TemplateFileSlug(this.inputPath, this.extensionMap, this.eleventyConfig); + this.fileSlugStr = this.fileSlug.getSlug(); + this.filePathStem = this.fileSlug.getFullPathWithoutExtension(); + } + + /* mimic constructor arg order */ + resetCachedTemplate({ templateData, extensionMap, eleventyConfig }) { + super.resetCachedTemplate({ eleventyConfig }); + this.templateData = templateData; + this.extensionMap = extensionMap; + // this.#fsManager = undefined; + this.#initFileSlug(); + } + + get fsManager() { + if (!this.#fsManager) { + this.#fsManager = new FileSystemManager(this.eleventyConfig); + } + return this.#fsManager; + } + + get logger() { + if (!this.#logger) { + this.#logger = new ConsoleLogger(); + this.#logger.isVerbose = this.isVerbose; + } + return this.#logger; + } + + /* Setter for Logger */ + set logger(logger) { + this.#logger = logger; + } + + isRenderable() { + return this.behavior.isRenderable(); + } + + isRenderableDisabled() { + return this.behavior.isRenderableDisabled(); + } + + isRenderableOptional() { + // A template that is lazily rendered once if used by a second order dependency of another template dependency. + // e.g. You change firstpost.md, which is used by feed.xml, but secondpost.md (also used by feed.xml) + // has not yet rendered and needs to be rendered once to populate the cache. + return this.behavior.isRenderableOptional(); + } + + setRenderableOverride(renderableOverride) { + this.behavior.setRenderableOverride(renderableOverride); + } + + reset() { + this.renderCount = 0; + this.writeCount = 0; + } + + resetCaches(types) { + types = this.getResetTypes(types); + + super.resetCaches(types); + + if (types.data) { + delete this._dataCache; + // delete this._usePermalinkRoot; + // delete this._stats; + } + + if (types.render) { + delete this._cacheRenderedPromise; + delete this._cacheRenderedTransformsAndLayoutsPromise; + } + } + + setOutputFormat(to) { + this.outputFormat = to; + this.behavior.setOutputFormat(to); + } + + setIsVerbose(isVerbose) { + this.isVerbose = isVerbose; + this.logger.isVerbose = isVerbose; + } + + setDryRunViaIncremental(isIncremental) { + this.isDryRun = isIncremental; + this.isIncremental = isIncremental; + } + + setDryRun(isDryRun) { + this.isDryRun = !!isDryRun; + } + + setExtraOutputSubdirectory(dir) { + this.extraOutputSubdirectory = dir + "/"; + } + + getTemplateSubfolder() { + let dir = TemplatePath.absolutePath(this.parsed.dir); + let inputDir = TemplatePath.absolutePath(this.inputDir); + return TemplatePath.stripLeadingSubPath(dir, inputDir); + } + + templateUsesLayouts(pageData) { + if (this.hasTemplateRender()) { + return pageData?.[this.config.keys.layout] && this.templateRender.engine.useLayouts(); + } + + // If `layout` prop is set, default to true when engine is unknown + return Boolean(pageData?.[this.config.keys.layout]); + } + + getLayout(layoutKey) { + // already cached downstream in TemplateLayout -> TemplateCache + try { + return TemplateLayout.getTemplate(layoutKey, this.eleventyConfig, this.extensionMap); + } catch (e) { + throw new EleventyBaseError( + `Problem creating an Eleventy Layout for the "${this.inputPath}" template file.`, + e, + ); + } + } + + get baseFile() { + return this.extensionMap.removeTemplateExtension(this.parsed.base); + } + + async _getRawPermalinkInstance(permalinkValue) { + let perm = new TemplatePermalink(permalinkValue, this.extraOutputSubdirectory); + perm.setUrlTransforms(this.config.urlTransforms); + + this.behavior.setFromPermalink(perm); + + return perm; + } + + async _getLink(data) { + if (!data) { + throw new Error("Internal error: data argument missing in Template->_getLink"); + } + + let permalink = + data[this.config.keys.permalink] ?? + data?.[this.config.keys.computed]?.[this.config.keys.permalink]; + let permalinkValue; + + // `permalink: false` means render but no file system write, e.g. use in collections only) + // `permalink: true` throws an error + if (typeof permalink === "boolean") { + debugDev("Using boolean permalink %o", permalink); + permalinkValue = permalink; + } else if (permalink && (!this.config.dynamicPermalinks || data.dynamicPermalink === false)) { + debugDev("Not using dynamic permalinks, using %o", permalink); + permalinkValue = permalink; + } else if (isPlainObject(permalink)) { + // Empty permalink {} object should act as if no permalink was set at all + // and inherit the default behavior + let isEmptyObject = Object.keys(permalink).length === 0; + if (!isEmptyObject) { + let promises = []; + let keys = []; + for (let key in permalink) { + keys.push(key); + if (key !== "build" && Array.isArray(permalink[key])) { + promises.push( + Promise.all([...permalink[key]].map((entry) => super.renderPermalink(entry, data))), + ); + } else { + promises.push(super.renderPermalink(permalink[key], data)); + } + } + + let results = await Promise.all(promises); + + permalinkValue = {}; + for (let j = 0, k = keys.length; j < k; j++) { + let key = keys[j]; + permalinkValue[key] = results[j]; + debug( + "Rendering permalink.%o for %o: %s becomes %o", + key, + this.inputPath, + permalink[key], + results[j], + ); + } + } + } else if (permalink) { + // render variables inside permalink front matter, bypass markdown + permalinkValue = await super.renderPermalink(permalink, data); + debug("Rendering permalink for %o: %s becomes %o", this.inputPath, permalink, permalinkValue); + debugDev("Permalink rendered with data: %o", data); + } + + // Override default permalink behavior. Only do this if permalink was _not_ in the data cascade + if (!permalink && this.config.dynamicPermalinks && data.dynamicPermalink !== false) { + let tr = await this.getTemplateRender(); + let permalinkCompilation = tr.engine.permalinkNeedsCompilation(""); + if (typeof permalinkCompilation === "function") { + let ret = await this._renderFunction(permalinkCompilation, permalinkValue, this.inputPath); + if (ret !== undefined) { + if (typeof ret === "function") { + // function + permalinkValue = await this._renderFunction(ret, data); + } else { + // scalar + permalinkValue = ret; + } + } + } + } + + if (permalinkValue !== undefined) { + return this._getRawPermalinkInstance(permalinkValue); + } + + // No `permalink` specified in data cascade, do the default + let p = TemplatePermalink.generate( + this.getTemplateSubfolder(), + this.baseFile, + this.extraOutputSubdirectory, + this.engine.defaultTemplateFileExtension, + ); + p.setUrlTransforms(this.config.urlTransforms); + return p; + } + + async usePermalinkRoot() { + // @cachedproperty + if (this._usePermalinkRoot === undefined) { + // TODO this only works with immediate front matter and not data files + let { data } = await this.getFrontMatterData(); + this._usePermalinkRoot = data[this.config.keys.permalinkRoot]; + } + + return this._usePermalinkRoot; + } + + async getOutputLocations(data) { + this.bench.get("(count) getOutputLocations").incrementCount(); + let link = await this._getLink(data); + + let path; + if (await this.usePermalinkRoot()) { + path = link.toPathFromRoot(); + } else { + path = link.toPath(this.outputDir); + } + + return { + linkInstance: link, + rawPath: link.toOutputPath(), + href: link.toHref(), + path: path, + }; + } + + // This is likely now a test-only method + // Preferred to use the singular `getOutputLocations` above. + async getRawOutputPath(data) { + this.bench.get("(count) getRawOutputPath").incrementCount(); + let link = await this._getLink(data); + return link.toOutputPath(); + } + + // Preferred to use the singular `getOutputLocations` above. + async getOutputHref(data) { + this.bench.get("(count) getOutputHref").incrementCount(); + let link = await this._getLink(data); + return link.toHref(); + } + + // Preferred to use the singular `getOutputLocations` above. + async getOutputPath(data) { + this.bench.get("(count) getOutputPath").incrementCount(); + let link = await this._getLink(data); + if (await this.usePermalinkRoot()) { + return link.toPathFromRoot(); + } + return link.toPath(this.outputDir); + } + + async _testGetAllLayoutFrontMatterData() { + let { data: frontMatterData } = await this.getFrontMatterData(); + + if (frontMatterData[this.config.keys.layout]) { + let layout = this.getLayout(frontMatterData[this.config.keys.layout]); + return await layout.getData(); + } + return {}; + } + + async #getData() { + debugDev("%o getData", this.inputPath); + let localData = {}; + let globalData = {}; + + if (this.templateData) { + localData = await this.templateData.getTemplateDirectoryData(this.inputPath); + globalData = await this.templateData.getGlobalData(this.inputPath); + debugDev("%o getData getTemplateDirectoryData and getGlobalData", this.inputPath); + } + + let { data: frontMatterData } = await this.getFrontMatterData(); + + let mergedLayoutData = {}; + let tr = await this.getTemplateRender(); + if (tr.engine.useLayouts()) { + let layoutKey = + frontMatterData[this.config.keys.layout] || + localData[this.config.keys.layout] || + globalData[this.config.keys.layout]; + + // Layout front matter data + if (layoutKey) { + let layout = this.getLayout(layoutKey); + + mergedLayoutData = await layout.getData(); + debugDev("%o getData merged layout chain front matter", this.inputPath); + } + } + + try { + let mergedData = TemplateData.mergeDeep( + this.config.dataDeepMerge, + {}, + globalData, + mergedLayoutData, + localData, + frontMatterData, + ); + + if (this.config.freezeReservedData) { + ReservedData.check(mergedData); + } + + await this.addPage(mergedData); + + debugDev("%o getData mergedData", this.inputPath); + + return mergedData; + } catch (e) { + if ( + ReservedData.isReservedDataError(e) || + (e instanceof TypeError && + e.message.startsWith("Cannot add property") && + e.message.endsWith("not extensible")) + ) { + throw new EleventyBaseError( + `You attempted to set one of Eleventy’s reserved data property names${e.reservedNames ? `: ${e.reservedNames.join(", ")}` : ""}. You can opt-out of this behavior with \`eleventyConfig.setFreezeReservedData(false)\` or rename/remove the property in your data cascade that conflicts with Eleventy’s reserved property names (e.g. \`eleventy\`, \`pkg\`, and others). Learn more: https://v3.11ty.dev/docs/data-eleventy-supplied/`, + e, + ); + } + + throw e; + } + } + + async getData() { + if (!this._dataCache) { + // @cachedproperty + this._dataCache = this.#getData(); + } + + return this._dataCache; + } + + async addPage(data) { + if (!("page" in data)) { + data.page = {}; + } + + // Make sure to keep these keys synchronized in src/Util/ReservedData.js + data.page.inputPath = this.inputPath; + data.page.fileSlug = this.fileSlugStr; + data.page.filePathStem = this.filePathStem; + data.page.outputFileExtension = this.engine.defaultTemplateFileExtension; + data.page.templateSyntax = this.templateRender.getEnginesList( + data[this.config.keys.engineOverride], + ); + + let newDate = await this.getMappedDate(data); + // Skip date assignment if custom date is falsy. + if (newDate) { + data.page.date = newDate; + } + + // data.page.url + // data.page.outputPath + // data.page.excerpt from gray-matter and Front Matter + // data.page.lang from I18nPlugin + } + + // Tests only + async render() { + throw new Error("Internal error: `Template->render` was removed in Eleventy 3.0."); + } + + // Tests only + async renderLayout() { + throw new Error("Internal error: `Template->renderLayout` was removed in Eleventy 3.0."); + } + + async renderDirect(str, data, bypassMarkdown) { + return super.render(str, data, bypassMarkdown); + } + + // This is the primary render mechanism, called via TemplateMap->populateContentDataInMap + async renderPageEntryWithoutLayout(pageEntry) { + // @cachedproperty + if (!this._cacheRenderedPromise) { + this._cacheRenderedPromise = this.renderDirect(pageEntry.rawInput, pageEntry.data); + this.renderCount++; + } + + return this._cacheRenderedPromise; + } + + setLinters(linters) { + if (!isPlainObject(linters)) { + throw new Error("Object expected in setLinters"); + } + // this acts as a reset + this.linters = []; + for (let linter of Object.values(linters).filter((l) => typeof l === "function")) { + this.addLinter(linter); + } + } + + addLinter(callback) { + this.linters.push(callback); + } + + async runLinters(str, page) { + let { inputPath, outputPath, url } = page; + let pageData = page.data.page; + + for (let linter of this.linters) { + // these can be asynchronous but no guarantee of order when they run + linter.call( + { + inputPath, + outputPath, + url, + page: pageData, + }, + str, + inputPath, + outputPath, + ); + } + } + + setTransforms(transforms) { + if (!isPlainObject(transforms)) { + throw new Error("Object expected in setTransforms"); + } + this.transforms = transforms; + } + + async runTransforms(str, pageEntry) { + return TransformsUtil.runAll(str, pageEntry.data.page, this.transforms, { + logger: this.logger, + }); + } + + async #renderComputedUnit(entry, data) { + if (typeof entry === "string") { + return this.renderComputedData(entry, data); + } + + if (isPlainObject(entry)) { + for (let key in entry) { + entry[key] = await this.#renderComputedUnit(entry[key], data); + } + } + + if (Array.isArray(entry)) { + for (let j = 0, k = entry.length; j < k; j++) { + entry[j] = await this.#renderComputedUnit(entry[j], data); + } + } + + return entry; + } + + _addComputedEntry(computedData, obj, parentKey, declaredDependencies) { + // this check must come before isPlainObject + if (typeof obj === "function") { + computedData.add(parentKey, obj, declaredDependencies); + } else if (Array.isArray(obj) || typeof obj === "string") { + // Arrays are treated as one entry in the dependency graph now, Issue #3728 + computedData.addTemplateString( + parentKey, + async function (innerData) { + return this.tmpl.#renderComputedUnit(obj, innerData); + }, + declaredDependencies, + this.getParseForSymbolsFunction(obj), + this, + ); + } else if (isPlainObject(obj)) { + // Arrays used to be computed here + for (let key in obj) { + let keys = []; + if (parentKey) { + keys.push(parentKey); + } + keys.push(key); + this._addComputedEntry(computedData, obj[key], keys.join("."), declaredDependencies); + } + } else { + // Numbers, booleans, etc + computedData.add(parentKey, obj, declaredDependencies); + } + } + + async addComputedData(data) { + if (isPlainObject(data?.[this.config.keys.computed])) { + this.computedData = new ComputedData(this.config); + + // Note that `permalink` is only a thing that gets consumed—it does not go directly into generated data + // this allows computed entries to use page.url or page.outputPath and they’ll be resolved properly + + // TODO Room for optimization here—we don’t need to recalculate `getOutputHref` and `getOutputPath` + // TODO Why are these using addTemplateString instead of add + this.computedData.addTemplateString( + "page.url", + async function (data) { + return this.tmpl.getOutputHref(data); + }, + data.permalink ? ["permalink"] : undefined, + false, // skip symbol resolution + this, + ); + + this.computedData.addTemplateString( + "page.outputPath", + async function (data) { + return this.tmpl.getOutputPath(data); + }, + data.permalink ? ["permalink"] : undefined, + false, // skip symbol resolution + this, + ); + + // Check for reserved properties in computed data + if (this.config.freezeReservedData) { + ReservedData.check(data[this.config.keys.computed]); + } + + // actually add the computed data + this._addComputedEntry(this.computedData, data[this.config.keys.computed]); + + // limited run of computed data—save the stuff that relies on collections for later. + debug("First round of computed data for %o", this.inputPath); + await this.computedData.setupData(data, function (entry) { + return !this.isUsesStartsWith(entry, "collections."); + + // TODO possible improvement here is to only process page.url, page.outputPath, permalink + // instead of only punting on things that rely on collections. + // let firstPhaseComputedData = ["page.url", "page.outputPath", ...this.getOrderFor("page.url"), ...this.getOrderFor("page.outputPath")]; + // return firstPhaseComputedData.indexOf(entry) > -1; + }); + } else { + if (!("page" in data)) { + data.page = {}; + } + + // pagination will already have these set via Pagination->getPageTemplates + if (data.page.url && data.page.outputPath) { + return; + } + + let { href, path } = await this.getOutputLocations(data); + data.page.url = href; + data.page.outputPath = path; + } + } + + // Computed data consuming collections! + async resolveRemainingComputedData(data) { + // If it doesn’t exist, computed data is not used for this template + if (this.computedData) { + debug("Second round of computed data for %o", this.inputPath); + return this.computedData.processRemainingData(data); + } + } + + static augmentWithTemplateContentProperty(obj) { + return Object.defineProperties(obj, { + needsCheck: { + enumerable: false, + writable: true, + value: true, + }, + _templateContent: { + enumerable: false, + writable: true, + value: undefined, + }, + templateContent: { + enumerable: true, + set(content) { + if (content === undefined) { + this.needsCheck = false; + } + this._templateContent = content; + }, + get() { + if (this.needsCheck && this._templateContent === undefined) { + if (this.template.isRenderable()) { + // should at least warn here + throw new TemplateContentPrematureUseError( + `Tried to use templateContent too early on ${this.inputPath}${ + this.pageNumber ? ` (page ${this.pageNumber})` : "" + }`, + ); + } else { + throw new TemplateContentUnrenderedTemplateError( + `Tried to use templateContent on unrendered template: ${ + this.inputPath + }${this.pageNumber ? ` (page ${this.pageNumber})` : ""}`, + ); + } + } + return this._templateContent; + }, + }, + // Alias for templateContent for consistency + content: { + enumerable: true, + get() { + return this.templateContent; + }, + set() { + throw new Error("Setter not available for `content`. Use `templateContent` instead."); + }, + }, + }); + } + + static async runPreprocessors(inputPath, content, data, preprocessors) { + let skippedVia = false; + for (let [name, preprocessor] of Object.entries(preprocessors)) { + let { filter, callback } = preprocessor; + + let filters; + if (Array.isArray(filter)) { + filters = filter; + } else if (typeof filter === "string") { + filters = filter.split(","); + } else { + throw new Error( + `Expected file extensions passed to "${name}" content preprocessor to be a string or array. Received: ${filter}`, + ); + } + + filters = filters.map((extension) => { + if (extension.startsWith(".") || extension === "*") { + return extension; + } + + return `.${extension}`; + }); + + if (!filters.some((extension) => extension === "*" || inputPath.endsWith(extension))) { + // skip + continue; + } + + try { + let ret = await callback.call( + { + inputPath, + }, + data, + content, + ); + + // Returning explicit false is the same as ignoring the template + if (ret === false) { + skippedVia = name; + continue; + } + + // Different from transforms: returning falsy (not false) here does nothing (skips the preprocessor) + if (ret) { + content = ret; + } + } catch (e) { + throw new EleventyBaseError( + `Preprocessor \`${name}\` encountered an error when transforming ${inputPath}.`, + e, + ); + } + } + + return { + skippedVia, + content, + }; + } + + async getTemplates(data) { + let content = await this.getPreRender(); + let { skippedVia, content: rawInput } = await Template.runPreprocessors( + this.inputPath, + content, + data, + this.config.preprocessors, + ); + + if (skippedVia) { + debug( + "Skipping %o, the %o preprocessor returned an explicit `false`", + this.inputPath, + skippedVia, + ); + return []; + } + + // Raw Input *includes* preprocessor modifications + // https://github.com/11ty/eleventy/issues/1206 + data.page.rawInput = rawInput; + + if (!Pagination.hasPagination(data)) { + await this.addComputedData(data); + + let obj = { + template: this, // not on the docs but folks are relying on it + rawInput, + groupNumber: 0, // i18n plugin + data, + + page: data.page, + inputPath: this.inputPath, + fileSlug: this.fileSlugStr, + filePathStem: this.filePathStem, + date: data.page.date, + outputPath: data.page.outputPath, + url: data.page.url, + }; + + obj = Template.augmentWithTemplateContentProperty(obj); + + return [obj]; + } else { + // needs collections for pagination items + // but individual pagination entries won’t be part of a collection + this.paging = new Pagination(this, data, this.config); + + let pageTemplates = await this.paging.getPageTemplates(); + let objects = []; + + for (let pageEntry of pageTemplates) { + await pageEntry.template.addComputedData(pageEntry.data); + + let obj = { + template: pageEntry.template, // not on the docs but folks are relying on it + rawInput, + pageNumber: pageEntry.pageNumber, + groupNumber: pageEntry.groupNumber || 0, + + data: pageEntry.data, + + inputPath: this.inputPath, + fileSlug: this.fileSlugStr, + filePathStem: this.filePathStem, + + page: pageEntry.data.page, + date: pageEntry.data.page.date, + outputPath: pageEntry.data.page.outputPath, + url: pageEntry.data.page.url, + }; + + obj = Template.augmentWithTemplateContentProperty(obj); + + objects.push(obj); + } + + return objects; + } + } + + async _write({ url, outputPath, data, rawInput }, finalContent) { + let lang = { + start: "Writing", + finished: "written", + }; + + if (!this.isDryRun) { + if (this.logger.isLoggingEnabled()) { + let isVirtual = this.isVirtualTemplate(); + let tr = await this.getTemplateRender(); + let engineList = tr.getReadableEnginesListDifferingFromFileExtension(); + let suffix = `${isVirtual ? " (virtual)" : ""}${engineList ? ` (${engineList})` : ""}`; + this.logger.log( + `${lang.start} ${outputPath} ${chalk.gray(`from ${this.inputPath}${suffix}`)}`, + ); + } + } else if (this.isDryRun) { + return; + } + + let templateBenchmarkDir = this.bench.get("Template make parent directory"); + templateBenchmarkDir.before(); + + if (this.eleventyConfig.templateHandling?.writeMode === "async") { + await this.fsManager.createDirectoryForFile(outputPath); + } else { + this.fsManager.createDirectoryForFileSync(outputPath); + } + + templateBenchmarkDir.after(); + + if (!Buffer.isBuffer(finalContent) && typeof finalContent !== "string") { + throw new Error( + `The return value from the render function for the ${this.engine.name} template was not a String or Buffer. Received ${finalContent}`, + ); + } + + let templateBenchmark = this.bench.get("Template Write"); + templateBenchmark.before(); + + if (this.eleventyConfig.templateHandling?.writeMode === "async") { + await this.fsManager.writeFile(outputPath, finalContent); + } else { + this.fsManager.writeFileSync(outputPath, finalContent); + } + + templateBenchmark.after(); + this.writeCount++; + debug(`${outputPath} ${lang.finished}.`); + + let ret = { + inputPath: this.inputPath, + outputPath: outputPath, + url, + content: finalContent, + rawInput, + }; + + if (data && this.config.dataFilterSelectors?.size > 0) { + ret.data = this.retrieveDataForJsonOutput(data, this.config.dataFilterSelectors); + } + + return ret; + } + + async #renderPageEntryWithLayoutsAndTransforms(pageEntry) { + let content; + let layoutKey = pageEntry.data[this.config.keys.layout]; + if (this.engine.useLayouts() && layoutKey) { + let layout = pageEntry.template.getLayout(layoutKey); + content = await layout.renderPageEntry(pageEntry); + } else { + content = pageEntry.templateContent; + } + + await this.runLinters(content, pageEntry); + + content = await this.runTransforms(content, pageEntry); + return content; + } + + async renderPageEntry(pageEntry) { + // @cachedproperty + if (!pageEntry.template._cacheRenderedTransformsAndLayoutsPromise) { + pageEntry.template._cacheRenderedTransformsAndLayoutsPromise = + this.#renderPageEntryWithLayoutsAndTransforms(pageEntry); + } + + return pageEntry.template._cacheRenderedTransformsAndLayoutsPromise; + } + + retrieveDataForJsonOutput(data, selectors) { + let filtered = {}; + for (let selector of selectors) { + let value = lodashGet(data, selector); + lodashSet(filtered, selector, value); + } + return filtered; + } + + async generateMapEntry(mapEntry, to) { + let ret = []; + + for (let page of mapEntry._pages) { + let content; + + // Note that behavior.render is overridden when using json or ndjson output + if (page.template.isRenderable()) { + // this reuses page.templateContent, it doesn’t render it + content = await page.template.renderPageEntry(page); + } + + if (to === "json" || to === "ndjson") { + let obj = { + url: page.url, + inputPath: page.inputPath, + outputPath: page.outputPath, + rawInput: page.rawInput, + content: content, + }; + + if (this.config.dataFilterSelectors?.size > 0) { + obj.data = this.retrieveDataForJsonOutput(page.data, this.config.dataFilterSelectors); + } + + if (to === "ndjson") { + let jsonString = JSON.stringify(obj); + this.logger.toStream(jsonString + os.EOL); + continue; + } + + // json + ret.push(obj); + continue; + } + + if (!page.template.isRenderable()) { + debug("Template not written %o from %o.", page.outputPath, page.template.inputPath); + continue; + } + + if (!page.template.behavior.isWriteable()) { + debug( + "Template not written %o from %o (via permalink: false, permalink.build: false, or a permalink object without a build property).", + page.outputPath, + page.template.inputPath, + ); + continue; + } + + // compile returned undefined + if (content !== undefined) { + ret.push(this._write(page, content)); + } + } + + return Promise.all(ret); + } + + async clone() { + // TODO do we need to even run the constructor here or can we simplify it even more + let tmpl = new Template( + this.inputPath, + this.templateData, + this.extensionMap, + this.eleventyConfig, + ); + + // We use this cheap property setter below instead + // await tmpl.getTemplateRender(); + + // preserves caches too, e.g. _frontMatterDataCache + // Does not yet include .computedData + for (let key in this) { + tmpl[key] = this[key]; + } + + return tmpl; + } + + getWriteCount() { + return this.writeCount; + } + + getRenderCount() { + return this.renderCount; + } + + async getInputFileStat() { + // @cachedproperty + if (!this._stats) { + this._stats = fsStat(this.inputPath); + } + + return this._stats; + } + + async _getDateInstance(key = "birthtimeMs") { + let stat = await this.getInputFileStat(); + + // Issue 1823: https://github.com/11ty/eleventy/issues/1823 + // return current Date in a Lambda + // otherwise ctime would be "1980-01-01T00:00:00.000Z" + // otherwise birthtime would be "1970-01-01T00:00:00.000Z" + if (stat.birthtimeMs === 0) { + return new Date(); + } + + let newDate = new Date(stat[key]); + + debug( + "Template date: using file’s %o for %o of %o (from %o)", + key, + this.inputPath, + newDate, + stat.birthtimeMs, + ); + + return newDate; + } + + async getMappedDate(data) { + let dateValue = data?.date; + + // These can return a Date object, or a string. + // Already type checked to be functions in UserConfig + for (let fn of this.config.customDateParsing) { + let ret = fn.call( + { + page: data.page, + }, + dateValue, + ); + + if (ret) { + debug("getMappedDate: date value override via `addDateParsing` callback to %o", ret); + dateValue = ret; + } + } + + if (dateValue) { + debug("getMappedDate: using a date in the data for %o of %o", this.inputPath, data.date); + if (dateValue?.constructor?.name === "DateTime") { + // YAML does its own date parsing + debug("getMappedDate: found DateTime instance: %o", dateValue); + return dateValue.toJSDate(); + } + + if (dateValue instanceof Date) { + // YAML does its own date parsing + debug("getMappedDate: found Date instance (maybe from YAML): %o", dateValue); + return dateValue; + } + + if (typeof dateValue !== "string") { + throw new Error( + `Data cascade value for \`date\` (${dateValue}) is invalid for ${this.inputPath}. Expected a JavaScript Date instance, luxon DateTime instance, or String value.`, + ); + } + + // special strings + if (!this.isVirtualTemplate()) { + if (dateValue.toLowerCase() === "git last modified") { + let d = await getDateFromGitLastUpdated(this.inputPath); + if (d) { + return d; + } + + // return now if this file is not yet available in `git` + return new Date(); + } + if (dateValue.toLowerCase() === "last modified") { + return this._getDateInstance("ctimeMs"); + } + if (dateValue.toLowerCase() === "git created") { + let d = await getDateFromGitFirstAdded(this.inputPath); + if (d) { + return d; + } + + // return now if this file is not yet available in `git` + return new Date(); + } + if (dateValue.toLowerCase() === "created") { + return this._getDateInstance("birthtimeMs"); + } + } + + // try to parse with Luxon + let date = DateTime.fromISO(dateValue, { zone: "utc" }); + if (!date.isValid) { + throw new Error( + `Data cascade value for \`date\` (${dateValue}) is invalid for ${this.inputPath}`, + ); + } + debug("getMappedDate: Luxon parsed %o: %o and %o", dateValue, date, date.toJSDate()); + + return date.toJSDate(); + } + + // No Date supplied in the Data Cascade, try to find the date in the file name + let filepathRegex = this.inputPath.match(/(\d{4}-\d{2}-\d{2})/); + if (filepathRegex !== null) { + // if multiple are found in the path, use the first one for the date + let dateObj = DateTime.fromISO(filepathRegex[1], { + zone: "utc", + }).toJSDate(); + debug( + "getMappedDate: using filename regex time for %o of %o: %o", + this.inputPath, + filepathRegex[1], + dateObj, + ); + return dateObj; + } + + // No Date supplied in the Data Cascade + if (this.isVirtualTemplate()) { + return new Date(); + } + + return this._getDateInstance("birthtimeMs"); + } + + // Important reminder: Template data is first generated in TemplateMap + async getTemplateMapEntries(data) { + debugDev("%o getMapped()", this.inputPath); + + this.behavior.setRenderViaDataCascade(data); + + let entries = []; + // does not return outputPath or url, we don’t want to render permalinks yet + entries.push({ + template: this, + inputPath: this.inputPath, + data, + }); + + return entries; + } +} + +export default Template; diff --git a/node_modules/@11ty/eleventy/src/TemplateBehavior.js b/node_modules/@11ty/eleventy/src/TemplateBehavior.js new file mode 100644 index 0000000..8dff97c --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplateBehavior.js @@ -0,0 +1,85 @@ +import { isPlainObject } from "@11ty/eleventy-utils"; + +class TemplateBehavior { + #isRenderOptional; + + constructor(config) { + this.render = true; + this.write = true; + this.outputFormat = null; + + if (!config) { + throw new Error("Missing config argument in TemplateBehavior"); + } + this.config = config; + } + + // Render override set to false + isRenderableDisabled() { + return this.renderableOverride === false; + } + + isRenderableOptional() { + return this.#isRenderOptional; + } + + // undefined (fallback), true, false + setRenderableOverride(renderableOverride) { + if (renderableOverride === "optional") { + this.#isRenderOptional = true; + this.renderableOverride = undefined; + } else { + this.#isRenderOptional = false; + this.renderableOverride = renderableOverride; + } + } + + // permalink *has* a build key or output is json/ndjson + isRenderable() { + return this.renderableOverride ?? (this.render || this.isRenderForced()); + } + + setOutputFormat(format) { + this.outputFormat = format; + } + + isRenderForced() { + return this.outputFormat === "json" || this.outputFormat === "ndjson"; + } + + isWriteable() { + return this.write; + } + + // Duplicate logic with TemplatePermalink constructor + setRenderViaDataCascade(data) { + // render is false *only* if `build` key does not exist in permalink objects (both in data and eleventyComputed) + // (note that permalink: false means it won’t write but will still render) + + let keys = new Set(); + if (isPlainObject(data.permalink)) { + for (let key of Object.keys(data.permalink)) { + keys.add(key); + } + } + + let computedKey = this.config.keys.computed; + if (computedKey in data && isPlainObject(data[computedKey]?.permalink)) { + for (let key of Object.keys(data[computedKey].permalink)) { + keys.add(key); + } + } + + if (keys.size) { + this.render = keys.has("build"); + } + } + + setFromPermalink(templatePermalink) { + // this.render is duplicated between TemplatePermalink and `setRenderViaDataCascade` above + this.render = templatePermalink._isRendered; + + this.write = templatePermalink._writeToFileSystem; + } +} +export default TemplateBehavior; diff --git a/node_modules/@11ty/eleventy/src/TemplateCollection.js b/node_modules/@11ty/eleventy/src/TemplateCollection.js new file mode 100755 index 0000000..6e99a32 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplateCollection.js @@ -0,0 +1,77 @@ +import { TemplatePath } from "@11ty/eleventy-utils"; + +import TemplateData from "./Data/TemplateData.js"; +import Sortable from "./Util/Objects/Sortable.js"; +import { isGlobMatch } from "./Util/GlobMatcher.js"; + +class TemplateCollection extends Sortable { + constructor() { + super(); + + this._filteredByGlobsCache = new Map(); + } + + getAll() { + return this.items.slice(); + } + + getAllSorted() { + return this.sort(Sortable.sortFunctionDateInputPath); + } + + getSortedByDate() { + return this.sort(Sortable.sortFunctionDate); + } + + getGlobs(globs) { + if (typeof globs === "string") { + globs = [globs]; + } + + globs = globs.map((glob) => TemplatePath.addLeadingDotSlash(glob)); + + return globs; + } + + getFilteredByGlob(globs) { + globs = this.getGlobs(globs); + + let key = globs.join("::"); + if (!this._dirty) { + // Try to find a pre-sorted list and clone it. + if (this._filteredByGlobsCache.has(key)) { + return [...this._filteredByGlobsCache.get(key)]; + } + } else if (this._filteredByGlobsCache.size) { + // Blow away cache + this._filteredByGlobsCache = new Map(); + } + + let filtered = this.getAllSorted().filter((item) => { + return isGlobMatch(item.inputPath, globs); + }); + this._dirty = false; + this._filteredByGlobsCache.set(key, [...filtered]); + return filtered; + } + + getFilteredByTag(tagName) { + return this.getAllSorted().filter((item) => { + if (!tagName || TemplateData.getIncludedTagNames(item.data).includes(tagName)) { + return true; + } + return false; + }); + } + + getFilteredByTags(...tags) { + return this.getAllSorted().filter((item) => { + let itemTags = new Set(TemplateData.getIncludedTagNames(item.data)); + return tags.every((requiredTag) => { + return itemTags.has(requiredTag); + }); + }); + } +} + +export default TemplateCollection; diff --git a/node_modules/@11ty/eleventy/src/TemplateConfig.js b/node_modules/@11ty/eleventy/src/TemplateConfig.js new file mode 100644 index 0000000..e1fff8f --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplateConfig.js @@ -0,0 +1,565 @@ +import fs from "node:fs"; +import chalk from "kleur"; +import { Merge, TemplatePath, isPlainObject } from "@11ty/eleventy-utils"; +import debugUtil from "debug"; + +import { EleventyImportRaw } from "./Util/Require.js"; +import EleventyBaseError from "./Errors/EleventyBaseError.js"; +import UserConfig from "./UserConfig.js"; +import GlobalDependencyMap from "./GlobalDependencyMap.js"; +import ExistsCache from "./Util/ExistsCache.js"; +import eventBus from "./EventBus.js"; +import ProjectTemplateFormats from "./Util/ProjectTemplateFormats.js"; + +const debug = debugUtil("Eleventy:TemplateConfig"); +const debugDev = debugUtil("Dev:Eleventy:TemplateConfig"); + +/** + * @module 11ty/eleventy/TemplateConfig + */ + +/** + * Config as used by the template. + * @typedef {object} module:11ty/eleventy/TemplateConfig~TemplateConfig~config + * @property {String} [pathPrefix] - The path prefix. + */ + +/** + * Errors in eleventy config. + * @ignore + */ +class EleventyConfigError extends EleventyBaseError {} + +/** + * Errors in eleventy plugins. + * @ignore + */ +class EleventyPluginError extends EleventyBaseError {} + +/** + * Config for a template. + * @ignore + * @param {{}} customRootConfig - tbd. + * @param {String} projectConfigPath - Path to local project config. + */ +class TemplateConfig { + #templateFormats; + #runMode; + #configManuallyDefined = false; + /** @type {UserConfig} */ + #userConfig = new UserConfig(); + #existsCache = new ExistsCache(); + #usesGraph; + #previousBuildModifiedFile; + + constructor(customRootConfig, projectConfigPath) { + /** @type {object} */ + this.overrides = {}; + + /** + * @type {String} + * @description Path to local project config. + * @default .eleventy.js + */ + if (projectConfigPath !== undefined) { + this.#configManuallyDefined = true; + + if (!projectConfigPath) { + // falsy skips config files + this.projectConfigPaths = []; + } else { + this.projectConfigPaths = [projectConfigPath]; + } + } else { + this.projectConfigPaths = [ + ".eleventy.js", + "eleventy.config.js", + "eleventy.config.mjs", + "eleventy.config.cjs", + ]; + } + + if (customRootConfig) { + /** + * @type {object} + * @description Custom root config. + */ + this.customRootConfig = customRootConfig; + debug("Warning: Using custom root config!"); + } else { + this.customRootConfig = null; + } + + this.hasConfigMerged = false; + this.isEsm = false; + + this.userConfig.events.on("eleventy#templateModified", (inputPath, metadata = {}) => { + // Might support multiple at some point + this.setPreviousBuildModifiedFile(inputPath, metadata); + + // Issue #3569, set that this file exists in the cache + this.#existsCache.set(inputPath, true); + }); + } + + setPreviousBuildModifiedFile(inputPath, metadata = {}) { + this.#previousBuildModifiedFile = inputPath; + } + + getPreviousBuildModifiedFile() { + return this.#previousBuildModifiedFile; + } + + get userConfig() { + return this.#userConfig; + } + + get aggregateBenchmark() { + return this.userConfig.benchmarks.aggregate; + } + + /* Setter for Logger */ + setLogger(logger) { + this.logger = logger; + this.userConfig.logger = this.logger; + } + + /* Setter for Directories instance */ + setDirectories(directories) { + this.directories = directories; + this.userConfig.directories = directories.getUserspaceInstance(); + } + + /* Setter for TemplateFormats instance */ + setTemplateFormats(templateFormats) { + this.#templateFormats = templateFormats; + } + + get templateFormats() { + if (!this.#templateFormats) { + this.#templateFormats = new ProjectTemplateFormats(); + } + return this.#templateFormats; + } + + /* Backwards compat */ + get inputDir() { + return this.directories.input; + } + + setRunMode(runMode) { + this.#runMode = runMode; + } + + shouldSpiderJavaScriptDependencies() { + // not for a standard build + return ( + (this.#runMode === "watch" || this.#runMode === "serve") && + this.userConfig.watchJavaScriptDependencies + ); + } + + /** + * Normalises local project config file path. + * + * @method + * @returns {String|undefined} - The normalised local project config file path. + */ + getLocalProjectConfigFile() { + let configFiles = this.getLocalProjectConfigFiles(); + + let configFile = configFiles.find((path) => path && fs.existsSync(path)); + if (configFile) { + return configFile; + } + } + + getLocalProjectConfigFiles() { + let paths = this.projectConfigPaths; + if (paths?.length > 0) { + return TemplatePath.addLeadingDotSlashArray(paths.filter((path) => Boolean(path))); + } + return []; + } + + setProjectUsingEsm(isEsmProject) { + this.isEsm = !!isEsmProject; + this.usesGraph.setIsEsm(isEsmProject); + } + + getIsProjectUsingEsm() { + return this.isEsm; + } + + /** + * Resets the configuration. + */ + async reset() { + debugDev("Resetting configuration: TemplateConfig and UserConfig."); + this.userConfig.reset(); + this.usesGraph.reset(); // needs to be before forceReloadConfig #3711 + + // await this.initializeRootConfig(); + await this.forceReloadConfig(); + + // Clear the compile cache + eventBus.emit("eleventy.compileCacheReset"); + } + + /** + * Resets the configuration while in watch mode. + * + * @todo Add implementation. + */ + resetOnWatch() { + // nothing yet + } + + hasInitialized() { + return this.hasConfigMerged; + } + + /** + * Async-friendly init method + */ + async init(overrides) { + await this.initializeRootConfig(); + + if (overrides) { + this.appendToRootConfig(overrides); + } + + this.config = await this.mergeConfig(); + this.hasConfigMerged = true; + } + + /** + * Force a reload of the configuration object. + */ + async forceReloadConfig() { + this.hasConfigMerged = false; + await this.init(); + } + + /** + * Returns the config object. + * + * @returns {{}} - The config object. + */ + getConfig() { + if (!this.hasConfigMerged) { + throw new Error("Invalid call to .getConfig(). Needs an .init() first."); + } + + return this.config; + } + + /** + * Overwrites the config path. + * + * @param {String} path - The new config path. + */ + async setProjectConfigPath(path) { + this.#configManuallyDefined = true; + + if (path !== undefined) { + this.projectConfigPaths = [path]; + } else { + this.projectConfigPaths = []; + } + + if (this.hasConfigMerged) { + // merge it again + debugDev("Merging in getConfig again after setting the local project config path."); + await this.forceReloadConfig(); + } + } + + /** + * Overwrites the path prefix. + * + * @param {String} pathPrefix - The new path prefix. + */ + setPathPrefix(pathPrefix) { + if (pathPrefix && pathPrefix !== "/") { + debug("Setting pathPrefix to %o", pathPrefix); + this.overrides.pathPrefix = pathPrefix; + } + } + + /** + * Gets the current path prefix denoting the root folder the output will be deployed to + * + * @returns {String} - The path prefix string + */ + getPathPrefix() { + if (this.overrides.pathPrefix) { + return this.overrides.pathPrefix; + } + + if (!this.hasConfigMerged) { + throw new Error("Config has not yet merged. Needs `init()`."); + } + + return this.config?.pathPrefix; + } + + /** + * Bootstraps the config object. + */ + async initializeRootConfig() { + this.rootConfig = this.customRootConfig; + if (!this.rootConfig) { + let { default: cfg } = await import("./defaultConfig.js"); + this.rootConfig = cfg; + } + + if (typeof this.rootConfig === "function") { + // Not yet using async in defaultConfig.js + this.rootConfig = this.rootConfig.call(this, this.userConfig); + } + + debug("Default Eleventy config %o", this.rootConfig); + } + + /* + * Add additional overrides to the root config object, used for testing + * + * @param {object} - a subset of the return Object from the user’s config file. + */ + appendToRootConfig(obj) { + Object.assign(this.rootConfig, obj); + } + + /* + * Process the userland plugins from the Config + * + * @param {object} - the return Object from the user’s config file. + */ + async processPlugins({ dir, pathPrefix }) { + this.userConfig.dir = dir; + this.userConfig.pathPrefix = pathPrefix; + + // for Nested addPlugin calls, Issue #1925 + this.userConfig._enablePluginExecution(); + + let storedActiveNamespace = this.userConfig.activeNamespace; + for (let { plugin, options, pluginNamespace } of this.userConfig.plugins) { + try { + this.userConfig.activeNamespace = pluginNamespace; + await this.userConfig._executePlugin(plugin, options); + } catch (e) { + let name = this.userConfig._getPluginName(plugin); + let namespaces = [storedActiveNamespace, pluginNamespace].filter((entry) => !!entry); + + let namespaceStr = ""; + if (namespaces.length) { + namespaceStr = ` (namespace: ${namespaces.join(".")})`; + } + + throw new EleventyPluginError( + `Error processing ${name ? `the \`${name}\`` : "a"} plugin${namespaceStr}`, + e, + ); + } + } + + this.userConfig.activeNamespace = storedActiveNamespace; + + this.userConfig._disablePluginExecution(); + } + + /** + * Fetches and executes the local configuration file + * + * @returns {Promise} merged - The merged config file object. + */ + async requireLocalConfigFile() { + let localConfig = {}; + let exportedConfig = {}; + + let path = this.projectConfigPaths.filter((path) => path).find((path) => fs.existsSync(path)); + + if (this.projectConfigPaths.length > 0 && this.#configManuallyDefined && !path) { + throw new EleventyConfigError( + "A configuration file was specified but not found: " + this.projectConfigPaths.join(", "), + ); + } + + debug(`Merging default config with ${path}`); + if (path) { + try { + let { default: configDefaultReturn, config: exportedConfigObject } = + await EleventyImportRaw(path, this.isEsm ? "esm" : "cjs"); + + exportedConfig = exportedConfigObject || {}; + + if (this.directories && Object.keys(exportedConfigObject?.dir || {}).length > 0) { + debug( + "Setting directories via `config.dir` export from config file: %o", + exportedConfigObject.dir, + ); + this.directories.setViaConfigObject(exportedConfigObject.dir); + } + + if (typeof configDefaultReturn === "function") { + localConfig = await configDefaultReturn(this.userConfig); + } else { + localConfig = configDefaultReturn; + } + + // Removed a check for `filters` in 3.0.0-alpha.6 (now using addTransform instead) https://v3.11ty.dev/docs/config/#transforms + } catch (err) { + let isModuleError = + err instanceof Error && (err?.message || "").includes("Cannot find module"); + + // TODO the error message here is bad and I feel bad (needs more accurate info) + return Promise.reject( + new EleventyConfigError( + `Error in your Eleventy config file '${path}'.` + + (isModuleError ? chalk.cyan(" You may need to run `npm install`.") : ""), + err, + ), + ); + } + } else { + debug( + "Project config file not found (not an error—skipping). Looked in: %o", + this.projectConfigPaths, + ); + } + + return { + localConfig, + exportedConfig, + }; + } + + /** + * Merges different config files together. + * + * @returns {Promise} merged - The merged config file. + */ + async mergeConfig() { + let { localConfig, exportedConfig } = await this.requireLocalConfigFile(); + + // Merge `export const config = {}` with `return {}` in config callback + if (isPlainObject(exportedConfig)) { + localConfig = Merge(localConfig || {}, exportedConfig); + } + + if (this.directories) { + if (Object.keys(this.userConfig.directoryAssignments || {}).length > 0) { + debug( + "Setting directories via set*Directory configuration APIs %o", + this.userConfig.directoryAssignments, + ); + this.directories.setViaConfigObject(this.userConfig.directoryAssignments); + } + + if (localConfig && Object.keys(localConfig?.dir || {}).length > 0) { + debug( + "Setting directories via `dir` object return from configuration file: %o", + localConfig.dir, + ); + this.directories.setViaConfigObject(localConfig.dir); + } + } + + // `templateFormats` is an override via `setTemplateFormats` + if (this.userConfig?.templateFormats) { + this.templateFormats.setViaConfig(this.userConfig.templateFormats); + } else if (localConfig?.templateFormats || this.rootConfig?.templateFormats) { + // Local project config or defaultConfig.js + this.templateFormats.setViaConfig( + localConfig.templateFormats || this.rootConfig?.templateFormats, + ); + } + + // `templateFormatsAdded` is additive via `addTemplateFormats` + if (this.userConfig?.templateFormatsAdded) { + this.templateFormats.addViaConfig(this.userConfig.templateFormatsAdded); + } + + let mergedConfig = Merge({}, this.rootConfig, localConfig); + + // Setup a few properties for plugins: + + // Set frozen templateFormats + mergedConfig.templateFormats = Object.freeze(this.templateFormats.getTemplateFormats()); + + // Setup pathPrefix set via command line for plugin consumption + if (this.overrides.pathPrefix) { + mergedConfig.pathPrefix = this.overrides.pathPrefix; + } + + // Returning a falsy value (e.g. "") from user config should reset to the default value. + if (!mergedConfig.pathPrefix) { + mergedConfig.pathPrefix = this.rootConfig.pathPrefix; + } + + // This is not set in UserConfig.js so that getters aren’t converted to strings + // We want to error if someone attempts to use a setter there. + if (this.directories) { + mergedConfig.directories = this.directories.getUserspaceInstance(); + } + + // Delay processing plugins until after the result of localConfig is returned + // But BEFORE the rest of the config options are merged + // this way we can pass directories and other template information to plugins + + await this.userConfig.events.emit("eleventy.beforeConfig", this.userConfig); + + let pluginsBench = this.aggregateBenchmark.get("Processing plugins in config"); + pluginsBench.before(); + await this.processPlugins(mergedConfig); + pluginsBench.after(); + + // Template formats added via plugins + if (this.userConfig?.templateFormatsAdded) { + this.templateFormats.addViaConfig(this.userConfig.templateFormatsAdded); + mergedConfig.templateFormats = Object.freeze(this.templateFormats.getTemplateFormats()); + } + + let eleventyConfigApiMergingObject = this.userConfig.getMergingConfigObject(); + + if ("templateFormats" in eleventyConfigApiMergingObject) { + throw new Error( + "Internal error: templateFormats should not return from `getMergingConfigObject`", + ); + } + + // Overrides are only used by pathPrefix + debug("Configuration overrides: %o", this.overrides); + Merge(mergedConfig, eleventyConfigApiMergingObject, this.overrides); + + debug("Current configuration: %o", mergedConfig); + + // Add to the merged config too + mergedConfig.uses = this.usesGraph; + + return mergedConfig; + } + + get usesGraph() { + if (!this.#usesGraph) { + this.#usesGraph = new GlobalDependencyMap(); + this.#usesGraph.setIsEsm(this.isEsm); + this.#usesGraph.setTemplateConfig(this); + } + return this.#usesGraph; + } + + get uses() { + if (!this.usesGraph) { + throw new Error("The Eleventy Global Dependency Graph has not yet been initialized."); + } + return this.usesGraph; + } + + get existsCache() { + return this.#existsCache; + } +} + +export default TemplateConfig; diff --git a/node_modules/@11ty/eleventy/src/TemplateContent.js b/node_modules/@11ty/eleventy/src/TemplateContent.js new file mode 100644 index 0000000..97d440f --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplateContent.js @@ -0,0 +1,748 @@ +import os from "node:os"; + +import fs from "node:fs"; +import matter from "gray-matter"; +import lodash from "@11ty/lodash-custom"; +import { TemplatePath } from "@11ty/eleventy-utils"; +import debugUtil from "debug"; + +import TemplateData from "./Data/TemplateData.js"; +import TemplateRender from "./TemplateRender.js"; +import EleventyBaseError from "./Errors/EleventyBaseError.js"; +import EleventyErrorUtil from "./Errors/EleventyErrorUtil.js"; +import eventBus from "./EventBus.js"; + +import { withResolvers } from "./Util/PromiseUtil.js"; + +const { set: lodashSet } = lodash; +const debug = debugUtil("Eleventy:TemplateContent"); +const debugDev = debugUtil("Dev:Eleventy:TemplateContent"); + +class TemplateContentFrontMatterError extends EleventyBaseError {} +class TemplateContentCompileError extends EleventyBaseError {} +class TemplateContentRenderError extends EleventyBaseError {} + +class TemplateContent { + #initialized = false; + #config; + #templateRender; + #preprocessorEngine; + #extensionMap; + #configOptions; + + constructor(inputPath, templateConfig) { + if (!templateConfig || templateConfig.constructor.name !== "TemplateConfig") { + throw new Error("Missing or invalid `templateConfig` argument"); + } + this.eleventyConfig = templateConfig; + this.inputPath = inputPath; + } + + async asyncTemplateInitialization() { + if (!this.hasTemplateRender()) { + await this.getTemplateRender(); + } + + if (this.#initialized) { + return; + } + this.#initialized = true; + + let preprocessorEngineName = this.templateRender.getPreprocessorEngineName(); + if (preprocessorEngineName && this.templateRender.engine.getName() !== preprocessorEngineName) { + let engine = await this.templateRender.getEngineByName(preprocessorEngineName); + this.#preprocessorEngine = engine; + } + } + + resetCachedTemplate({ eleventyConfig }) { + this.eleventyConfig = eleventyConfig; + } + + get dirs() { + return this.eleventyConfig.directories; + } + + get inputDir() { + return this.dirs.input; + } + + get outputDir() { + return this.dirs.output; + } + + getResetTypes(types) { + if (types) { + return Object.assign( + { + data: false, + read: false, + render: false, + }, + types, + ); + } + + return { + data: true, + read: true, + render: true, + }; + } + + // Called during an incremental build when the template instance is cached but needs to be reset because it has changed + resetCaches(types) { + types = this.getResetTypes(types); + + if (types.read) { + delete this.readingPromise; + delete this.inputContent; + delete this._frontMatterDataCache; + } + if (types.render) { + this.#templateRender = undefined; + } + } + + get extensionMap() { + if (!this.#extensionMap) { + throw new Error("Internal error: Missing `extensionMap` in TemplateContent."); + } + return this.#extensionMap; + } + + set extensionMap(map) { + this.#extensionMap = map; + } + + set eleventyConfig(config) { + this.#config = config; + + if (this.#config.constructor.name === "TemplateConfig") { + this.#configOptions = this.#config.getConfig(); + } else { + throw new Error("Tried to get an TemplateConfig but none was found."); + } + } + + get eleventyConfig() { + if (this.#config.constructor.name === "TemplateConfig") { + return this.#config; + } + throw new Error("Tried to get an TemplateConfig but none was found."); + } + + get config() { + if (this.#config.constructor.name === "TemplateConfig" && !this.#configOptions) { + this.#configOptions = this.#config.getConfig(); + } + + return this.#configOptions; + } + + get bench() { + return this.config.benchmarkManager.get("Aggregate"); + } + + get engine() { + return this.templateRender.engine; + } + + get templateRender() { + if (!this.hasTemplateRender()) { + throw new Error(`\`templateRender\` has not yet initialized on ${this.inputPath}`); + } + + return this.#templateRender; + } + + hasTemplateRender() { + return !!this.#templateRender; + } + + async getTemplateRender() { + if (!this.#templateRender) { + this.#templateRender = new TemplateRender(this.inputPath, this.eleventyConfig); + this.#templateRender.extensionMap = this.extensionMap; + + return this.#templateRender.init().then(() => { + return this.#templateRender; + }); + } + + return this.#templateRender; + } + + // For monkey patchers + get frontMatter() { + if (this.frontMatterOverride) { + return this.frontMatterOverride; + } else { + throw new Error( + "Unfortunately you’re using code that monkey patched some Eleventy internals and it isn’t async-friendly. Change your code to use the async `read()` method on the template instead!", + ); + } + } + + // For monkey patchers + set frontMatter(contentOverride) { + this.frontMatterOverride = contentOverride; + } + + getInputPath() { + return this.inputPath; + } + + getInputDir() { + return this.inputDir; + } + + isVirtualTemplate() { + let def = this.getVirtualTemplateDefinition(); + return !!def; + } + + getVirtualTemplateDefinition() { + let inputDirRelativeInputPath = + this.eleventyConfig.directories.getInputPathRelativeToInputDirectory(this.inputPath); + return this.config.virtualTemplates[inputDirRelativeInputPath]; + } + + async #read() { + let content = await this.inputContent; + + if (content || content === "") { + let tr = await this.getTemplateRender(); + if (tr.engine.useJavaScriptImport()) { + return { + data: {}, + content, + }; + } + + let options = this.config.frontMatterParsingOptions || {}; + let fm; + try { + // Added in 3.0, passed along to front matter engines + options.filePath = this.inputPath; + fm = matter(content, options); + } catch (e) { + throw new TemplateContentFrontMatterError( + `Having trouble reading front matter from template ${this.inputPath}`, + e, + ); + } + + if (options.excerpt && fm.excerpt) { + let excerptString = fm.excerpt + (options.excerpt_separator || "---"); + if (fm.content.startsWith(excerptString + os.EOL)) { + // with an os-specific newline after excerpt separator + fm.content = fm.excerpt.trim() + "\n" + fm.content.slice((excerptString + os.EOL).length); + } else if (fm.content.startsWith(excerptString + "\n")) { + // with a newline (\n) after excerpt separator + // This is necessary for some git configurations on windows + fm.content = fm.excerpt.trim() + "\n" + fm.content.slice((excerptString + 1).length); + } else if (fm.content.startsWith(excerptString)) { + // no newline after excerpt separator + fm.content = fm.excerpt + fm.content.slice(excerptString.length); + } + + // alias, defaults to page.excerpt + let alias = options.excerpt_alias || "page.excerpt"; + lodashSet(fm.data, alias, fm.excerpt); + } + + // For monkey patchers that used `frontMatter` 🤧 + // https://github.com/11ty/eleventy/issues/613#issuecomment-999637109 + // https://github.com/11ty/eleventy/issues/2710#issuecomment-1373854834 + // Removed this._frontMatter monkey patcher help in 3.0.0-alpha.7 + + return fm; + } else { + return { + data: {}, + content: "", + excerpt: "", + }; + } + } + + async read() { + if (!this.readingPromise) { + if (!this.inputContent) { + // @cachedproperty + this.inputContent = this.getInputContent(); + } + + // @cachedproperty + this.readingPromise = this.#read(); + } + + return this.readingPromise; + } + + /* Incremental builds cache the Template instances (in TemplateWriter) but + * these template specific caches are important for Pagination */ + static cache(path, content) { + this._inputCache.set(TemplatePath.absolutePath(path), content); + } + + static getCached(path) { + return this._inputCache.get(TemplatePath.absolutePath(path)); + } + + static deleteFromInputCache(path) { + this._inputCache.delete(TemplatePath.absolutePath(path)); + } + + // Used via clone + setInputContent(content) { + this.inputContent = content; + } + + async getInputContent() { + let tr = await this.getTemplateRender(); + + let virtualTemplateDefinition = this.getVirtualTemplateDefinition(); + if (virtualTemplateDefinition) { + let { content } = virtualTemplateDefinition; + return content; + } + + if ( + tr.engine.useJavaScriptImport() && + typeof tr.engine.getInstanceFromInputPath === "function" + ) { + return tr.engine.getInstanceFromInputPath(this.inputPath); + } + + if (!tr.engine.needsToReadFileContents()) { + return ""; + } + + let templateBenchmark = this.bench.get("Template Read"); + templateBenchmark.before(); + + let content; + + if (this.config.useTemplateCache) { + content = TemplateContent.getCached(this.inputPath); + } + + if (!content && content !== "") { + let contentBuffer = fs.readFileSync(this.inputPath); + + content = contentBuffer.toString("utf8"); + + if (this.config.useTemplateCache) { + TemplateContent.cache(this.inputPath, content); + } + } + + templateBenchmark.after(); + + return content; + } + + async _testGetFrontMatter() { + let fm = this.frontMatterOverride ? this.frontMatterOverride : await this.read(); + + return fm; + } + + async getPreRender() { + let fm = this.frontMatterOverride ? this.frontMatterOverride : await this.read(); + + return fm.content; + } + + async #getFrontMatterData() { + let fm = await this.read(); + + // gray-matter isn’t async-friendly but can return a promise from custom front matter + if (fm.data instanceof Promise) { + fm.data = await fm.data; + } + + let tr = await this.getTemplateRender(); + let extraData = await tr.engine.getExtraDataFromFile(this.inputPath); + + let virtualTemplateDefinition = this.getVirtualTemplateDefinition(); + let virtualTemplateData; + if (virtualTemplateDefinition) { + virtualTemplateData = virtualTemplateDefinition.data; + } + + let data = Object.assign(fm.data, extraData, virtualTemplateData); + + TemplateData.cleanupData(data, { + file: this.inputPath, + isVirtualTemplate: Boolean(virtualTemplateData), + }); + + return { + data, + excerpt: fm.excerpt, + }; + } + + async getFrontMatterData() { + if (!this._frontMatterDataCache) { + // @cachedproperty + this._frontMatterDataCache = this.#getFrontMatterData(); + } + + return this._frontMatterDataCache; + } + + async getEngineOverride() { + return this.getFrontMatterData().then((data) => { + return data[this.config.keys.engineOverride]; + }); + } + + // checks engines + isTemplateCacheable() { + if (this.#preprocessorEngine) { + return this.#preprocessorEngine.cacheable; + } + return this.engine.cacheable; + } + + _getCompileCache(str) { + // Caches used to be bifurcated based on engine name, now they’re based on inputPath + // TODO does `cacheable` need to help inform whether a cache is used here? + let inputPathMap = TemplateContent._compileCache.get(this.inputPath); + if (!inputPathMap) { + inputPathMap = new Map(); + TemplateContent._compileCache.set(this.inputPath, inputPathMap); + } + + let cacheable = this.isTemplateCacheable(); + let { useCache, key } = this.engine.getCompileCacheKey(str, this.inputPath); + + // We also tie the compile cache key to the UserConfig instance, to alleviate issues with global template cache + // Better to move the cache to the Eleventy instance instead, no? + // (This specifically failed I18nPluginTest cases with filters being cached across tests and not having access to each plugin’s options) + key = this.eleventyConfig.userConfig._getUniqueId() + key; + + return [cacheable, key, inputPathMap, useCache]; + } + + async compile(str, options = {}) { + let { type, bypassMarkdown, engineOverride } = options; + + // Must happen before cacheable fetch below + // Likely only necessary for Eleventy Layouts, see TemplateMap->initDependencyMap + await this.asyncTemplateInitialization(); + + // this.templateRender is guaranteed here + let tr = await this.getTemplateRender(); + if (engineOverride !== undefined) { + debugDev("%o overriding template engine to use %o", this.inputPath, engineOverride); + await tr.setEngineOverride(engineOverride, bypassMarkdown); + } else { + tr.setUseMarkdown(!bypassMarkdown); + } + if (bypassMarkdown && !this.engine.needsCompilation(str)) { + return function () { + return str; + }; + } + + debugDev("%o compile() using engine: %o", this.inputPath, tr.engineName); + + try { + let res; + if (this.config.useTemplateCache) { + let [cacheable, key, cache, useCache] = this._getCompileCache(str); + if (cacheable && key) { + if (useCache && cache.has(key)) { + this.bench.get("(count) Template Compile Cache Hit").incrementCount(); + return cache.get(key); + } + + this.bench.get("(count) Template Compile Cache Miss").incrementCount(); + + // Compile cache is cleared when the resource is modified (below) + + // Compilation is async, so we eagerly cache a Promise that eventually + // resolves to the compiled function + let withRes = withResolvers(); + res = withRes.resolve; + + cache.set(key, withRes.promise); + } + } + + let typeStr = type ? ` ${type}` : ""; + let templateBenchmark = this.bench.get(`Template Compile${typeStr}`); + let inputPathBenchmark = this.bench.get(`> Compile${typeStr} > ${this.inputPath}`); + templateBenchmark.before(); + inputPathBenchmark.before(); + + let fn = await tr.getCompiledTemplate(str); + inputPathBenchmark.after(); + templateBenchmark.after(); + debugDev("%o getCompiledTemplate function created", this.inputPath); + if (this.config.useTemplateCache && res) { + res(fn); + } + return fn; + } catch (e) { + let [cacheable, key, cache] = this._getCompileCache(str); + if (cacheable && key) { + cache.delete(key); + } + debug(`Having trouble compiling template ${this.inputPath}: %O`, str); + throw new TemplateContentCompileError( + `Having trouble compiling template ${this.inputPath}`, + e, + ); + } + } + + getParseForSymbolsFunction(str) { + let engine = this.engine; + + // Don’t use markdown as the engine to parse for symbols + // TODO pass in engineOverride here + if (this.#preprocessorEngine) { + engine = this.#preprocessorEngine; + } + + if ("parseForSymbols" in engine) { + return () => { + if (Array.isArray(str)) { + return str + .filter((entry) => typeof entry === "string") + .map((entry) => engine.parseForSymbols(entry)) + .flat(); + } + if (typeof str === "string") { + return engine.parseForSymbols(str); + } + return []; + }; + } + } + + // used by computed data or for permalink functions + async _renderFunction(fn, ...args) { + let mixins = Object.assign({}, this.config.javascriptFunctions); + let result = await fn.call(mixins, ...args); + + // normalize Buffer away if returned from permalink + if (Buffer.isBuffer(result)) { + return result.toString(); + } + + return result; + } + + async renderComputedData(str, data) { + if (typeof str === "function") { + return this._renderFunction(str, data); + } + + return this._render(str, data, { + type: "Computed Data", + bypassMarkdown: true, + }); + } + + async renderPermalink(permalink, data) { + let tr = await this.getTemplateRender(); + let permalinkCompilation = tr.engine.permalinkNeedsCompilation(permalink); + + // No string compilation: + // ({ compileOptions: { permalink: "raw" }}) + // These mean `permalink: false`, which is no file system writing: + // ({ compileOptions: { permalink: false }}) + // ({ compileOptions: { permalink: () => false }}) + // ({ compileOptions: { permalink: () => (() = > false) }}) + if (permalinkCompilation === false && typeof permalink !== "function") { + return permalink; + } + + /* Custom `compile` function for permalinks, usage: + permalink: function(permalinkString, inputPath) { + return async function(data) { + return "THIS IS MY RENDERED PERMALINK"; + } + } + */ + if (permalinkCompilation && typeof permalinkCompilation === "function") { + permalink = await this._renderFunction(permalinkCompilation, permalink, this.inputPath); + } + + // Raw permalink function (in the app code data cascade) + if (typeof permalink === "function") { + return this._renderFunction(permalink, data); + } + + return this._render(permalink, data, { + type: "Permalink", + bypassMarkdown: true, + }); + } + + async render(str, data, bypassMarkdown) { + return this._render(str, data, { + type: "Content", + bypassMarkdown, + }); + } + + _getPaginationLogSuffix(data) { + let suffix = []; + if ("pagination" in data) { + suffix.push(" ("); + if (data.pagination.pages) { + suffix.push( + `${data.pagination.pages.length} page${data.pagination.pages.length !== 1 ? "s" : ""}`, + ); + } else { + suffix.push("Pagination"); + } + suffix.push(")"); + } + return suffix.join(""); + } + + async _render(str, data, options = {}) { + let { bypassMarkdown, type } = options; + + try { + if (bypassMarkdown && !this.engine.needsCompilation(str)) { + return str; + } + + let fn = await this.compile(str, { + bypassMarkdown, + engineOverride: data[this.config.keys.engineOverride], + type, + }); + + if (fn === undefined) { + return; + } else if (typeof fn !== "function") { + throw new Error(`The \`compile\` function did not return a function. Received ${fn}`); + } + + // Benchmark + let templateBenchmark = this.bench.get("Render"); + let inputPathBenchmark = this.bench.get( + `> Render${type ? ` ${type}` : ""} > ${this.inputPath}${this._getPaginationLogSuffix(data)}`, + ); + + templateBenchmark.before(); + if (inputPathBenchmark) { + inputPathBenchmark.before(); + } + + let rendered = await fn(data); + + if (inputPathBenchmark) { + inputPathBenchmark.after(); + } + templateBenchmark.after(); + debugDev("%o getCompiledTemplate called, rendered content created", this.inputPath); + return rendered; + } catch (e) { + if (EleventyErrorUtil.isPrematureTemplateContentError(e)) { + return Promise.reject(e); + } else { + let tr = await this.getTemplateRender(); + let engine = tr.getReadableEnginesList(); + debug(`Having trouble rendering ${engine} template ${this.inputPath}: %O`, str); + return Promise.reject( + new TemplateContentRenderError( + `Having trouble rendering ${engine} template ${this.inputPath}`, + e, + ), + ); + } + } + } + + getExtensionEntries() { + return this.engine.extensionEntries; + } + + isFileRelevantToThisTemplate(incrementalFile, metadata = {}) { + // always relevant if incremental file not set (build everything) + if (!incrementalFile) { + return true; + } + + let hasDependencies = this.engine.hasDependencies(incrementalFile); + + let isRelevant = this.engine.isFileRelevantTo(this.inputPath, incrementalFile); + + debug( + "Test dependencies to see if %o is relevant to %o: %o", + this.inputPath, + incrementalFile, + isRelevant, + ); + + let extensionEntries = this.getExtensionEntries().filter((entry) => !!entry.isIncrementalMatch); + if (extensionEntries.length) { + for (let entry of extensionEntries) { + if ( + entry.isIncrementalMatch.call( + { + inputPath: this.inputPath, + isFullTemplate: metadata.isFullTemplate, + isFileRelevantToInputPath: isRelevant, + doesFileHaveDependencies: hasDependencies, + }, + incrementalFile, + ) + ) { + return true; + } + } + + return false; + } else { + // Not great way of building all templates if this is a layout, include, JS dependency. + // TODO improve this for default template syntaxes + + // This is the fallback way of determining if something is incremental (no isIncrementalMatch available) + // This will be true if the inputPath and incrementalFile are the same + if (isRelevant) { + return true; + } + + // only return true here if dependencies are not known + if (!hasDependencies && !metadata.isFullTemplate) { + return true; + } + } + + return false; + } +} + +TemplateContent._inputCache = new Map(); +TemplateContent._compileCache = new Map(); +eventBus.on("eleventy.resourceModified", (path) => { + // delete from input cache + TemplateContent.deleteFromInputCache(path); + + // delete from compile cache + let normalized = TemplatePath.addLeadingDotSlash(path); + let compileCache = TemplateContent._compileCache.get(normalized); + if (compileCache) { + compileCache.clear(); + } +}); + +// Used when the configuration file reset https://github.com/11ty/eleventy/issues/2147 +eventBus.on("eleventy.compileCacheReset", () => { + TemplateContent._compileCache = new Map(); +}); + +export default TemplateContent; diff --git a/node_modules/@11ty/eleventy/src/TemplateFileSlug.js b/node_modules/@11ty/eleventy/src/TemplateFileSlug.js new file mode 100644 index 0000000..03c9a29 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplateFileSlug.js @@ -0,0 +1,57 @@ +import path from "node:path"; +import { TemplatePath } from "@11ty/eleventy-utils"; + +class TemplateFileSlug { + constructor(inputPath, extensionMap, eleventyConfig) { + let inputDir = eleventyConfig.directories.input; + if (inputDir) { + inputPath = TemplatePath.stripLeadingSubPath(inputPath, inputDir); + } + + this.inputPath = inputPath; + this.cleanInputPath = inputPath.replace(/^.\//, ""); + + let dirs = this.cleanInputPath.split("/"); + this.dirs = dirs; + this.dirs.pop(); + + this.parsed = path.parse(inputPath); + this.filenameNoExt = extensionMap.removeTemplateExtension(this.parsed.base); + } + + // `page.filePathStem` see https://v3.11ty.dev/docs/data-eleventy-supplied/#page-variable + getFullPathWithoutExtension() { + return "/" + TemplatePath.join(...this.dirs, this._getRawSlug()); + } + + _getRawSlug() { + let slug = this.filenameNoExt; + return this._stripDateFromSlug(slug); + } + + /** Removes dates in the format of YYYY-MM-DD from a given slug string candidate. */ + _stripDateFromSlug(slug) { + let reg = slug.match(/\d{4}-\d{2}-\d{2}-(.*)/); + if (reg) { + return reg[1]; + } + return slug; + } + + // `page.fileSlug` see https://v3.11ty.dev/docs/data-eleventy-supplied/#page-variable + getSlug() { + let rawSlug = this._getRawSlug(); + + if (rawSlug === "index") { + if (!this.dirs.length) { + return ""; + } + let lastDir = this.dirs[this.dirs.length - 1]; + return this._stripDateFromSlug(lastDir); + } + + return rawSlug; + } +} + +export default TemplateFileSlug; diff --git a/node_modules/@11ty/eleventy/src/TemplateGlob.js b/node_modules/@11ty/eleventy/src/TemplateGlob.js new file mode 100644 index 0000000..9db85e9 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplateGlob.js @@ -0,0 +1,35 @@ +import { TemplatePath } from "@11ty/eleventy-utils"; + +class TemplateGlob { + static normalizePath(...paths) { + if (paths[0].charAt(0) === "!") { + throw new Error( + `TemplateGlob.normalizePath does not accept ! glob paths like: ${paths.join("")}`, + ); + } + return TemplatePath.addLeadingDotSlash(TemplatePath.join(...paths)); + } + + static normalize(path) { + path = path.trim(); + if (path.charAt(0) === "!") { + return "!" + TemplateGlob.normalizePath(path.slice(1)); + } else { + return TemplateGlob.normalizePath(path); + } + } + + static map(files) { + if (typeof files === "string") { + return TemplateGlob.normalize(files); + } else if (Array.isArray(files)) { + return files.map(function (path) { + return TemplateGlob.normalize(path); + }); + } else { + return files; + } + } +} + +export default TemplateGlob; diff --git a/node_modules/@11ty/eleventy/src/TemplateLayout.js b/node_modules/@11ty/eleventy/src/TemplateLayout.js new file mode 100644 index 0000000..f8526f2 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplateLayout.js @@ -0,0 +1,240 @@ +import { TemplatePath } from "@11ty/eleventy-utils"; +import debugUtil from "debug"; + +import TemplateLayoutPathResolver from "./TemplateLayoutPathResolver.js"; +import TemplateContent from "./TemplateContent.js"; +import TemplateData from "./Data/TemplateData.js"; +import layoutCache from "./LayoutCache.js"; + +// const debug = debugUtil("Eleventy:TemplateLayout"); +const debugDev = debugUtil("Dev:Eleventy:TemplateLayout"); + +class TemplateLayout extends TemplateContent { + constructor(key, extensionMap, eleventyConfig) { + if (!eleventyConfig || eleventyConfig.constructor.name !== "TemplateConfig") { + throw new Error("Expected `eleventyConfig` in TemplateLayout constructor."); + } + + let resolver = new TemplateLayoutPathResolver(key, extensionMap, eleventyConfig); + let resolvedPath = resolver.getFullPath(); + + super(resolvedPath, eleventyConfig); + + if (!extensionMap) { + throw new Error("Expected `extensionMap` in TemplateLayout constructor."); + } + + this.extensionMap = extensionMap; + this.key = resolver.getNormalizedLayoutKey(); + this.dataKeyLayoutPath = key; + this.inputPath = resolvedPath; + } + + getKey() { + return this.key; + } + + getFullKey() { + return TemplateLayout.resolveFullKey(this.dataKeyLayoutPath, this.inputDir); + } + + getCacheKeys() { + return new Set([this.dataKeyLayoutPath, this.getFullKey(), this.key]); + } + + static resolveFullKey(key, inputDir) { + return TemplatePath.join(inputDir, key); + } + + static getTemplate(key, eleventyConfig, extensionMap) { + let config = eleventyConfig.getConfig(); + if (!config.useTemplateCache) { + return new TemplateLayout(key, extensionMap, eleventyConfig); + } + + let inputDir = eleventyConfig.directories.input; + let fullKey = TemplateLayout.resolveFullKey(key, inputDir); + if (!layoutCache.has(fullKey)) { + let layout = new TemplateLayout(key, extensionMap, eleventyConfig); + + layoutCache.add(layout); + debugDev("Added %o to LayoutCache", key); + + return layout; + } + + return layoutCache.get(fullKey); + } + + async getTemplateLayoutMapEntry() { + let { data: frontMatterData } = await this.getFrontMatterData(); + return { + // Used by `TemplateLayout.getTemplate()` + key: this.dataKeyLayoutPath, + + // used by `this.getData()` + frontMatterData, + }; + } + + async #getTemplateLayoutMap() { + // For both the eleventy.layouts event and cyclical layout chain checking (e.g., a => b => c => a) + let layoutChain = new Set(); + layoutChain.add(this.inputPath); + + let cfgKey = this.config.keys.layout; + let map = []; + let mapEntry = await this.getTemplateLayoutMapEntry(); + + map.push(mapEntry); + + while (mapEntry.frontMatterData && cfgKey in mapEntry.frontMatterData) { + // Layout of the current layout + let parentLayoutKey = mapEntry.frontMatterData[cfgKey]; + + let layout = TemplateLayout.getTemplate( + parentLayoutKey, + this.eleventyConfig, + this.extensionMap, + ); + + // Abort if a circular layout chain is detected. Otherwise, we'll time out and run out of memory. + if (layoutChain.has(layout.inputPath)) { + throw new Error( + `Your layouts have a circular reference, starting at ${map[0].key}! The layout at ${layout.inputPath} was specified twice in this layout chain.`, + ); + } + + // Keep track of this layout so we can detect duplicates in subsequent iterations + layoutChain.add(layout.inputPath); + + // reassign for next loop + mapEntry = await layout.getTemplateLayoutMapEntry(); + + map.push(mapEntry); + } + + this.layoutChain = Array.from(layoutChain); + + return map; + } + + async getTemplateLayoutMap() { + if (!this.cachedLayoutMap) { + this.cachedLayoutMap = this.#getTemplateLayoutMap(); + } + + return this.cachedLayoutMap; + } + + async getLayoutChain() { + if (!Array.isArray(this.layoutChain)) { + await this.getTemplateLayoutMap(); + } + + return this.layoutChain; + } + + async #getData() { + let map = await this.getTemplateLayoutMap(); + let dataToMerge = []; + for (let j = map.length - 1; j >= 0; j--) { + dataToMerge.push(map[j].frontMatterData); + } + + // Deep merge of layout front matter + let data = TemplateData.mergeDeep(this.config.dataDeepMerge, {}, ...dataToMerge); + delete data[this.config.keys.layout]; + + return data; + } + + async getData() { + if (!this.dataCache) { + this.dataCache = this.#getData(); + } + + return this.dataCache; + } + + async #getCachedCompiledLayoutFunction() { + let rawInput = await this.getPreRender(); + return this.compile(rawInput); + } + + // Do only cache this layout’s render function and delegate the rest to the other templates. + async getCachedCompiledLayoutFunction() { + if (!this.cachedCompiledLayoutFunction) { + this.cachedCompiledLayoutFunction = this.#getCachedCompiledLayoutFunction(); + } + + return this.cachedCompiledLayoutFunction; + } + + async getCompiledLayoutFunctions() { + let layoutMap = await this.getTemplateLayoutMap(); + let fns = []; + + try { + fns.push({ + render: await this.getCachedCompiledLayoutFunction(), + }); + + if (layoutMap.length > 1) { + let [, /*currentLayout*/ parentLayout] = layoutMap; + let { key } = parentLayout; + + let layoutTemplate = TemplateLayout.getTemplate( + key, + this.eleventyConfig, + this.extensionMap, + ); + + // The parent already includes the rest of the layout chain + let upstreamFns = await layoutTemplate.getCompiledLayoutFunctions(); + for (let j = 0, k = upstreamFns.length; j < k; j++) { + fns.push(upstreamFns[j]); + } + } + + return fns; + } catch (e) { + debugDev("Clearing LayoutCache after error."); + layoutCache.clear(); + throw e; + } + } + + async render() { + throw new Error("Internal error: `render` was removed from TemplateLayout.js in Eleventy 3.0."); + } + + // Inefficient? We want to compile all the templatelayouts into a single reusable callback? + // Trouble: layouts may need data variables present downstream/upstream + // This is called from Template->renderPageEntry + async renderPageEntry(pageEntry) { + let templateContent = pageEntry.templateContent; + let compiledFunctions = await this.getCompiledLayoutFunctions(); + for (let { render } of compiledFunctions) { + let data = { + content: templateContent, + ...pageEntry.data, + }; + + templateContent = await render(data); + } + + // Don’t set `templateContent` on pageEntry because collection items should not have layout markup + return templateContent; + } + + resetCaches(types) { + super.resetCaches(types); + delete this.dataCache; + delete this.layoutChain; + delete this.cachedLayoutMap; + delete this.cachedCompiledLayoutFunction; + } +} + +export default TemplateLayout; diff --git a/node_modules/@11ty/eleventy/src/TemplateLayoutPathResolver.js b/node_modules/@11ty/eleventy/src/TemplateLayoutPathResolver.js new file mode 100644 index 0000000..9f5a8ee --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplateLayoutPathResolver.js @@ -0,0 +1,136 @@ +import fs from "node:fs"; +import { TemplatePath } from "@11ty/eleventy-utils"; +// import debugUtil from "debug"; +// const debug = debugUtil("Eleventy:TemplateLayoutPathResolver"); + +class TemplateLayoutPathResolver { + constructor(path, extensionMap, templateConfig) { + if (!templateConfig) { + throw new Error("Expected `templateConfig` in TemplateLayoutPathResolver constructor"); + } + + this.templateConfig = templateConfig; + this.originalPath = path; + this.originalDisplayPath = + TemplatePath.join(this.layoutsDir, this.originalPath) + + ` (via \`layout: ${this.originalPath}\`)`; // for error messaging + + this.path = path; + this.aliases = {}; + this.extensionMap = extensionMap; + if (!extensionMap) { + throw new Error("Expected `extensionMap` in TemplateLayoutPathResolver constructor."); + } + + this.init(); + } + + getVirtualTemplate(layoutPath) { + let inputDirRelativePath = + this.templateConfig.directories.getLayoutPathRelativeToInputDirectory(layoutPath); + return this.config.virtualTemplates[inputDirRelativePath]; + } + + get dirs() { + return this.templateConfig.directories; + } + + get inputDir() { + return this.dirs.input; + } + + get layoutsDir() { + return this.dirs.layouts || this.dirs.includes; + } + + /* Backwards compat */ + getLayoutsDir() { + return this.layoutsDir; + } + + setAliases() { + this.aliases = Object.assign({}, this.config.layoutAliases, this.aliases); + } + + // for testing + set config(cfg) { + this._config = cfg; + this.init(); + } + + get config() { + if (!this.templateConfig) { + throw new Error("Internal error: Missing this.templateConfig"); + } + + return this.templateConfig.getConfig(); + } + + exists(layoutPath) { + if (this.getVirtualTemplate(layoutPath)) { + return true; + } + let fullPath = this.templateConfig.directories.getLayoutPath(layoutPath); + if (this.templateConfig.existsCache.exists(fullPath)) { + return true; + } + return false; + } + + init() { + // we might be able to move this into the constructor? + this.aliases = Object.assign({}, this.config.layoutAliases, this.aliases); + + if (this.aliases[this.path]) { + this.path = this.aliases[this.path]; + } + + let useLayoutResolution = this.config.layoutResolution; + + if (this.path.split(".").length > 0 && this.exists(this.path)) { + this.filename = this.path; + this.fullPath = this.templateConfig.directories.getLayoutPath(this.path); + } else if (useLayoutResolution) { + this.filename = this.findFileName(); + this.fullPath = this.templateConfig.directories.getLayoutPath(this.filename || ""); + } + } + + addLayoutAlias(from, to) { + this.aliases[from] = to; + } + + getFileName() { + if (!this.filename) { + throw new Error( + `You’re trying to use a layout that does not exist: ${this.originalDisplayPath}`, + ); + } + + return this.filename; + } + + getFullPath() { + if (!this.filename) { + throw new Error( + `You’re trying to use a layout that does not exist: ${this.originalDisplayPath}`, + ); + } + + return this.fullPath; + } + + findFileName() { + for (let filename of this.extensionMap.getFileList(this.path)) { + if (this.exists(filename)) { + return filename; + } + } + } + + getNormalizedLayoutKey() { + return TemplatePath.stripLeadingSubPath(this.fullPath, this.layoutsDir); + } +} + +export default TemplateLayoutPathResolver; diff --git a/node_modules/@11ty/eleventy/src/TemplateMap.js b/node_modules/@11ty/eleventy/src/TemplateMap.js new file mode 100644 index 0000000..52cceb1 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplateMap.js @@ -0,0 +1,684 @@ +import { isPlainObject, TemplatePath } from "@11ty/eleventy-utils"; +import debugUtil from "debug"; + +import TemplateCollection from "./TemplateCollection.js"; +import EleventyErrorUtil from "./Errors/EleventyErrorUtil.js"; +import UsingCircularTemplateContentReferenceError from "./Errors/UsingCircularTemplateContentReferenceError.js"; +import EleventyBaseError from "./Errors/EleventyBaseError.js"; +import DuplicatePermalinkOutputError from "./Errors/DuplicatePermalinkOutputError.js"; +import TemplateData from "./Data/TemplateData.js"; +import GlobalDependencyMap from "./GlobalDependencyMap.js"; + +const debug = debugUtil("Eleventy:TemplateMap"); + +class EleventyMapPagesError extends EleventyBaseError {} +class EleventyDataSchemaError extends EleventyBaseError {} + +// These template URL filenames are allowed to exclude file extensions +const EXTENSIONLESS_URL_ALLOWLIST = [ + "/_redirects", // Netlify specific + "/.htaccess", // Apache + "/_headers", // Cloudflare +]; + +// must match TemplateDepGraph +const SPECIAL_COLLECTION_NAMES = { + keys: "[keys]", + all: "all", +}; + +class TemplateMap { + #dependencyMapInitialized = false; + + constructor(eleventyConfig) { + if (!eleventyConfig || eleventyConfig.constructor.name !== "TemplateConfig") { + throw new Error("Missing or invalid `eleventyConfig` argument."); + } + this.eleventyConfig = eleventyConfig; + this.map = []; + this.collectionsData = null; + this.cached = false; + this.verboseOutput = true; + this.collection = new TemplateCollection(); + } + + set userConfig(config) { + this._userConfig = config; + } + + get userConfig() { + if (!this._userConfig) { + // TODO use this.config for this, need to add collections to mergeable props in userconfig + this._userConfig = this.eleventyConfig.userConfig; + } + + return this._userConfig; + } + + get config() { + if (!this._config) { + this._config = this.eleventyConfig.getConfig(); + } + return this._config; + } + + async add(template) { + if (!template) { + return; + } + + let data = await template.getData(); + let entries = await template.getTemplateMapEntries(data); + + for (let map of entries) { + this.map.push(map); + } + } + + getMap() { + return this.map; + } + + getTagTarget(str) { + if (str === "collections") { + // special, means targeting `collections` specifically + return SPECIAL_COLLECTION_NAMES.keys; + } + + if (str.startsWith("collections.")) { + return str.slice("collections.".length); + } + + // Fixes #2851 + if (str.startsWith("collections['") || str.startsWith('collections["')) { + return str.slice("collections['".length, -2); + } + } + + getPaginationTagTarget(entry) { + if (entry.data.pagination?.data) { + return this.getTagTarget(entry.data.pagination.data); + } + } + + #addEntryToGlobalDependencyGraph(entry) { + let consumes = []; + consumes.push(this.getPaginationTagTarget(entry)); + + if (Array.isArray(entry.data.eleventyImport?.collections)) { + for (let tag of entry.data.eleventyImport.collections) { + consumes.push(tag); + } + } + + // Important: consumers must come before publishers + + // TODO it’d be nice to set the dependency relationship for addCollection here + // But collections are not yet populated (they populate after template order) + let publishes = TemplateData.getIncludedCollectionNames(entry.data); + + this.config.uses.addNewNodeRelationships(entry.inputPath, consumes, publishes); + } + + addAllToGlobalDependencyGraph() { + this.#dependencyMapInitialized = true; + + // Should come before individual entry additions + this.config.uses.initializeUserConfigurationApiCollections(); + + for (let entry of this.map) { + this.#addEntryToGlobalDependencyGraph(entry); + } + } + + async setCollectionByTagName(tagName) { + if (this.isUserConfigCollectionName(tagName)) { + // async + this.collectionsData[tagName] = await this.getUserConfigCollection(tagName); + } else { + this.collectionsData[tagName] = this.getTaggedCollection(tagName); + } + + let precompiled = this.config.precompiledCollections; + if (precompiled?.[tagName]) { + if ( + tagName === "all" || + !Array.isArray(this.collectionsData[tagName]) || + this.collectionsData[tagName].length === 0 + ) { + this.collectionsData[tagName] = precompiled[tagName]; + } + } + } + + // TODO(slightlyoff): major bottleneck + async initDependencyMap(fullTemplateOrder) { + // Temporary workaround for async constructor work in templates + // Issue #3170 #3870 + let inputPathSet = new Set(fullTemplateOrder); + await Promise.all( + this.map + .filter(({ inputPath }) => { + return inputPathSet.has(inputPath); + }) + .map(({ template }) => { + // This also happens for layouts in TemplateContent->compile + return template.asyncTemplateInitialization(); + }), + ); + + for (let depEntry of fullTemplateOrder) { + if (GlobalDependencyMap.isCollection(depEntry)) { + let tagName = GlobalDependencyMap.getTagName(depEntry); + // [keys] should initialize `all` + if (tagName === SPECIAL_COLLECTION_NAMES.keys) { + await this.setCollectionByTagName("all"); + // [NAME] is special and implied (e.g. [keys]) + } else if (!tagName.startsWith("[") && !tagName.endsWith("]")) { + // is a tag (collection) entry + await this.setCollectionByTagName(tagName); + } + continue; + } + + // is a template entry + let map = this.getMapEntryForInputPath(depEntry); + await this.#initDependencyMapEntry(map); + } + } + + async #initDependencyMapEntry(map) { + try { + map._pages = await map.template.getTemplates(map.data); + } catch (e) { + throw new EleventyMapPagesError( + "Error generating template page(s) for " + map.inputPath + ".", + e, + ); + } + + if (map._pages.length === 0) { + // Reminder: a serverless code path was removed here. + } else { + let counter = 0; + for (let page of map._pages) { + // Copy outputPath to map entry + // This is no longer used internally, just for backwards compatibility + // Error added in v3 for https://github.com/11ty/eleventy/issues/3183 + if (map.data.pagination) { + if (!Object.prototype.hasOwnProperty.call(map, "outputPath")) { + Object.defineProperty(map, "outputPath", { + get() { + throw new Error( + "Internal error: `.outputPath` on a paginated map entry is not consistent. Use `_pages[…].outputPath` instead.", + ); + }, + }); + } + } else if (!map.outputPath) { + map.outputPath = page.outputPath; + } + + if (counter === 0 || map.data.pagination?.addAllPagesToCollections) { + if (map.data.eleventyExcludeFromCollections !== true) { + // is in *some* collections + this.collection.add(page); + } + } + + counter++; + } + } + } + + getTemplateOrder() { + // 1. Templates that don’t use Pagination + // 2. Pagination templates that consume config API collections + // 3. Pagination templates consuming `collections` + // 4. Pagination templates consuming `collections.all` + let fullTemplateOrder = this.config.uses.getTemplateOrder(); + + return fullTemplateOrder + .map((entry) => { + if (GlobalDependencyMap.isCollection(entry)) { + return entry; + } + + let inputPath = TemplatePath.addLeadingDotSlash(entry); + if (!this.hasMapEntryForInputPath(inputPath)) { + return false; + } + return inputPath; + }) + .filter(Boolean); + } + + async cache() { + if (!this.#dependencyMapInitialized) { + this.addAllToGlobalDependencyGraph(); + } + + this.collectionsData = {}; + + for (let entry of this.map) { + entry.data.collections = this.collectionsData; + } + + let fullTemplateOrder = this.getTemplateOrder(); + debug( + "Rendering templates in order (%o concurrency): %O", + this.userConfig.getConcurrency(), + fullTemplateOrder, + ); + + await this.initDependencyMap(fullTemplateOrder); + await this.resolveRemainingComputedData(); + + let orderedPaths = this.#removeTagsFromTemplateOrder(fullTemplateOrder); + + let orderedMap = orderedPaths.map((inputPath) => { + return this.getMapEntryForInputPath(inputPath); + }); + + await this.config.events.emitLazy("eleventy.contentMap", () => { + return { + inputPathToUrl: this.generateInputUrlContentMap(orderedMap), + urlToInputPath: this.generateUrlMap(orderedMap), + }; + }); + + await this.runDataSchemas(orderedMap); + await this.populateContentDataInMap(orderedMap); + + this.populateCollectionsWithContent(); + this.cached = true; + + this.checkForDuplicatePermalinks(); + this.checkForMissingFileExtensions(); + + await this.config.events.emitLazy("eleventy.layouts", () => this.generateLayoutsMap()); + } + + generateInputUrlContentMap(orderedMap) { + let entries = {}; + for (let entry of orderedMap) { + entries[entry.inputPath] = entry._pages.map((entry) => entry.url); + } + return entries; + } + + generateUrlMap(orderedMap) { + let entries = {}; + for (let entry of orderedMap) { + for (let page of entry._pages) { + // duplicate urls throw an error, so we can return non array here + entries[page.url] = { + inputPath: entry.inputPath, + groupNumber: page.groupNumber, + }; + } + } + return entries; + } + + hasMapEntryForInputPath(inputPath) { + return Boolean(this.getMapEntryForInputPath(inputPath)); + } + + // TODO(slightlyoff): hot inner loop? + getMapEntryForInputPath(inputPath) { + let absoluteInputPath = TemplatePath.absolutePath(inputPath); + return this.map.find((entry) => { + if (entry.inputPath === inputPath || entry.inputPath === absoluteInputPath) { + return entry; + } + }); + } + + #removeTagsFromTemplateOrder(maps) { + return maps.filter((dep) => !GlobalDependencyMap.isCollection(dep)); + } + + async runDataSchemas(orderedMap) { + for (let map of orderedMap) { + if (!map._pages) { + continue; + } + + for (let pageEntry of map._pages) { + // Data Schema callback #879 + if (typeof pageEntry.data[this.config.keys.dataSchema] === "function") { + try { + await pageEntry.data[this.config.keys.dataSchema](pageEntry.data); + } catch (e) { + throw new EleventyDataSchemaError( + `Error in the data schema for: ${map.inputPath} (via \`eleventyDataSchema\`)`, + e, + ); + } + } + } + } + } + + async populateContentDataInMap(orderedMap) { + let usedTemplateContentTooEarlyMap = []; + + // Note that empty pagination templates will be skipped here as not renderable + let filteredMap = orderedMap.filter((entry) => entry.template.isRenderable()); + + // Get concurrency level from user config + const concurrency = this.userConfig.getConcurrency(); + + // Process the templates in chunks to limit concurrency + // This replaces the functionality of p-map's concurrency option + for (let i = 0; i < filteredMap.length; i += concurrency) { + // Create a chunk of tasks that will run in parallel + const chunk = filteredMap.slice(i, i + concurrency); + + // Run the chunk of tasks in parallel + await Promise.all( + chunk.map(async (map) => { + if (!map._pages) { + throw new Error(`Internal error: _pages not found for ${map.inputPath}`); + } + + // IMPORTANT: this is where template content is rendered + try { + for (let pageEntry of map._pages) { + pageEntry.templateContent = + await pageEntry.template.renderPageEntryWithoutLayout(pageEntry); + } + } catch (e) { + if (EleventyErrorUtil.isPrematureTemplateContentError(e)) { + // Add to list of templates that need to be processed again + usedTemplateContentTooEarlyMap.push(map); + + // Reset cached render promise + for (let pageEntry of map._pages) { + pageEntry.template.resetCaches({ render: true }); + } + } else { + throw e; + } + } + }), + ); + } + + // Process templates that had premature template content errors + // This is the second pass for templates that couldn't be rendered in the first pass + for (let map of usedTemplateContentTooEarlyMap) { + try { + for (let pageEntry of map._pages) { + pageEntry.templateContent = + await pageEntry.template.renderPageEntryWithoutLayout(pageEntry); + } + } catch (e) { + if (EleventyErrorUtil.isPrematureTemplateContentError(e)) { + // If we still have template content errors after the second pass, + // it's likely a circular reference + throw new UsingCircularTemplateContentReferenceError( + `${map.inputPath} contains a circular reference (using collections) to its own templateContent.`, + ); + } else { + // rethrow? + throw e; + } + } + } + } + + getTaggedCollection(tag) { + let result; + if (!tag || tag === "all") { + result = this.collection.getAllSorted(); + } else { + result = this.collection.getFilteredByTag(tag); + } + + // May not return an array (can be anything) + // https://www.11ty.dev/docs/collections-api/#return-values + debug(`Collection: collections.${tag || "all"} size: ${result?.length}`); + + return result; + } + + /* 3.0.0-alpha.1: setUserConfigCollections method removed (was only used for testing) */ + isUserConfigCollectionName(name) { + let collections = this.userConfig.getCollections(); + return name && !!collections[name]; + } + + getUserConfigCollectionNames() { + return Object.keys(this.userConfig.getCollections()); + } + + async getUserConfigCollection(name) { + let configCollections = this.userConfig.getCollections(); + + // This works with async now + let result = await configCollections[name](this.collection); + + // May not return an array (can be anything) + // https://www.11ty.dev/docs/collections-api/#return-values + debug(`Collection: collections.${name} size: ${result?.length}`); + return result; + } + + populateCollectionsWithContent() { + for (let collectionName in this.collectionsData) { + // skip custom collections set in configuration files that have arbitrary types + if (!Array.isArray(this.collectionsData[collectionName])) { + continue; + } + + for (let item of this.collectionsData[collectionName]) { + // skip custom collections set in configuration files that have arbitrary types + if (!isPlainObject(item) || !("inputPath" in item)) { + continue; + } + + let entry = this.getMapEntryForInputPath(item.inputPath); + // This check skips precompiled collections + if (entry) { + let index = item.pageNumber || 0; + let content = entry._pages[index]._templateContent; + if (content !== undefined) { + item.templateContent = content; + } + } + } + } + } + + async resolveRemainingComputedData() { + let promises = []; + for (let entry of this.map) { + for (let pageEntry of entry._pages) { + if (this.config.keys.computed in pageEntry.data) { + promises.push(pageEntry.template.resolveRemainingComputedData(pageEntry.data)); + } + } + } + return Promise.all(promises); + } + + async generateLayoutsMap() { + let layouts = {}; + + for (let entry of this.map) { + for (let page of entry._pages) { + let tmpl = page.template; + if (tmpl.templateUsesLayouts(page.data)) { + let layoutKey = page.data[this.config.keys.layout]; + let layout = tmpl.getLayout(layoutKey); + let layoutChain = await layout.getLayoutChain(); + let priors = []; + for (let filepath of layoutChain) { + if (!layouts[filepath]) { + layouts[filepath] = new Set(); + } + layouts[filepath].add(page.inputPath); + for (let prior of priors) { + layouts[filepath].add(prior); + } + priors.push(filepath); + } + } + } + } + + for (let key in layouts) { + layouts[key] = Array.from(layouts[key]); + } + + return layouts; + } + + #onEachPage(callback) { + for (let template of this.map) { + for (let page of template._pages) { + callback(page, template); + } + } + } + + checkForDuplicatePermalinks() { + let inputs = {}; + let outputPaths = {}; + let warnings = {}; + this.#onEachPage((page, template) => { + if (page.outputPath === false || page.url === false) { + // do nothing (also serverless) + } else { + // Make sure output doesn’t overwrite input (e.g. --input=. --output=.) + // Related to https://github.com/11ty/eleventy/issues/3327 + if (page.outputPath === page.inputPath) { + throw new DuplicatePermalinkOutputError( + `The template at "${page.inputPath}" attempted to overwrite itself.`, + ); + } else if (inputs[page.outputPath]) { + throw new DuplicatePermalinkOutputError( + `The template at "${page.inputPath}" attempted to overwrite an existing template at "${page.outputPath}".`, + ); + } + inputs[page.inputPath] = true; + + if (!outputPaths[page.outputPath]) { + outputPaths[page.outputPath] = [template.inputPath]; + } else { + warnings[page.outputPath] = `Output conflict: multiple input files are writing to \`${ + page.outputPath + }\`. Use distinct \`permalink\` values to resolve this conflict. + 1. ${template.inputPath} +${outputPaths[page.outputPath] + .map(function (inputPath, index) { + return ` ${index + 2}. ${inputPath}\n`; + }) + .join("")} +`; + outputPaths[page.outputPath].push(template.inputPath); + } + } + }); + + let warningList = Object.values(warnings); + if (warningList.length) { + // throw one at a time + throw new DuplicatePermalinkOutputError(warningList[0]); + } + } + + checkForMissingFileExtensions() { + // disabled in config + if (this.userConfig?.errorReporting?.allowMissingExtensions === true) { + return; + } + + this.#onEachPage((page) => { + if ( + page.outputPath === false || + page.url === false || + page.data.eleventyAllowMissingExtension || + EXTENSIONLESS_URL_ALLOWLIST.some((url) => page.url.endsWith(url)) + ) { + // do nothing (also serverless) + } else { + if (TemplatePath.getExtension(page.outputPath) === "") { + let e = + new Error(`The template at '${page.inputPath}' attempted to write to '${page.outputPath}'${page.data.permalink ? ` (via \`permalink\` value: '${page.data.permalink}')` : ""}, which is a target on the file system that does not include a file extension. + +You *probably* want to add a file extension to your permalink so that hosts will know how to correctly serve this file to web browsers. Without a file extension, this file may not be reliably deployed without additional hosting configuration (it won’t have a mime type) and may also cause local development issues if you later attempt to write to a subdirectory of the same name. + +Learn more: https://v3.11ty.dev/docs/permalinks/#trailing-slashes + +This is usually but not *always* an error so if you’d like to disable this error message, add \`eleventyAllowMissingExtension: true\` somewhere in the data cascade for this template or use \`eleventyConfig.configureErrorReporting({ allowMissingExtensions: true });\` to disable this feature globally.`); + e.skipOriginalStack = true; + throw e; + } + } + }); + } + + // TODO move these into TemplateMapTest.js + _testGetAllTags() { + let allTags = {}; + for (let map of this.map) { + let tags = map.data.tags; + if (Array.isArray(tags)) { + for (let tag of tags) { + allTags[tag] = true; + } + } + } + return Object.keys(allTags); + } + + async _testGetUserConfigCollectionsData() { + let collections = {}; + let configCollections = this.userConfig.getCollections(); + + for (let name in configCollections) { + collections[name] = configCollections[name](this.collection); + + debug(`Collection: collections.${name} size: ${collections[name].length}`); + } + + return collections; + } + + async _testGetTaggedCollectionsData() { + let collections = {}; + collections.all = this.collection.getAllSorted(); + debug(`Collection: collections.all size: ${collections.all.length}`); + + let tags = this._testGetAllTags(); + for (let tag of tags) { + collections[tag] = this.collection.getFilteredByTag(tag); + debug(`Collection: collections.${tag} size: ${collections[tag].length}`); + } + return collections; + } + + async _testGetAllCollectionsData() { + let collections = {}; + let taggedCollections = await this._testGetTaggedCollectionsData(); + Object.assign(collections, taggedCollections); + + let userConfigCollections = await this._testGetUserConfigCollectionsData(); + Object.assign(collections, userConfigCollections); + + return collections; + } + + async _testGetCollectionsData() { + if (!this.cached) { + await this.cache(); + } + + return this.collectionsData; + } +} + +export default TemplateMap; diff --git a/node_modules/@11ty/eleventy/src/TemplatePassthrough.js b/node_modules/@11ty/eleventy/src/TemplatePassthrough.js new file mode 100644 index 0000000..b27b634 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplatePassthrough.js @@ -0,0 +1,389 @@ +import path from "node:path"; + +import { isDynamicPattern } from "tinyglobby"; +import { filesize } from "filesize"; +import copy from "@11ty/recursive-copy"; +import { TemplatePath } from "@11ty/eleventy-utils"; +import debugUtil from "debug"; + +import EleventyBaseError from "./Errors/EleventyBaseError.js"; +import checkPassthroughCopyBehavior from "./Util/PassthroughCopyBehaviorCheck.js"; +import ProjectDirectories from "./Util/ProjectDirectories.js"; + +const debug = debugUtil("Eleventy:TemplatePassthrough"); + +class TemplatePassthroughError extends EleventyBaseError {} + +class TemplatePassthrough { + isDryRun = false; + #isInputPathGlob; + #benchmarks; + #isAlreadyNormalized = false; + #projectDirCheck = false; + + // paths already guaranteed from the autocopy plugin + static factory(inputPath, outputPath, opts = {}) { + let p = new TemplatePassthrough( + { + inputPath, + outputPath, + copyOptions: opts.copyOptions, + }, + opts.templateConfig, + ); + + return p; + } + + constructor(path, templateConfig) { + if (!templateConfig || templateConfig.constructor.name !== "TemplateConfig") { + throw new Error( + "Internal error: Missing `templateConfig` or was not an instance of `TemplateConfig`.", + ); + } + this.templateConfig = templateConfig; + + this.rawPath = path; + + // inputPath is relative to the root of your project and not your Eleventy input directory. + // TODO normalize these with forward slashes + this.inputPath = this.normalizeIfDirectory(path.inputPath); + this.#isInputPathGlob = isDynamicPattern(this.inputPath); + + this.outputPath = path.outputPath; + this.copyOptions = path.copyOptions; // custom options for recursive-copy + } + + get benchmarks() { + if (!this.#benchmarks) { + this.#benchmarks = { + aggregate: this.config.benchmarkManager.get("Aggregate"), + }; + } + + return this.#benchmarks; + } + + get config() { + return this.templateConfig.getConfig(); + } + + get directories() { + return this.templateConfig.directories; + } + + // inputDir is used when stripping from output path in `getOutputPath` + get inputDir() { + return this.templateConfig.directories.input; + } + + get outputDir() { + return this.templateConfig.directories.output; + } + + // Skips `getFiles()` normalization + setIsAlreadyNormalized(isNormalized) { + this.#isAlreadyNormalized = Boolean(isNormalized); + } + + setCheckSourceDirectory(check) { + this.#projectDirCheck = Boolean(check); + } + + /* { inputPath, outputPath } though outputPath is *not* the full path: just the output directory */ + getPath() { + return this.rawPath; + } + + async getOutputPath(inputFileFromGlob) { + let { inputDir, outputDir, outputPath, inputPath } = this; + + if (outputPath === true) { + // no explicit target, implied target + if (this.isDirectory(inputPath)) { + let inputRelativePath = TemplatePath.stripLeadingSubPath( + inputFileFromGlob || inputPath, + inputDir, + ); + return ProjectDirectories.normalizeDirectory( + TemplatePath.join(outputDir, inputRelativePath), + ); + } + + return TemplatePath.normalize( + TemplatePath.join( + outputDir, + TemplatePath.stripLeadingSubPath(inputFileFromGlob || inputPath, inputDir), + ), + ); + } + + if (inputFileFromGlob) { + return this.getOutputPathForGlobFile(inputFileFromGlob); + } + + // Has explicit target + + // Bug when copying incremental file overwriting output directory (and making it a file) + // e.g. public/test.css -> _site + // https://github.com/11ty/eleventy/issues/2278 + let fullOutputPath = TemplatePath.normalize(TemplatePath.join(outputDir, outputPath)); + if (outputPath === "" || this.isDirectory(inputPath)) { + fullOutputPath = ProjectDirectories.normalizeDirectory(fullOutputPath); + } + + // TODO room for improvement here: + if ( + !this.#isInputPathGlob && + this.isExists(inputPath) && + !this.isDirectory(inputPath) && + this.isDirectory(fullOutputPath) + ) { + let filename = path.parse(inputPath).base; + return TemplatePath.normalize(TemplatePath.join(fullOutputPath, filename)); + } + + return fullOutputPath; + } + + async getOutputPathForGlobFile(inputFileFromGlob) { + return TemplatePath.join( + await this.getOutputPath(), + TemplatePath.getLastPathSegment(inputFileFromGlob), + ); + } + + setDryRun(isDryRun) { + this.isDryRun = Boolean(isDryRun); + } + + setRunMode(runMode) { + this.runMode = runMode; + } + + setFileSystemSearch(fileSystemSearch) { + this.fileSystemSearch = fileSystemSearch; + } + + async getFiles(glob) { + debug("Searching for: %o", glob); + let b = this.benchmarks.aggregate.get("Searching the file system (passthrough)"); + b.before(); + + if (!this.fileSystemSearch) { + throw new Error("Internal error: Missing `fileSystemSearch` property."); + } + + // TODO perf this globs once per addPassthroughCopy entry + let files = TemplatePath.addLeadingDotSlashArray( + await this.fileSystemSearch.search("passthrough", glob, { + ignore: [ + // *only* ignores output dir (not node_modules!) + this.outputDir, + ], + }), + ); + b.after(); + return files; + } + + isExists(filePath) { + return this.templateConfig.existsCache.exists(filePath); + } + + isDirectory(filePath) { + return this.templateConfig.existsCache.isDirectory(filePath); + } + + // dir is guaranteed to exist by context + // dir may not be a directory + normalizeIfDirectory(input) { + if (typeof input === "string") { + if (input.endsWith(path.sep) || input.endsWith("/")) { + return input; + } + + // When inputPath is a directory, make sure it has a slash for passthrough copy aliasing + // https://github.com/11ty/eleventy/issues/2709 + if (this.isDirectory(input)) { + return `${input}/`; + } + } + + return input; + } + + // maps input paths to output paths + async getFileMap() { + if (this.#isAlreadyNormalized) { + return [ + { + inputPath: this.inputPath, + outputPath: this.outputPath, + }, + ]; + } + + // TODO VirtualFileSystem candidate + if (!isDynamicPattern(this.inputPath) && this.isExists(this.inputPath)) { + return [ + { + inputPath: this.inputPath, + outputPath: await this.getOutputPath(), + }, + ]; + } + + let paths = []; + // If not directory or file, attempt to get globs + let files = await this.getFiles(this.inputPath); + for (let filePathFromGlob of files) { + paths.push({ + inputPath: filePathFromGlob, + outputPath: await this.getOutputPath(filePathFromGlob), + }); + } + + return paths; + } + + /* Types: + * 1. via glob, individual files found + * 2. directory, triggers an event for each file + * 3. individual file + */ + async copy(src, dest, copyOptions) { + if (this.#projectDirCheck && !this.directories.isFileInProjectFolder(src)) { + return Promise.reject( + new TemplatePassthroughError( + "Source file is not in the project directory. Check your passthrough paths.", + ), + ); + } + + if (!this.directories.isFileInOutputFolder(dest)) { + return Promise.reject( + new TemplatePassthroughError( + "Destination is not in the site output directory. Check your passthrough paths.", + ), + ); + } + + let fileCopyCount = 0; + let fileSizeCount = 0; + let map = {}; + let b = this.benchmarks.aggregate.get("Passthrough Copy File"); + + // returns a promise + return copy(src, dest, copyOptions) + .on(copy.events.COPY_FILE_START, (copyOp) => { + // Access to individual files at `copyOp.src` + map[copyOp.src] = copyOp.dest; + b.before(); + }) + .on(copy.events.COPY_FILE_COMPLETE, (copyOp) => { + fileCopyCount++; + fileSizeCount += copyOp.stats.size; + if (copyOp.stats.size > 5000000) { + debug(`Copied %o (⚠️ large) file from %o`, filesize(copyOp.stats.size), copyOp.src); + } else { + debug(`Copied %o file from %o`, filesize(copyOp.stats.size), copyOp.src); + } + b.after(); + }) + .then( + () => { + return { + count: fileCopyCount, + size: fileSizeCount, + map, + }; + }, + (error) => { + if (copyOptions.overwrite === false && error.code === "EEXIST") { + // just ignore if the output already exists and overwrite: false + debug("Overwrite error ignored: %O", error); + return { + count: 0, + size: 0, + map, + }; + } + + return Promise.reject(error); + }, + ); + } + + async write() { + if (this.isDryRun) { + return Promise.resolve({ + count: 0, + map: {}, + }); + } + + debug("Copying %o", this.inputPath); + let fileMap = await this.getFileMap(); + + // default options for recursive-copy + // see https://www.npmjs.com/package/recursive-copy#arguments + let copyOptionsDefault = { + overwrite: true, // overwrite output. fails when input is directory (mkdir) and output is file + dot: true, // copy dotfiles + junk: false, // copy cache files like Thumbs.db + results: false, + expand: false, // follow symlinks (matches recursive-copy default) + debug: false, // (matches recursive-copy default) + + // Note: `filter` callback function only passes in a relative path, which is unreliable + // See https://github.com/timkendrick/recursive-copy/blob/4c9a8b8a4bf573285e9c4a649a30a2b59ccf441c/lib/copy.js#L59 + // e.g. `{ filePaths: [ './img/coolkid.jpg' ], relativePaths: [ '' ] }` + }; + + let copyOptions = Object.assign(copyOptionsDefault, this.copyOptions); + + let promises = fileMap.map((entry) => { + // For-free passthrough copy + if (checkPassthroughCopyBehavior(this.config, this.runMode)) { + let aliasMap = {}; + aliasMap[entry.inputPath] = entry.outputPath; + + return Promise.resolve({ + count: 0, + map: aliasMap, + }); + } + + // Copy the files (only in build mode) + return this.copy(entry.inputPath, entry.outputPath, copyOptions); + }); + + // IMPORTANT: this returns an array of promises, does not await for promise to finish + return Promise.all(promises).then( + (results) => { + // collate the count and input/output map results from the array. + let count = 0; + let size = 0; + let map = {}; + + for (let result of results) { + count += result.count; + size += result.size; + Object.assign(map, result.map); + } + + return { + count, + size, + map, + }; + }, + (err) => { + throw new TemplatePassthroughError(`Error copying passthrough files: ${err.message}`, err); + }, + ); + } +} + +export default TemplatePassthrough; diff --git a/node_modules/@11ty/eleventy/src/TemplatePassthroughManager.js b/node_modules/@11ty/eleventy/src/TemplatePassthroughManager.js new file mode 100644 index 0000000..114dfa9 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplatePassthroughManager.js @@ -0,0 +1,368 @@ +import { isDynamicPattern } from "tinyglobby"; +import { TemplatePath } from "@11ty/eleventy-utils"; +import debugUtil from "debug"; + +import EleventyBaseError from "./Errors/EleventyBaseError.js"; +import TemplatePassthrough from "./TemplatePassthrough.js"; +import checkPassthroughCopyBehavior from "./Util/PassthroughCopyBehaviorCheck.js"; +import { isGlobMatch } from "./Util/GlobMatcher.js"; +import { withResolvers } from "./Util/PromiseUtil.js"; + +const debug = debugUtil("Eleventy:TemplatePassthroughManager"); + +class TemplatePassthroughManagerCopyError extends EleventyBaseError {} + +class TemplatePassthroughManager { + #isDryRun = false; + #afterBuild; + #queue = new Map(); + #extensionMap; + + constructor(templateConfig) { + if (!templateConfig || templateConfig.constructor.name !== "TemplateConfig") { + throw new Error("Internal error: Missing or invalid `templateConfig` argument."); + } + + this.templateConfig = templateConfig; + this.config = templateConfig.getConfig(); + + // eleventy# event listeners are removed on each build + this.config.events.on("eleventy#copy", ({ source, target, options }) => { + this.enqueueCopy(source, target, options); + }); + + this.config.events.on("eleventy#beforerender", () => { + this.#afterBuild = withResolvers(); + }); + + this.config.events.on("eleventy#render", () => { + let { resolve } = this.#afterBuild; + resolve(); + }); + + this.reset(); + } + + reset() { + this.count = 0; + this.size = 0; + this.conflictMap = {}; + this.incrementalFile; + + this.#queue = new Map(); + } + + set extensionMap(extensionMap) { + this.#extensionMap = extensionMap; + } + + get extensionMap() { + if (!this.#extensionMap) { + throw new Error("Internal error: missing `extensionMap` in TemplatePassthroughManager."); + } + return this.#extensionMap; + } + + get inputDir() { + return this.templateConfig.directories.input; + } + + get outputDir() { + return this.templateConfig.directories.output; + } + + setDryRun(isDryRun) { + this.#isDryRun = Boolean(isDryRun); + } + + setRunMode(runMode) { + this.runMode = runMode; + } + + setIncrementalFile(path) { + if (path) { + this.incrementalFile = path; + } + } + + resetIncrementalFile() { + this.incrementalFile = undefined; + } + + _normalizePaths(path, outputPath, copyOptions = {}) { + return { + inputPath: TemplatePath.addLeadingDotSlash(path), + outputPath: outputPath ? TemplatePath.stripLeadingDotSlash(outputPath) : true, + copyOptions, + }; + } + + getConfigPaths() { + let paths = []; + let pathsRaw = this.config.passthroughCopies || {}; + debug("`addPassthroughCopy` config API paths: %o", pathsRaw); + for (let [inputPath, { outputPath, copyOptions }] of Object.entries(pathsRaw)) { + paths.push(this._normalizePaths(inputPath, outputPath, copyOptions)); + } + debug("`addPassthroughCopy` config API normalized paths: %o", paths); + return paths; + } + + getConfigPathGlobs() { + return this.getConfigPaths().map((path) => { + return TemplatePath.convertToRecursiveGlobSync(path.inputPath); + }); + } + + getNonTemplatePaths(paths) { + let matches = []; + for (let path of paths) { + if (!this.extensionMap.hasEngine(path)) { + matches.push(path); + } + } + + return matches; + } + + getCopyCount() { + return this.count; + } + + getCopySize() { + return this.size; + } + + getMetadata() { + return { + copyCount: this.getCopyCount(), + copySize: this.getCopySize(), + }; + } + + setFileSystemSearch(fileSystemSearch) { + this.fileSystemSearch = fileSystemSearch; + } + + getTemplatePassthroughForPath(path) { + let inst = new TemplatePassthrough(path, this.templateConfig); + + inst.setFileSystemSearch(this.fileSystemSearch); + inst.setDryRun(this.#isDryRun); + inst.setRunMode(this.runMode); + + return inst; + } + + async copyPassthrough(pass) { + if (!(pass instanceof TemplatePassthrough)) { + throw new TemplatePassthroughManagerCopyError( + "copyPassthrough expects an instance of TemplatePassthrough", + ); + } + + let { inputPath } = pass.getPath(); + + // TODO https://github.com/11ty/eleventy/issues/2452 + // De-dupe both the input and output paired together to avoid the case + // where an input/output pair has been added via multiple passthrough methods (glob, file suffix, etc) + // Probably start with the `filter` callback in recursive-copy but it only passes relative paths + // See the note in TemplatePassthrough.js->write() + + // Also note that `recursive-copy` handles repeated overwrite copy to the same destination just fine. + // e.g. `for(let j=0, k=1000; j { + for (let src in map) { + let dest = map[src]; + if (this.conflictMap[dest]) { + if (src !== this.conflictMap[dest]) { + let paths = [src, this.conflictMap[dest]].sort(); + throw new TemplatePassthroughManagerCopyError( + `Multiple passthrough copy files are trying to write to the same output file (${TemplatePath.standardizeFilePath(dest)}). ${paths.map((p) => TemplatePath.standardizeFilePath(p)).join(" and ")}`, + ); + } else { + // Multiple entries from the same source + debug( + "A passthrough copy entry (%o) caused the same file (%o) to be copied more than once to the output (%o). This is atomically safe but a waste of build resources.", + inputPath, + src, + dest, + ); + } + } + + this.conflictMap[dest] = src; + } + + if (pass.isDryRun) { + // We don’t count the skipped files as we need to iterate over them + debug( + "Skipped %o (either from --dryrun or --incremental or for-free passthrough copy)", + inputPath, + ); + } else { + if (count) { + this.count += count; + this.size += size; + debug("Copied %o (%d files, %d size)", inputPath, count || 0, size || 0); + } else { + debug("Skipped copying %o (emulated passthrough copy)", inputPath); + } + } + + return { + count, + map, + }; + }, + function (e) { + return Promise.reject( + new TemplatePassthroughManagerCopyError(`Having trouble copying '${inputPath}'`, e), + ); + }, + ); + } + + isPassthroughCopyFile(paths, changedFile) { + if (!changedFile) { + return false; + } + + // passthrough copy by non-matching engine extension (via templateFormats) + for (let path of paths) { + if (path === changedFile && !this.extensionMap.hasEngine(path)) { + return true; + } + } + + for (let path of this.getConfigPaths()) { + if (TemplatePath.startsWithSubPath(changedFile, path.inputPath)) { + return path; + } + if ( + changedFile && + isDynamicPattern(path.inputPath) && + isGlobMatch(changedFile, [path.inputPath]) + ) { + return path; + } + } + + return false; + } + + getAllNormalizedPaths(paths = []) { + if (this.incrementalFile) { + let isPassthrough = this.isPassthroughCopyFile(paths, this.incrementalFile); + + if (isPassthrough) { + if (isPassthrough.outputPath) { + return [isPassthrough]; + } + + return [this._normalizePaths(this.incrementalFile)]; + } + + // Fixes https://github.com/11ty/eleventy/issues/2491 + if (!checkPassthroughCopyBehavior(this.config, this.runMode)) { + return []; + } + } + + let normalizedPaths = this.getConfigPaths(); + if (debug.enabled) { + for (let path of normalizedPaths) { + debug("TemplatePassthrough copying from config: %o", path); + } + } + + if (paths?.length) { + let passthroughPaths = this.getNonTemplatePaths(paths); + for (let path of passthroughPaths) { + let normalizedPath = this._normalizePaths(path); + + debug( + `TemplatePassthrough copying from non-matching file extension: ${normalizedPath.inputPath}`, + ); + + normalizedPaths.push(normalizedPath); + } + } + + return normalizedPaths; + } + + // keys: output + // values: input + getAliasesFromPassthroughResults(result) { + let entries = {}; + for (let entry of result) { + for (let src in entry.map) { + let dest = TemplatePath.stripLeadingSubPath(entry.map[src], this.outputDir); + entries["/" + encodeURI(dest)] = src; + } + } + return entries; + } + + async #waitForTemplatesRendered() { + if (!this.#afterBuild) { + return Promise.resolve(); // immediately resolve + } + + let { promise } = this.#afterBuild; + return promise; + } + + enqueueCopy(source, target, copyOptions) { + let key = `${source}=>${target}`; + + // light de-dupe the same source/target combo (might be in the same file, might be viaTransforms) + if (this.#queue.has(key)) { + return; + } + + let passthrough = TemplatePassthrough.factory(source, target, { + templateConfig: this.templateConfig, + copyOptions, + }); + + passthrough.setCheckSourceDirectory(true); + passthrough.setIsAlreadyNormalized(true); + passthrough.setRunMode(this.runMode); + passthrough.setDryRun(this.#isDryRun); + + this.#queue.set(key, this.copyPassthrough(passthrough)); + } + + async copyAll(templateExtensionPaths) { + debug("TemplatePassthrough copy started."); + let normalizedPaths = this.getAllNormalizedPaths(templateExtensionPaths); + + let passthroughs = normalizedPaths.map((path) => this.getTemplatePassthroughForPath(path)); + + let promises = passthroughs.map((pass) => this.copyPassthrough(pass)); + + await this.#waitForTemplatesRendered(); + + for (let [key, afterBuildCopyPromises] of this.#queue) { + promises.push(afterBuildCopyPromises); + } + + return Promise.all(promises).then(async (results) => { + let aliases = this.getAliasesFromPassthroughResults(results); + await this.config.events.emit("eleventy.passthrough", { + map: aliases, + }); + + debug(`TemplatePassthrough copy finished. Current count: ${this.count} (size: ${this.size})`); + return results; + }); + } +} + +export default TemplatePassthroughManager; diff --git a/node_modules/@11ty/eleventy/src/TemplatePermalink.js b/node_modules/@11ty/eleventy/src/TemplatePermalink.js new file mode 100644 index 0000000..9ad5111 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplatePermalink.js @@ -0,0 +1,195 @@ +import path from "node:path"; +import { TemplatePath, isPlainObject } from "@11ty/eleventy-utils"; + +class TemplatePermalink { + // `link` with template syntax should have already been rendered in Template.js + constructor(link, extraSubdir) { + let isLinkAnObject = isPlainObject(link); + + this._isRendered = true; + this._writeToFileSystem = true; + + let buildLink; + + if (isLinkAnObject) { + if ("build" in link) { + buildLink = link.build; + } + + // find the first string key + for (let key in link) { + if (typeof key !== "string") { + continue; + } + break; + } + } else { + buildLink = link; + } + + // permalink: false and permalink: build: false + if (typeof buildLink === "boolean") { + if (buildLink === false) { + this._writeToFileSystem = false; + } else { + throw new Error( + `\`permalink: ${ + isLinkAnObject ? "build: " : "" + }true\` is not a supported feature in Eleventy. Did you mean \`permalink: ${ + isLinkAnObject ? "build: " : "" + }false\`?`, + ); + } + } else if (buildLink) { + if (typeof buildLink !== "string") { + let stringToString = "toString" in buildLink ? `:\n\n${buildLink.toString()}` : ""; + throw new Error( + "Expected permalink value to be a string. Received `" + + typeof buildLink + + "`" + + stringToString, + ); + } + this.buildLink = buildLink; + } + + if (isLinkAnObject) { + // default if permalink is an Object but does not have a `build` prop + if (!("build" in link)) { + this._writeToFileSystem = false; + this._isRendered = false; + } + } + + this.extraPaginationSubdir = extraSubdir || ""; + } + + setUrlTransforms(transforms) { + this._urlTransforms = transforms; + } + + get urlTransforms() { + return this._urlTransforms || []; + } + + _addDefaultLinkFilename(link) { + return link + (link.slice(-1) === "/" ? "index.html" : ""); + } + + toOutputPath() { + if (!this.buildLink) { + // empty or false + return false; + } + let cleanLink = this._addDefaultLinkFilename(this.buildLink); + let parsed = path.parse(cleanLink); + + return TemplatePath.join(parsed.dir, this.extraPaginationSubdir, parsed.base); + } + + // Used in url transforms feature + static getUrlStem(original) { + let subject = original; + if (original.endsWith(".html")) { + subject = original.slice(0, -1 * ".html".length); + } + return TemplatePermalink.normalizePathToUrl(subject); + } + + static normalizePathToUrl(original) { + let compare = original || ""; + + let needleHtml = "/index.html"; + let needleBareTrailingSlash = "/index/"; + let needleBare = "/index"; + if (compare.endsWith(needleHtml)) { + return compare.slice(0, compare.length - needleHtml.length) + "/"; + } else if (compare.endsWith(needleBareTrailingSlash)) { + return compare.slice(0, compare.length - needleBareTrailingSlash.length) + "/"; + } else if (compare.endsWith(needleBare)) { + return compare.slice(0, compare.length - needleBare.length) + "/"; + } + + return original; + } + + // This method is used to generate the `page.url` variable. + + // remove all index.html’s from links + // index.html becomes / + // test/index.html becomes test/ + toHref() { + if (!this.buildLink) { + // empty or false + return false; + } + + let transformedLink = this.toOutputPath(); + let original = (transformedLink.charAt(0) !== "/" ? "/" : "") + transformedLink; + + let normalized = TemplatePermalink.normalizePathToUrl(original) || ""; + for (let transform of this.urlTransforms) { + original = + transform({ + url: normalized, + urlStem: TemplatePermalink.getUrlStem(original), + }) ?? original; + } + + return TemplatePermalink.normalizePathToUrl(original); + } + + toPath(outputDir) { + if (!this.buildLink) { + return false; + } + + let uri = this.toOutputPath(); + + if (uri === false) { + return false; + } + + return TemplatePath.addLeadingDotSlash(TemplatePath.normalize(outputDir + "/" + uri)); + } + + toPathFromRoot() { + if (!this.buildLink) { + return false; + } + + let uri = this.toOutputPath(); + + if (uri === false) { + return false; + } + + return TemplatePath.addLeadingDotSlash(TemplatePath.normalize(uri)); + } + + static _hasDuplicateFolder(dir, base) { + let folders = dir.split("/"); + if (!folders[folders.length - 1]) { + folders.pop(); + } + return folders[folders.length - 1] === base; + } + + static generate(dir, filenameNoExt, extraSubdir, fileExtension = "html") { + let path; + if (fileExtension === "html") { + let hasDupeFolder = TemplatePermalink._hasDuplicateFolder(dir, filenameNoExt); + + path = + (dir ? dir + "/" : "") + + (filenameNoExt !== "index" && !hasDupeFolder ? filenameNoExt + "/" : "") + + "index.html"; + } else { + path = (dir ? dir + "/" : "") + filenameNoExt + "." + fileExtension; + } + + return new TemplatePermalink(path, extraSubdir); + } +} + +export default TemplatePermalink; diff --git a/node_modules/@11ty/eleventy/src/TemplateRender.js b/node_modules/@11ty/eleventy/src/TemplateRender.js new file mode 100644 index 0000000..776f16e --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplateRender.js @@ -0,0 +1,292 @@ +import EleventyBaseError from "./Errors/EleventyBaseError.js"; +import TemplateEngineManager from "./Engines/TemplateEngineManager.js"; + +// import debugUtil from "debug"; +// const debug = debugUtil("Eleventy:TemplateRender"); + +class TemplateRenderUnknownEngineError extends EleventyBaseError {} + +// works with full path names or short engine name +class TemplateRender { + #extensionMap; + #config; + + constructor(tmplPath, config) { + if (!tmplPath) { + throw new Error(`TemplateRender requires a tmplPath argument, instead of ${tmplPath}`); + } + this.#setConfig(config); + + this.engineNameOrPath = tmplPath; + this.parseMarkdownWith = this.config.markdownTemplateEngine; + this.parseHtmlWith = this.config.htmlTemplateEngine; + } + + #setConfig(config) { + if (config?.constructor?.name !== "TemplateConfig") { + throw new Error("TemplateRender must receive a TemplateConfig instance."); + } + + this.eleventyConfig = config; + this.config = config.getConfig(); + } + + get dirs() { + return this.eleventyConfig.directories; + } + + get inputDir() { + return this.dirs.input; + } + + get includesDir() { + return this.dirs.includes; + } + + /* Backwards compat */ + getIncludesDir() { + return this.includesDir; + } + + get config() { + return this.#config; + } + + set config(config) { + this.#config = config; + } + + set extensionMap(extensionMap) { + this.#extensionMap = extensionMap; + } + + get extensionMap() { + if (!this.#extensionMap) { + throw new Error("Internal error: missing `extensionMap` in TemplateRender."); + } + return this.#extensionMap; + } + + async getEngineByName(name) { + // WARNING: eleventyConfig assignment removed here + return this.extensionMap.engineManager.getEngine(name, this.extensionMap); + } + + // Runs once per template + async init(engineNameOrPath) { + let name = engineNameOrPath || this.engineNameOrPath; + this.extensionMap.setTemplateConfig(this.eleventyConfig); + + let extensionEntry = this.extensionMap.getExtensionEntry(name); + let engineName = extensionEntry?.aliasKey || extensionEntry?.key; + if (TemplateEngineManager.isSimpleAlias(extensionEntry)) { + engineName = extensionEntry?.key; + } + this._engineName = engineName; + + if (!extensionEntry || !this._engineName) { + throw new TemplateRenderUnknownEngineError( + `Unknown engine for ${name} (supported extensions: ${this.extensionMap.getReadableFileExtensions()})`, + ); + } + + this._engine = await this.getEngineByName(this._engineName); + + if (this.useMarkdown === undefined) { + this.setUseMarkdown(this._engineName === "md"); + } + } + + get engineName() { + if (!this._engineName) { + throw new Error("TemplateRender needs a call to the init() method."); + } + return this._engineName; + } + + get engine() { + if (!this._engine) { + throw new Error("TemplateRender needs a call to the init() method."); + } + return this._engine; + } + + static parseEngineOverrides(engineName) { + if (typeof (engineName || "") !== "string") { + throw new Error("Expected String passed to parseEngineOverrides. Received: " + engineName); + } + + let overlappingEngineWarningCount = 0; + let engines = []; + let uniqueLookup = {}; + let usingMarkdown = false; + (engineName || "") + .split(",") + .map((name) => { + return name.toLowerCase().trim(); + }) + .forEach((name) => { + // html is assumed (treated as plaintext by the system) + if (!name || name === "html") { + return; + } + + if (name === "md") { + usingMarkdown = true; + return; + } + + if (!uniqueLookup[name]) { + engines.push(name); + uniqueLookup[name] = true; + + // we already short circuit md and html types above + overlappingEngineWarningCount++; + } + }); + + if (overlappingEngineWarningCount > 1) { + throw new Error( + `Don’t mix multiple templating engines in your front matter overrides (exceptions for HTML and Markdown). You used: ${engineName}`, + ); + } + + // markdown should always be first + if (usingMarkdown) { + engines.unshift("md"); + } + + return engines; + } + + // used for error logging and console output. + getReadableEnginesList() { + return this.getReadableEnginesListDifferingFromFileExtension() || this.engineName; + } + + getReadableEnginesListDifferingFromFileExtension() { + let keyFromFilename = this.extensionMap.getKey(this.engineNameOrPath); + if (this.engine?.constructor?.name === "CustomEngine") { + if ( + this.engine.entry && + this.engine.entry.name && + keyFromFilename !== this.engine.entry.name + ) { + return this.engine.entry.name; + } else { + // We don’t have a name for it so we return nothing so we don’t misreport (per #2386) + return; + } + } + + if (this.engineName === "md" && this.useMarkdown && this.parseMarkdownWith) { + return this.parseMarkdownWith; + } + if (this.engineName === "html" && this.parseHtmlWith) { + return this.parseHtmlWith; + } + + // templateEngineOverride in play and template language differs from file extension + if (keyFromFilename !== this.engineName) { + return this.engineName; + } + } + + // TODO templateEngineOverride + getPreprocessorEngineName() { + if (this.engineName === "md" && this.parseMarkdownWith) { + return this.parseMarkdownWith; + } + if (this.engineName === "html" && this.parseHtmlWith) { + return this.parseHtmlWith; + } + // TODO do we need this? + return this.extensionMap.getKey(this.engineNameOrPath); + } + + // We pass in templateEngineOverride here because it isn’t yet applied to templateRender + getEnginesList(engineOverride) { + if (engineOverride) { + let engines = TemplateRender.parseEngineOverrides(engineOverride).reverse(); + return engines.join(","); + } + + if (this.engineName === "md" && this.useMarkdown && this.parseMarkdownWith) { + return `${this.parseMarkdownWith},md`; + } + if (this.engineName === "html" && this.parseHtmlWith) { + return this.parseHtmlWith; + } + + // templateEngineOverride in play + return this.extensionMap.getKey(this.engineNameOrPath); + } + + async setEngineOverride(engineName, bypassMarkdown) { + let engines = TemplateRender.parseEngineOverrides(engineName); + + // when overriding, Template Engines with HTML will instead use the Template Engine as primary and output HTML + // So any HTML engine usage here will never use a preprocessor templating engine. + this.setHtmlEngine(false); + + if (!engines.length) { + await this.init("html"); + return; + } + + await this.init(engines[0]); + + let usingMarkdown = engines[0] === "md" && !bypassMarkdown; + + this.setUseMarkdown(usingMarkdown); + + if (usingMarkdown) { + // false means only parse markdown and not with a preprocessor template engine + this.setMarkdownEngine(engines.length > 1 ? engines[1] : false); + } + } + + getEngineName() { + return this.engineName; + } + + isEngine(engine) { + return this.engineName === engine; + } + + setUseMarkdown(useMarkdown) { + this.useMarkdown = !!useMarkdown; + } + + // this is only called for templateEngineOverride + setMarkdownEngine(markdownEngine) { + this.parseMarkdownWith = markdownEngine; + } + + // this is only called for templateEngineOverride + setHtmlEngine(htmlEngineName) { + this.parseHtmlWith = htmlEngineName; + } + + async _testRender(str, data) { + return this.engine._testRender(str, data); + } + + async getCompiledTemplate(str) { + // TODO refactor better, move into TemplateEngine logic + if (this.engineName === "md") { + return this.engine.compile( + str, + this.engineNameOrPath, + this.parseMarkdownWith, + !this.useMarkdown, + ); + } else if (this.engineName === "html") { + return this.engine.compile(str, this.engineNameOrPath, this.parseHtmlWith); + } else { + return this.engine.compile(str, this.engineNameOrPath); + } + } +} + +export default TemplateRender; diff --git a/node_modules/@11ty/eleventy/src/TemplateWriter.js b/node_modules/@11ty/eleventy/src/TemplateWriter.js new file mode 100755 index 0000000..79b0fee --- /dev/null +++ b/node_modules/@11ty/eleventy/src/TemplateWriter.js @@ -0,0 +1,508 @@ +import { TemplatePath } from "@11ty/eleventy-utils"; +import debugUtil from "debug"; + +import Template from "./Template.js"; +import TemplateMap from "./TemplateMap.js"; +import EleventyFiles from "./EleventyFiles.js"; +import EleventyBaseError from "./Errors/EleventyBaseError.js"; +import { EleventyErrorHandler } from "./Errors/EleventyErrorHandler.js"; +import EleventyErrorUtil from "./Errors/EleventyErrorUtil.js"; +import FileSystemSearch from "./FileSystemSearch.js"; +import ConsoleLogger from "./Util/ConsoleLogger.js"; + +const debug = debugUtil("Eleventy:TemplateWriter"); + +class TemplateWriterMissingConfigArgError extends EleventyBaseError {} +class EleventyPassthroughCopyError extends EleventyBaseError {} +class EleventyTemplateError extends EleventyBaseError {} + +class TemplateWriter { + #eleventyFiles; + #passthroughManager; + #errorHandler; + #extensionMap; + + constructor( + templateFormats, // TODO remove this, see `get eleventyFiles` first + templateData, + templateConfig, + ) { + if (!templateConfig) { + throw new TemplateWriterMissingConfigArgError("Missing config argument."); + } + this.templateConfig = templateConfig; + this.config = templateConfig.getConfig(); + this.userConfig = templateConfig.userConfig; + + this.templateFormats = templateFormats; + + this.templateData = templateData; + this.isVerbose = true; + this.isDryRun = false; + this.writeCount = 0; + this.renderCount = 0; + this.skippedCount = 0; + this.isRunInitialBuild = true; + + this._templatePathCache = new Map(); + } + + get dirs() { + return this.templateConfig.directories; + } + + get inputDir() { + return this.dirs.input; + } + + get outputDir() { + return this.dirs.output; + } + + get templateFormats() { + return this._templateFormats; + } + + set templateFormats(value) { + this._templateFormats = value; + } + + /* Getter for error handler */ + get errorHandler() { + if (!this.#errorHandler) { + this.#errorHandler = new EleventyErrorHandler(); + this.#errorHandler.isVerbose = this.verboseMode; + this.#errorHandler.logger = this.logger; + } + + return this.#errorHandler; + } + + /* Getter for Logger */ + get logger() { + if (!this._logger) { + this._logger = new ConsoleLogger(); + this._logger.isVerbose = this.verboseMode; + } + + return this._logger; + } + + /* Setter for Logger */ + set logger(logger) { + this._logger = logger; + } + + /* For testing */ + overrideConfig(config) { + this.config = config; + } + + restart() { + this.writeCount = 0; + this.renderCount = 0; + this.skippedCount = 0; + } + + set extensionMap(extensionMap) { + this.#extensionMap = extensionMap; + } + + get extensionMap() { + if (!this.#extensionMap) { + throw new Error("Internal error: missing `extensionMap` in TemplateWriter."); + } + return this.#extensionMap; + } + + setPassthroughManager(mgr) { + this.#passthroughManager = mgr; + } + + setEleventyFiles(eleventyFiles) { + this.#eleventyFiles = eleventyFiles; + } + + get eleventyFiles() { + // usually Eleventy.js will setEleventyFiles with the EleventyFiles manager + if (!this.#eleventyFiles) { + // if not, we can create one (used only by tests) + this.#eleventyFiles = new EleventyFiles(this.templateFormats, this.templateConfig); + + this.#eleventyFiles.setFileSystemSearch(new FileSystemSearch()); + this.#eleventyFiles.init(); + } + + return this.#eleventyFiles; + } + + async _getAllPaths() { + // this is now cached upstream by FileSystemSearch + return this.eleventyFiles.getFiles(); + } + + _createTemplate(path, to = "fs") { + let tmpl = this._templatePathCache.get(path); + let wasCached = false; + + if (tmpl) { + wasCached = true; + // Update config for https://github.com/11ty/eleventy/issues/3468 + // TODO reset other constructor things here like inputDir/outputDir + tmpl.resetCachedTemplate({ + templateData: this.templateData, + extensionMap: this.extensionMap, + eleventyConfig: this.templateConfig, + }); + } else { + tmpl = new Template(path, this.templateData, this.extensionMap, this.templateConfig); + tmpl.setOutputFormat(to); + tmpl.logger = this.logger; + this._templatePathCache.set(path, tmpl); + } + + tmpl.setTransforms(this.config.transforms); + tmpl.setLinters(this.config.linters); + tmpl.setDryRun(this.isDryRun); + tmpl.setIsVerbose(this.isVerbose); + tmpl.reset(); + + return { + template: tmpl, + wasCached, + }; + } + + // incrementalFileShape is `template` or `copy` (for passthrough file copy) + async _addToTemplateMapIncrementalBuild(incrementalFileShape, paths, to = "fs") { + // Render overrides are only used when `--ignore-initial` is in play and an initial build is not run + let ignoreInitialBuild = !this.isRunInitialBuild; + let secondOrderRelevantLookup = {}; + let templates = []; + + let promises = []; + for (let path of paths) { + let { template: tmpl } = this._createTemplate(path, to); + + // Note: removed a fix here to fetch missing templateRender instances + // that was tested as no longer needed (Issue #3170) + // Related: #3870, improved configuration reset + + templates.push(tmpl); + + // This must happen before data is generated for the incremental file only + if (incrementalFileShape === "template" && tmpl.inputPath === this.incrementalFile) { + tmpl.resetCaches(); + } else if ( + // Issue #3824 #3870 + tmpl.isFileRelevantToThisTemplate(this.incrementalFile, { + isFullTemplate: incrementalFileShape === "template", + }) + ) { + tmpl.resetCaches(); + } + + // IMPORTANT: This is where the data is first generated for the template + promises.push(this.templateMap.add(tmpl)); + } + + // Important to set up template dependency relationships first + await Promise.all(promises); + + // Delete incremental file from the dependency graph so we get fresh entries! + // This _must_ happen before any additions, the other ones are in Custom.js and GlobalDependencyMap.js (from the eleventy.layouts Event) + this.config.uses.resetNode(this.incrementalFile); + + // write new template relationships to the global dependency graph for next time + this.templateMap.addAllToGlobalDependencyGraph(); + + // Always disable render for --ignore-initial + if (ignoreInitialBuild) { + for (let tmpl of templates) { + tmpl.setRenderableOverride(false); // disable render + } + return; + } + + for (let tmpl of templates) { + if (incrementalFileShape === "template" && tmpl.inputPath === this.incrementalFile) { + tmpl.setRenderableOverride(undefined); // unset, probably render + } else if ( + tmpl.isFileRelevantToThisTemplate(this.incrementalFile, { + isFullTemplate: incrementalFileShape === "template", + }) + ) { + // changed file is used by template + // template uses the changed file + tmpl.setRenderableOverride(undefined); // unset, probably render + secondOrderRelevantLookup[tmpl.inputPath] = true; + } else if (this.config.uses.isFileUsedBy(this.incrementalFile, tmpl.inputPath)) { + // changed file uses this template + tmpl.setRenderableOverride("optional"); + } else { + // For incremental, always disable render on irrelevant templates + tmpl.setRenderableOverride(false); // disable render + } + } + + let secondOrderRelevantArray = this.config.uses + .getTemplatesRelevantToTemplateList(Object.keys(secondOrderRelevantLookup)) + .map((entry) => TemplatePath.addLeadingDotSlash(entry)); + let secondOrderTemplates = Object.fromEntries( + Object.entries(secondOrderRelevantArray).map(([index, value]) => [value, true]), + ); + + for (let tmpl of templates) { + // second order templates must also be rendered if not yet already rendered at least once and available in cache. + if (secondOrderTemplates[tmpl.inputPath]) { + if (tmpl.isRenderableDisabled()) { + tmpl.setRenderableOverride("optional"); + } + } + } + + // Order of templates does not matter here, they’re reordered later based on dependencies in TemplateMap.js + for (let tmpl of templates) { + if (incrementalFileShape === "template" && tmpl.inputPath === this.incrementalFile) { + // Cache is reset above (to invalidate data cache at the right time) + tmpl.setDryRunViaIncremental(false); + } else if (!tmpl.isRenderableDisabled() && !tmpl.isRenderableOptional()) { + // Related to the template but not the template (reset the render cache, not the read cache) + tmpl.resetCaches({ + data: true, + render: true, + }); + + tmpl.setDryRunViaIncremental(false); + } else { + // During incremental we only reset the data cache for non-matching templates, see https://github.com/11ty/eleventy/issues/2710 + // Keep caches for read/render + tmpl.resetCaches({ + data: true, + }); + + tmpl.setDryRunViaIncremental(true); + + this.skippedCount++; + } + } + } + + async _addToTemplateMapFullBuild(paths, to = "fs") { + if (this.incrementalFile) { + return []; + } + + let ignoreInitialBuild = !this.isRunInitialBuild; + let promises = []; + for (let path of paths) { + let { template: tmpl, wasCached } = this._createTemplate(path, to); + // Render overrides are only used when `--ignore-initial` is in play and an initial build is not run + if (ignoreInitialBuild) { + tmpl.setRenderableOverride(false); // disable render + } else { + tmpl.setRenderableOverride(undefined); // unset, render + } + + if (wasCached) { + tmpl.resetCaches(); + } + + // IMPORTANT: This is where the data is first generated for the template + promises.push(this.templateMap.add(tmpl)); + } + + return Promise.all(promises); + } + + async _addToTemplateMap(paths, to = "fs") { + let incrementalFileShape = this.eleventyFiles.getFileShape(paths, this.incrementalFile); + + // Filter out passthrough copy files + paths = paths.filter((path) => { + if (!this.extensionMap.hasEngine(path)) { + return false; + } + if (incrementalFileShape === "copy") { + this.skippedCount++; + // Filters out templates if the incremental file is a passthrough copy file + return false; + } + return true; + }); + + if (this.incrementalFile) { + // Top level async to get at the promises returned. + return await this._addToTemplateMapIncrementalBuild(incrementalFileShape, paths, to); + } + + // Full Build + let ret = await this._addToTemplateMapFullBuild(paths, to); + + // write new template relationships to the global dependency graph for next time + this.templateMap.addAllToGlobalDependencyGraph(); + + return ret; + } + + async _createTemplateMap(paths, to) { + this.templateMap = new TemplateMap(this.templateConfig); + + await this._addToTemplateMap(paths, to); + await this.templateMap.cache(); + + // Return is used by tests + return this.templateMap; + } + + async _generateTemplate(mapEntry, to) { + let tmpl = mapEntry.template; + + return tmpl.generateMapEntry(mapEntry, to).then((pages) => { + this.renderCount += tmpl.getRenderCount(); + this.writeCount += tmpl.getWriteCount(); + return pages; + }); + } + + async writePassthroughCopy(templateExtensionPaths) { + if (!this.#passthroughManager) { + throw new Error("Internal error: Missing `passthroughManager` instance."); + } + + return this.#passthroughManager.copyAll(templateExtensionPaths).catch((e) => { + this.errorHandler.warn(e, "Error with passthrough copy"); + return Promise.reject(new EleventyPassthroughCopyError("Having trouble copying", e)); + }); + } + + async generateTemplates(paths, to = "fs") { + let promises = []; + // TODO optimize await here + await this._createTemplateMap(paths, to); + debug("Template map created."); + + let usedTemplateContentTooEarlyMap = []; + for (let mapEntry of this.templateMap.getMap()) { + promises.push( + this._generateTemplate(mapEntry, to).catch(function (e) { + // Premature templateContent in layout render, this also happens in + // TemplateMap.populateContentDataInMap for non-layout content + if (EleventyErrorUtil.isPrematureTemplateContentError(e)) { + usedTemplateContentTooEarlyMap.push(mapEntry); + } else { + let outputPaths = `"${mapEntry._pages.map((page) => page.outputPath).join(`", "`)}"`; + return Promise.reject( + new EleventyTemplateError( + `Having trouble writing to ${outputPaths} from "${mapEntry.inputPath}"`, + e, + ), + ); + } + }), + ); + } + + for (let mapEntry of usedTemplateContentTooEarlyMap) { + promises.push( + this._generateTemplate(mapEntry, to).catch(function (e) { + return Promise.reject( + new EleventyTemplateError( + `Having trouble writing to (second pass) "${mapEntry.outputPath}" from "${mapEntry.inputPath}"`, + e, + ), + ); + }), + ); + } + + return promises; + } + + async write() { + let paths = await this._getAllPaths(); + + // This must happen before writePassthroughCopy + this.templateConfig.userConfig.emit("eleventy#beforerender"); + + let aggregatePassthroughCopyPromise = this.writePassthroughCopy(paths); + + let templatesPromise = Promise.all(await this.generateTemplates(paths)).then((results) => { + this.templateConfig.userConfig.emit("eleventy#render"); + + return results; + }); + + return Promise.all([aggregatePassthroughCopyPromise, templatesPromise]).then( + async ([passthroughCopyResults, templateResults]) => { + return { + passthroughCopy: passthroughCopyResults, + // New in 3.0: flatten and filter out falsy templates + templates: templateResults.flat().filter(Boolean), + }; + }, + (e) => { + return Promise.reject(e); + }, + ); + } + + // Passthrough copy not supported in JSON output. + // --incremental not supported in JSON output. + async getJSON(to = "json") { + let paths = await this._getAllPaths(); + let promises = await this.generateTemplates(paths, to); + + return Promise.all(promises).then( + (templateResults) => { + return { + // New in 3.0: flatten and filter out falsy templates + templates: templateResults.flat().filter(Boolean), + }; + }, + (e) => { + return Promise.reject(e); + }, + ); + } + + setVerboseOutput(isVerbose) { + this.isVerbose = isVerbose; + this.errorHandler.isVerbose = isVerbose; + } + + setDryRun(isDryRun) { + this.isDryRun = Boolean(isDryRun); + } + + setRunInitialBuild(runInitialBuild) { + this.isRunInitialBuild = runInitialBuild; + } + setIncrementalBuild(isIncremental) { + this.isIncremental = isIncremental; + } + setIncrementalFile(incrementalFile) { + this.incrementalFile = incrementalFile; + this.#passthroughManager.setIncrementalFile(incrementalFile); + } + resetIncrementalFile() { + this.incrementalFile = null; + this.#passthroughManager.resetIncrementalFile(); + } + + getMetadata() { + return { + // copyCount, copySize + ...(this.#passthroughManager?.getMetadata() || {}), + skipCount: this.skippedCount, + writeCount: this.writeCount, + renderCount: this.renderCount, + }; + } + + get caches() { + return ["_templatePathCache"]; + } +} + +export default TemplateWriter; diff --git a/node_modules/@11ty/eleventy/src/UserConfig.js b/node_modules/@11ty/eleventy/src/UserConfig.js new file mode 100644 index 0000000..215327f --- /dev/null +++ b/node_modules/@11ty/eleventy/src/UserConfig.js @@ -0,0 +1,1339 @@ +import chalk from "kleur"; +import { DateTime } from "luxon"; +import yaml from "js-yaml"; +import matter from "gray-matter"; +import debugUtil from "debug"; + +import { DeepCopy, TemplatePath, isPlainObject } from "@11ty/eleventy-utils"; + +import HtmlBasePlugin from "./Plugins/HtmlBasePlugin.js"; +import RenderPlugin from "./Plugins/RenderPlugin.js"; +import InputPathToUrlPlugin from "./Plugins/InputPathToUrl.js"; + +import isAsyncFunction from "./Util/IsAsyncFunction.js"; +import objectFilter from "./Util/Objects/ObjectFilter.js"; +import EventEmitter from "./Util/AsyncEventEmitter.js"; +import EleventyCompatibility from "./Util/Compatibility.js"; +import EleventyBaseError from "./Errors/EleventyBaseError.js"; +import BenchmarkManager from "./Benchmark/BenchmarkManager.js"; +import JavaScriptFrontMatter from "./Engines/FrontMatter/JavaScript.js"; +import { augmentFunction } from "./Engines/Util/ContextAugmenter.js"; + +const debug = debugUtil("Eleventy:UserConfig"); + +class UserConfigError extends EleventyBaseError {} + +/** + * Eleventy’s user-land Configuration API + * @module 11ty/eleventy/UserConfig + */ +class UserConfig { + /** @type {boolean} */ + #pluginExecution = false; + /** @type {boolean} */ + #quietModeLocked = false; + /** @type {boolean} */ + #dataDeepMergeModified = false; + /** @type {number|undefined} */ + #uniqueId; + /** @type {number} */ + #concurrency = 1; + // Before using os.availableParallelism(); see https://github.com/11ty/eleventy/issues/3596 + + constructor() { + // These are completely unnecessary lines to satisfy TypeScript + this.plugins = []; + this.templateFormatsAdded = []; + this.additionalWatchTargets = []; + this.watchTargetsConfigReset = new Set(); + this.extensionMap = new Set(); + this.dataExtensions = new Map(); + this.urlTransforms = []; + this.customDateParsingCallbacks = new Set(); + this.ignores = new Set(); + this.events = new EventEmitter(); + + /** @type {object} */ + this.directories = {}; + /** @type {undefined} */ + this.logger; + /** @type {string} */ + this.dir; + /** @type {string} */ + this.pathPrefix; + /** @type {object} */ + this.errorReporting = {}; + /** @type {object} */ + this.templateHandling = {}; + + this.reset(); + this.#uniqueId = Math.random(); + } + + // Internally used in TemplateContent for cache keys + _getUniqueId() { + return this.#uniqueId; + } + + reset() { + debug("Resetting EleventyConfig to initial values."); + + /** @type {EventEmitter} */ + this.events = new EventEmitter(); + this.events.setMaxListeners(25); // defaults to 10 + + /** @type {BenchmarkManager} */ + this.benchmarkManager = new BenchmarkManager(); + + /** @type {object} */ + this.benchmarks = { + /** @type {import('./Benchmark/BenchmarkGroup.js')} */ + config: this.benchmarkManager.get("Configuration"), + /** @type {import('./Benchmark/BenchmarkGroup.js')} */ + aggregate: this.benchmarkManager.get("Aggregate"), + }; + + /** @type {object} */ + this.directoryAssignments = {}; + /** @type {object} */ + this.collections = {}; + /** @type {object} */ + this.precompiledCollections = {}; + this.templateFormats = undefined; + this.templateFormatsAdded = []; + + /** @type {object} */ + this.universal = { + filters: {}, + shortcodes: {}, + pairedShortcodes: {}, + }; + + /** @type {object} */ + this.liquid = { + options: {}, + tags: {}, + filters: {}, + shortcodes: {}, + pairedShortcodes: {}, + parameterParsing: "legacy", // or builtin + }; + + /** @type {object} */ + this.nunjucks = { + // `dev: true` gives us better error messaging + environmentOptions: { dev: true }, + precompiledTemplates: {}, + filters: {}, + asyncFilters: {}, + tags: {}, + globals: {}, + shortcodes: {}, + pairedShortcodes: {}, + asyncShortcodes: {}, + asyncPairedShortcodes: {}, + }; + + /** @type {object} */ + this.javascript = { + functions: {}, + filters: {}, + shortcodes: {}, + pairedShortcodes: {}, + }; + + this.markdownHighlighter = null; + + /** @type {object} */ + this.libraryOverrides = {}; + + /** @type {object} */ + this.passthroughCopies = {}; + this.passthroughCopiesHtmlRelative = new Set(); + + /** @type {object} */ + this.layoutAliases = {}; + this.layoutResolution = true; // extension-less layout files + + /** @type {object} */ + this.linters = {}; + /** @type {object} */ + this.transforms = {}; + /** @type {object} */ + this.preprocessors = {}; + + this.activeNamespace = ""; + this.DateTime = DateTime; + this.dynamicPermalinks = true; + + this.useGitIgnore = true; + + let defaultIgnores = new Set(); + defaultIgnores.add("**/node_modules/**"); + defaultIgnores.add(".git/**"); // TODO `**/.git/**` + this.ignores = new Set(defaultIgnores); + this.watchIgnores = new Set(defaultIgnores); + + this.dataDeepMerge = true; + this.extensionMap = new Set(); + /** @type {object} */ + this.extensionConflictMap = {}; + this.watchJavaScriptDependencies = true; + this.additionalWatchTargets = []; + this.watchTargetsConfigReset = new Set(); + /** @type {object} */ + this.serverOptions = {}; + /** @type {object} */ + this.globalData = {}; + /** @type {object} */ + this.chokidarConfig = {}; + this.watchThrottleWaitTime = 0; //ms + + // using Map to preserve insertion order + this.dataExtensions = new Map(); + + this.quietMode = false; + + this.plugins = []; + + this.useTemplateCache = true; + this.dataFilterSelectors = new Set(); + + /** @type {object} */ + this.libraryAmendments = {}; + this.serverPassthroughCopyBehavior = "copy"; // or "passthrough" + this.urlTransforms = []; + + // Defaults in `defaultConfig.js` + this.dataFileSuffixesOverride = false; + this.dataFileDirBaseNameOverride = false; + + /** @type {object} */ + this.frontMatterParsingOptions = { + // Set a project-wide default. + // language: "yaml", + + // Supplementary engines + engines: { + yaml: yaml.load.bind(yaml), + + // Backwards compatible with `js` object front matter + // https://github.com/11ty/eleventy/issues/2819 + javascript: JavaScriptFrontMatter, + + // Needed for fallback behavior in the new `javascript` engine + // @ts-ignore + jsLegacy: matter.engines.javascript, + + node: function () { + throw new Error( + "The `node` front matter type was a 3.0.0-alpha.x only feature, removed for stable release. Rename to `js` or `javascript` instead!", + ); + }, + }, + }; + + /** @type {object} */ + this.virtualTemplates = {}; + this.freezeReservedData = true; + this.customDateParsingCallbacks = new Set(); + + /** @type {object} */ + this.errorReporting = {}; + /** @type {object} */ + this.templateHandling = {}; + + // Before using os.availableParallelism(); see https://github.com/11ty/eleventy/issues/3596 + this.#concurrency = 1; + } + + // compatibleRange is optional in 2.0.0-beta.2 + versionCheck(compatibleRange) { + let compat = new EleventyCompatibility(compatibleRange); + + if (!compat.isCompatible()) { + throw new UserConfigError(compat.getErrorMessage()); + } + } + + /* + * Events + */ + + // Duplicate event bindings are avoided with the `reset` method above. + // A new EventEmitter instance is created when the config is reset. + on(eventName, callback) { + return this.events.on(eventName, callback); + } + + once(eventName, callback) { + return this.events.once(eventName, callback); + } + + emit(eventName, ...args) { + return this.events.emit(eventName, ...args); + } + + setEventEmitterMode(mode) { + this.events.setHandlerMode(mode); + } + + /* + * Universal getters + */ + getFilter(name) { + // JavaScript functions are included here for backwards compatibility https://github.com/11ty/eleventy/issues/3365 + return this.universal.filters[name] || this.javascript.functions[name]; + } + + getFilters(options = {}) { + if (options.type) { + return objectFilter( + this.universal.filters, + (entry) => entry.__eleventyInternal?.type === options.type, + ); + } + + return this.universal.filters; + } + + getShortcode(name) { + return this.universal.shortcodes[name]; + } + + getShortcodes(options = {}) { + if (options.type) { + return objectFilter( + this.universal.shortcodes, + (entry) => entry.__eleventyInternal?.type === options.type, + ); + } + + return this.universal.shortcodes; + } + + getPairedShortcode(name) { + return this.universal.pairedShortcodes[name]; + } + + getPairedShortcodes(options = {}) { + if (options.type) { + return objectFilter( + this.universal.pairedShortcodes, + (entry) => entry.__eleventyInternal?.type === options.type, + ); + } + return this.universal.pairedShortcodes; + } + + /* + * Private utilities + */ + #add(target, originalName, callback, options) { + let { description, functionName } = options; + + if (typeof callback !== "function") { + throw new Error(`Invalid definition for "${originalName}" ${description}.`); + } + + let name = this.getNamespacedName(originalName); + + if (target[name]) { + debug( + chalk.yellow(`Warning, overwriting previous ${description} "%o" via \`%o(%o)\``), + name, + functionName, + originalName, + ); + } else { + debug(`Adding new ${description} "%o" via \`%o(%o)\``, name, functionName, originalName); + } + + target[name] = this.#decorateCallback(`"${name}" ${description}`, callback); + } + + #decorateCallback(type, callback) { + return this.benchmarks.config.add(type, callback); + } + + /* + * Markdown + */ + + // This is a method for plugins, probably shouldn’t use this in projects. + // Projects should use `setLibrary` as documented here: + // https://github.com/11ty/eleventy/blob/master/docs/engines/markdown.md#use-your-own-options + addMarkdownHighlighter(highlightFn) { + this.markdownHighlighter = highlightFn; + } + + /* + * Filters + */ + + addLiquidFilter(name, callback) { + this.#add(this.liquid.filters, name, callback, { + description: "Liquid Filter", + functionName: "addLiquidFilter", + }); + } + + addNunjucksAsyncFilter(name, callback) { + this.#add(this.nunjucks.asyncFilters, name, callback, { + description: "Nunjucks Filter", + functionName: "addNunjucksAsyncFilter", + }); + } + + // Support the nunjucks style syntax for asynchronous filter add + addNunjucksFilter(name, callback, isAsync = false) { + if (isAsync) { + // namespacing happens downstream + this.addNunjucksAsyncFilter(name, callback); + } else { + this.#add(this.nunjucks.filters, name, callback, { + description: "Nunjucks Filter", + functionName: "addNunjucksFilter", + }); + } + } + + addJavaScriptFilter(name, callback) { + this.#add(this.javascript.filters, name, callback, { + description: "JavaScript Filter", + functionName: "addJavaScriptFilter", + }); + + // Backwards compat for a time before `addJavaScriptFilter` existed. + this.addJavaScriptFunction(name, callback); + } + + addFilter(name, callback) { + // This method *requires* `async function` and will not work with `function` that returns a promise + if (isAsyncFunction(callback)) { + this.addAsyncFilter(name, callback); + return; + } + + // namespacing happens downstream + this.#add(this.universal.filters, name, callback, { + description: "Universal Filter", + functionName: "addFilter", + }); + + this.addLiquidFilter(name, callback); + this.addJavaScriptFilter(name, callback); + this.addNunjucksFilter( + name, + /** @this {any} */ + function (...args) { + // Note that `callback` is already a function as the `#add` method throws an error if not. + let ret = callback.call(this, ...args); + if (ret instanceof Promise) { + throw new Error( + `Nunjucks *is* async-friendly with \`addFilter("${name}", async function() {})\` but you need to supply an \`async function\`. You returned a promise from \`addFilter("${name}", function() {})\`. Alternatively, use the \`addAsyncFilter("${name}")\` configuration API method.`, + ); + } + return ret; + }, + ); + } + + // Liquid, Nunjucks, and JS only + addAsyncFilter(name, callback) { + // namespacing happens downstream + this.#add(this.universal.filters, name, callback, { + description: "Universal Filter", + functionName: "addAsyncFilter", + }); + + this.addLiquidFilter(name, callback); + this.addJavaScriptFilter(name, callback); + this.addNunjucksAsyncFilter( + name, + /** @this {any} */ + async function (...args) { + let cb = args.pop(); + // Note that `callback` is already a function as the `#add` method throws an error if not. + let ret = await callback.call(this, ...args); + cb(null, ret); + }, + ); + } + + /* + * Shortcodes + */ + + addShortcode(name, callback) { + // This method *requires* `async function` and will not work with `function` that returns a promise + if (isAsyncFunction(callback)) { + this.addAsyncShortcode(name, callback); + return; + } + + this.#add(this.universal.shortcodes, name, callback, { + description: "Universal Shortcode", + functionName: "addShortcode", + }); + + this.addLiquidShortcode(name, callback); + this.addJavaScriptShortcode(name, callback); + this.addNunjucksShortcode(name, callback); + } + + addAsyncShortcode(name, callback) { + this.#add(this.universal.shortcodes, name, callback, { + description: "Universal Shortcode", + functionName: "addAsyncShortcode", + }); + + // Related: #498 + this.addNunjucksAsyncShortcode(name, callback); + this.addLiquidShortcode(name, callback); + this.addJavaScriptShortcode(name, callback); + } + + addNunjucksAsyncShortcode(name, callback) { + this.#add(this.nunjucks.asyncShortcodes, name, callback, { + description: "Nunjucks Async Shortcode", + functionName: "addNunjucksAsyncShortcode", + }); + } + + addNunjucksShortcode(name, callback, isAsync = false) { + if (isAsync) { + this.addNunjucksAsyncShortcode(name, callback); + } else { + this.#add(this.nunjucks.shortcodes, name, callback, { + description: "Nunjucks Shortcode", + functionName: "addNunjucksShortcode", + }); + } + } + + addLiquidShortcode(name, callback) { + this.#add(this.liquid.shortcodes, name, callback, { + description: "Liquid Shortcode", + functionName: "addLiquidShortcode", + }); + } + + addPairedShortcode(name, callback) { + // This method *requires* `async function` and will not work with `function` that returns a promise + if (isAsyncFunction(callback)) { + this.addPairedAsyncShortcode(name, callback); + return; + } + + this.#add(this.universal.pairedShortcodes, name, callback, { + description: "Universal Paired Shortcode", + functionName: "addPairedShortcode", + }); + + this.addPairedNunjucksShortcode(name, callback); + this.addPairedLiquidShortcode(name, callback); + this.addPairedJavaScriptShortcode(name, callback); + } + + // Related: #498 + addPairedAsyncShortcode(name, callback) { + this.#add(this.universal.pairedShortcodes, name, callback, { + description: "Universal Paired Async Shortcode", + functionName: "addPairedAsyncShortcode", + }); + + this.addPairedNunjucksAsyncShortcode(name, callback); + this.addPairedLiquidShortcode(name, callback); + this.addPairedJavaScriptShortcode(name, callback); + } + + addPairedNunjucksAsyncShortcode(name, callback) { + this.#add(this.nunjucks.asyncPairedShortcodes, name, callback, { + description: "Nunjucks Async Paired Shortcode", + functionName: "addPairedNunjucksAsyncShortcode", + }); + } + + addPairedNunjucksShortcode(name, callback, isAsync = false) { + if (isAsync) { + this.addPairedNunjucksAsyncShortcode(name, callback); + } else { + this.#add(this.nunjucks.pairedShortcodes, name, callback, { + description: "Nunjucks Paired Shortcode", + functionName: "addPairedNunjucksShortcode", + }); + } + } + + addPairedLiquidShortcode(name, callback) { + this.#add(this.liquid.pairedShortcodes, name, callback, { + description: "Liquid Paired Shortcode", + functionName: "addPairedLiquidShortcode", + }); + } + + addJavaScriptShortcode(name, callback) { + this.#add(this.javascript.shortcodes, name, callback, { + description: "JavaScript Shortcode", + functionName: "addJavaScriptShortcode", + }); + + // Backwards compat for a time before `addJavaScriptShortcode` existed. + this.addJavaScriptFunction(name, callback); + } + + addPairedJavaScriptShortcode(name, callback) { + this.#add(this.javascript.pairedShortcodes, name, callback, { + description: "JavaScript Paired Shortcode", + functionName: "addPairedJavaScriptShortcode", + }); + + // Backwards compat for a time before `addJavaScriptShortcode` existed. + this.addJavaScriptFunction(name, callback); + } + + // Both Filters and shortcodes feed into this + addJavaScriptFunction(name, callback) { + this.#add(this.javascript.functions, name, callback, { + description: "JavaScript Function", + functionName: "addJavaScriptFunction", + }); + } + + /* + * Custom Tags + */ + + // tagCallback: function(liquidEngine) { return { parse: …, render: … }} }; + addLiquidTag(name, tagFn) { + if (typeof tagFn !== "function") { + throw new UserConfigError( + `EleventyConfig.addLiquidTag expects a callback function to be passed in for ${name}: addLiquidTag(name, function(liquidEngine) { return { parse: …, render: … } })`, + ); + } + + this.#add(this.liquid.tags, name, tagFn, { + description: "Liquid Custom Tag", + functionName: "addLiquidTag", + }); + } + + addNunjucksTag(name, tagFn) { + if (typeof tagFn !== "function") { + throw new UserConfigError( + `EleventyConfig.addNunjucksTag expects a callback function to be passed in for ${name}: addNunjucksTag(name, function(nunjucksEngine) {})`, + ); + } + + this.#add(this.nunjucks.tags, name, tagFn, { + description: "Nunjucks Custom Tag", + functionName: "addNunjucksTag", + }); + } + + /* + * Plugins + */ + + // Internal method + _enablePluginExecution() { + this.#pluginExecution = true; + } + + // Internal method + _disablePluginExecution() { + this.#pluginExecution = false; + } + + /* Config is executed in two stages and plugins are the second stage—are we in the plugins stage? */ + isPluginExecution() { + return this.#pluginExecution; + } + + /** + * @typedef {function|Promise|object} PluginDefinition + * @property {Function} [configFunction] + * @property {string} [eleventyPackage] + * @property {object} [eleventyPluginOptions={}] + * @property {boolean} [eleventyPluginOptions.unique] + */ + + /** + * addPlugin: async friendly in 3.0 + * + * @param {PluginDefinition} plugin + */ + addPlugin(plugin, options = {}) { + // First addPlugin of a unique plugin wins + if (plugin?.eleventyPluginOptions?.unique && this.hasPlugin(plugin)) { + debug("Skipping duplicate unique addPlugin for %o", this._getPluginName(plugin)); + return; + } + + if (this.isPluginExecution() || options?.immediate) { + // this might return a promise + return this._executePlugin(plugin, options); + } else { + this.plugins.push({ + plugin, + options, + pluginNamespace: this.activeNamespace, + }); + } + } + + /** @param {string} name */ + resolvePlugin(name) { + let filenameLookup = { + "@11ty/eleventy/html-base-plugin": HtmlBasePlugin, + "@11ty/eleventy/render-plugin": RenderPlugin, + "@11ty/eleventy/inputpath-to-url-plugin": InputPathToUrlPlugin, + + // Async plugins: + // requires e.g. `await resolvePlugin("@11ty/eleventy/i18n-plugin")` to avoid preloading i18n dependencies. + // see https://github.com/11ty/eleventy-plugin-rss/issues/52 + "@11ty/eleventy/i18n-plugin": "./Plugins/I18nPlugin.js", + }; + + if (!filenameLookup[name]) { + throw new Error( + `Invalid name "${name}" passed to resolvePlugin. Valid options: ${Object.keys(filenameLookup).join(", ")}`, + ); + } + + // Future improvement: add support for any npm package name? + if (typeof filenameLookup[name] === "string") { + // returns promise + return import(filenameLookup[name]).then((plugin) => plugin.default); + } + + // return reference + return filenameLookup[name]; + } + + /** @param {string|PluginDefinition} plugin */ + hasPlugin(plugin) { + let pluginName; + if (typeof plugin === "string") { + pluginName = plugin; + } else { + pluginName = this._getPluginName(plugin); + } + + return this.plugins.some((entry) => this._getPluginName(entry.plugin) === pluginName); + } + + // Using Function.name https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#examples + /** @param {PluginDefinition} plugin */ + _getPluginName(plugin) { + if (plugin?.eleventyPackage) { + return plugin.eleventyPackage; + } + if (typeof plugin === "function") { + return plugin.name; + } + if (plugin?.configFunction && typeof plugin.configFunction === "function") { + return plugin.configFunction.name; + } + } + + // Starting in 3.0 the plugin callback might be asynchronous! + _executePlugin(plugin, options) { + let name = this._getPluginName(plugin); + let ret; + debug(`Adding %o plugin`, name || "anonymous"); + let pluginBenchmark = this.benchmarks.aggregate.get("Configuration addPlugin"); + + if (typeof plugin === "function") { + pluginBenchmark.before(); + this.benchmarks.config; + let configFunction = plugin; + ret = configFunction(this, options); + pluginBenchmark.after(); + } else if (plugin?.configFunction) { + pluginBenchmark.before(); + + if (options && typeof options.init === "function") { + // init is not yet async-friendly but it’s also barely used + options.init.call(this, plugin.initArguments || {}); + } + + ret = plugin.configFunction(this, options); + pluginBenchmark.after(); + } else { + throw new UserConfigError( + "Invalid EleventyConfig.addPlugin signature. Should be a function or a valid Eleventy plugin object.", + ); + } + return ret; + } + + /** @param {string} name */ + getNamespacedName(name) { + return this.activeNamespace + name; + } + + async namespace(pluginNamespace, callback) { + let validNamespace = pluginNamespace && typeof pluginNamespace === "string"; + if (validNamespace) { + this.activeNamespace = pluginNamespace || ""; + } + + await callback(this); + + if (validNamespace) { + this.activeNamespace = ""; + } + } + + /** + * Adds a path to a file or directory to the list of pass-through copies + * which are copied as-is to the output. + * + * @param {string|object} fileOrDir The path to the file or directory that should + * be copied. OR an object where the key is the input glob and the property is the output directory + * @param {object} copyOptions options for recursive-copy. + * see https://www.npmjs.com/package/recursive-copy#arguments + * default options are defined in TemplatePassthrough copyOptionsDefault + * @returns {any} a reference to the `EleventyConfig` object. + */ + addPassthroughCopy(fileOrDir, copyOptions = {}) { + if (copyOptions.mode) { + if (copyOptions.mode !== "html-relative") { + throw new Error( + "Invalid `mode` option for `addPassthroughCopy`. Received: '" + copyOptions.mode + "'", + ); + } + if (isPlainObject(fileOrDir)) { + throw new Error( + "mode: 'html-relative' does not yet support passthrough copy objects (input -> output mapping). Use a string glob or an Array of string globs.", + ); + } + + this.passthroughCopiesHtmlRelative?.add({ + match: fileOrDir, + ...copyOptions, + }); + } else if (typeof fileOrDir === "string") { + this.passthroughCopies[fileOrDir] = { outputPath: true, copyOptions }; + } else { + for (let [inputPath, outputPath] of Object.entries(fileOrDir)) { + this.passthroughCopies[inputPath] = { outputPath, copyOptions }; + } + } + + return this; + } + + /* + * Template Formats + */ + _normalizeTemplateFormats() { + throw new Error("The internal _normalizeTemplateFormats() method was removed in Eleventy 3.0"); + } + + setTemplateFormats(templateFormats) { + this.templateFormats = templateFormats; + } + + // additive, usually for plugins + addTemplateFormats(templateFormats) { + this.templateFormatsAdded.push(templateFormats); + } + + /* + * Library Overrides and Options + */ + setLibrary(engineName, libraryInstance) { + if (engineName === "liquid" && Object.keys(this.liquid.options).length) { + debug( + "WARNING: using `eleventyConfig.setLibrary` will override any configuration set using `.setLiquidOptions` via the config API. You’ll need to pass these options to the library yourself.", + ); + } else if (engineName === "njk" && Object.keys(this.nunjucks.environmentOptions).length) { + debug( + "WARNING: using `eleventyConfig.setLibrary` will override any configuration set using `.setNunjucksEnvironmentOptions` via the config API. You’ll need to pass these options to the library yourself.", + ); + } + + this.libraryOverrides[engineName.toLowerCase()] = libraryInstance; + } + + /* These callbacks run on both libraryOverrides and default library instances */ + amendLibrary(engineName, callback) { + let name = engineName.toLowerCase(); + if (!this.libraryAmendments[name]) { + this.libraryAmendments[name] = []; + } + + this.libraryAmendments[name].push(callback); + } + + setLiquidOptions(options) { + this.liquid.options = options; + } + + setLiquidParameterParsing(behavior) { + if (behavior !== "legacy" && behavior !== "builtin") { + throw new Error( + `Invalid argument passed to \`setLiquidParameterParsing\`. Expected one of "legacy" or "builtin".`, + ); + } + this.liquid.parameterParsing = behavior; + } + + setNunjucksEnvironmentOptions(options) { + this.nunjucks.environmentOptions = options; + } + + setNunjucksPrecompiledTemplates(templates) { + this.nunjucks.precompiledTemplates = templates; + } + + setDynamicPermalinks(enabled) { + this.dynamicPermalinks = !!enabled; + } + + setUseGitIgnore(enabled) { + this.useGitIgnore = !!enabled; + } + + setDataDeepMerge(deepMerge) { + this.#dataDeepMergeModified = true; + this.dataDeepMerge = !!deepMerge; + } + + // Used by the Upgrade Helper Plugin + isDataDeepMergeModified() { + return this.#dataDeepMergeModified; + } + + addWatchTarget(additionalWatchTargets, options = {}) { + // Reset the config when the target path changes + if (options.resetConfig) { + this.watchTargetsConfigReset.add(additionalWatchTargets); + } + + this.additionalWatchTargets.push(additionalWatchTargets); + } + + setWatchJavaScriptDependencies(watchEnabled) { + this.watchJavaScriptDependencies = !!watchEnabled; + } + + setServerOptions(options = {}, override = false) { + if (override) { + this.serverOptions = options; + } else { + this.serverOptions = DeepCopy(this.serverOptions, options); + } + } + + setBrowserSyncConfig() { + this._attemptedBrowserSyncUse = true; + debug( + "The `setBrowserSyncConfig` method was removed in Eleventy 2.0.0. Use `setServerOptions` with the new Eleventy development server or the `@11ty/eleventy-browser-sync` plugin moving forward.", + ); + } + + setChokidarConfig(options = {}) { + this.chokidarConfig = options; + } + + setWatchThrottleWaitTime(time = 0) { + this.watchThrottleWaitTime = time; + } + + // 3.0 change: this does a top level merge instead of reset. + setFrontMatterParsingOptions(options = {}) { + DeepCopy(this.frontMatterParsingOptions, options); + } + + /* Internal method for CLI --quiet */ + _setQuietModeOverride(quietMode) { + this.setQuietMode(quietMode); + this.#quietModeLocked = true; + } + + setQuietMode(quietMode) { + if (this.#quietModeLocked) { + debug( + "Attempt to `setQuietMode(%o)` ignored, --quiet command line argument override in place.", + !!quietMode, + ); + // override via CLI takes precedence + return; + } + + this.quietMode = !!quietMode; + } + + addExtension(fileExtension, options = {}) { + let extensions; + + // Array support added in 2.0.0-canary.19 + if (Array.isArray(fileExtension)) { + extensions = fileExtension; + } else { + // single string + extensions = [fileExtension]; + } + + for (let extension of extensions) { + if (this.extensionConflictMap[extension]) { + throw new Error( + `An attempt was made to override the "${extension}" template syntax twice (via the \`addExtension\` configuration API). A maximum of one override is currently supported.`, + ); + } + this.extensionConflictMap[extension] = true; + + /** @type {object} */ + let extensionOptions = Object.assign( + { + // Might be overridden for aliasing in options.key + key: extension, + extension: extension, + }, + options, + ); + + if (extensionOptions.key !== extensionOptions.extension) { + extensionOptions.aliasKey = extensionOptions.extension; + } + + this.extensionMap.add(extensionOptions); + } + } + + addDataExtension(extensionList, parser) { + let options = {}; + // second argument is an object with a `parser` callback + if (typeof parser !== "function") { + if (!("parser" in parser)) { + throw new Error( + "Expected `parser` property in second argument object to `eleventyConfig.addDataExtension`", + ); + } + + options = parser; + parser = options.parser; + } + + let extensions = extensionList.split(",").map((s) => s.trim()); + for (let extension of extensions) { + this.dataExtensions.set(extension, { + extension, + parser, + options, + }); + } + } + + setUseTemplateCache(bypass) { + this.useTemplateCache = !!bypass; + } + + setPrecompiledCollections(collections) { + this.precompiledCollections = collections; + } + + // "passthrough" is the default, no other value is explicitly required in code + // but opt-out via "copy" is suggested + setServerPassthroughCopyBehavior(behavior) { + this.serverPassthroughCopyBehavior = behavior; + } + + // Url transforms change page.url and work good with server side content-negotiation (e.g. i18n plugin) + addUrlTransform(callback) { + this.urlTransforms.push(callback); + } + + setDataFileSuffixes(suffixArray) { + this.dataFileSuffixesOverride = suffixArray; + } + + setDataFileBaseName(baseName) { + this.dataFileDirBaseNameOverride = baseName; + } + + addTemplate(virtualInputPath, content, data) { + // Lookups keys must be normalized + virtualInputPath = TemplatePath.stripLeadingDotSlash( + TemplatePath.standardizeFilePath(virtualInputPath), + ); + if (this.virtualTemplates[virtualInputPath]) { + throw new Error( + "Virtual template conflict: you can’t add multiple virtual templates that have the same inputPath: " + + virtualInputPath, + ); + } + + this.virtualTemplates[virtualInputPath] = { + inputPath: virtualInputPath, + data, + content, + }; + } + + isVirtualTemplate(virtualInputPath) { + return Boolean(this.virtualTemplates[virtualInputPath]); + } + + #setDirectory(key, dir) { + if (this.isPluginExecution()) { + throw new Error( + "The `set*Directory` configuration API methods are not yet allowed in plugins.", + ); + } + this.directoryAssignments[key] = dir; + } + + setInputDirectory(dir) { + this.#setDirectory("input", dir); + } + + setOutputDirectory(dir) { + this.#setDirectory("output", dir); + } + + setDataDirectory(dir) { + this.#setDirectory("data", dir); + } + + setIncludesDirectory(dir) { + this.#setDirectory("includes", dir); + } + + setLayoutsDirectory(dir) { + this.#setDirectory("layouts", dir); + } + + // Some data keywords in Eleventy are reserved, throw an error if an application tries to set these. + setFreezeReservedData(bool) { + this.freezeReservedData = !!bool; + } + + addDateParsing(callback) { + if (typeof callback === "function") { + this.customDateParsingCallbacks.add(callback); + } else { + throw new Error("addDateParsing expects a function argument."); + } + } + + // 3.0.0-alpha.18 started merging conflicts here (when possible), issue #3389 + addGlobalData(name, data) { + name = this.getNamespacedName(name); + if (this.globalData[name]) { + if (isPlainObject(this.globalData[name]) && isPlainObject(data)) { + DeepCopy(this.globalData[name], data); + } else { + debug("Warning: overwriting a previous value set with addGlobalData(%o)", name); + this.globalData[name] = data; + } + } else { + this.globalData[name] = data; + } + return this; + } + + addNunjucksGlobal(name, globalType) { + name = this.getNamespacedName(name); + + if (this.nunjucks.globals[name]) { + debug( + chalk.yellow("Warning, overwriting a Nunjucks global with `addNunjucksGlobal(%o)`"), + name, + ); + } + + if (typeof globalType === "function") { + this.nunjucks.globals[name] = this.#decorateCallback(`"${name}" Nunjucks Global`, globalType); + } else { + this.nunjucks.globals[name] = globalType; + } + } + + addTransform(name, callback) { + name = this.getNamespacedName(name); + + this.transforms[name] = this.#decorateCallback(`"${name}" Transform`, callback); + } + + addPreprocessor(name, fileExtensions, callback) { + name = this.getNamespacedName(name); + + this.preprocessors[name] = { + filter: fileExtensions, + callback: this.#decorateCallback(`"${name}" Preprocessor`, callback), + }; + } + + addLinter(name, callback) { + name = this.getNamespacedName(name); + + this.linters[name] = this.#decorateCallback(`"${name}" Linter`, callback); + } + + addLayoutAlias(from, to) { + this.layoutAliases[from] = to; + } + + setLayoutResolution(resolution) { + this.layoutResolution = !!resolution; + } + + // compat + enableLayoutResolution() { + this.layoutResolution = true; + } + + configureErrorReporting(options = {}) { + // allowMissingExtensions: true + Object.assign(this.errorReporting, options); + } + + configureTemplateHandling(options = {}) { + // writeMode: "sync" // "async" + Object.assign(this.templateHandling, options); + } + + /* + * Collections + */ + + // get config defined collections + getCollections() { + return this.collections; + } + + addCollection(name, callback) { + name = this.getNamespacedName(name); + + if (this.collections[name]) { + throw new UserConfigError( + `config.addCollection(${name}) already exists. Try a different name for your collection.`, + ); + } + + this.collections[name] = callback; + } + + augmentFunctionContext(fn, options) { + let t = typeof fn; + if (t !== "function") { + throw new UserConfigError( + "Invalid type passed to `augmentFunctionContext`—function was expected and received: " + t, + ); + } + + return augmentFunction(fn, options); + } + + setConcurrency(number) { + if (typeof number !== "number") { + throw new UserConfigError("Argument passed to `setConcurrency` must be a number."); + } + + this.#concurrency = number; + } + + getConcurrency() { + return this.#concurrency; + } + + getMergingConfigObject() { + let obj = { + // filters removed in 1.0 (use addTransform instead) + transforms: this.transforms, + linters: this.linters, + preprocessors: this.preprocessors, + globalData: this.globalData, + layoutAliases: this.layoutAliases, + layoutResolution: this.layoutResolution, + passthroughCopiesHtmlRelative: this.passthroughCopiesHtmlRelative, + passthroughCopies: this.passthroughCopies, + + // Liquid + liquidOptions: this.liquid.options, + liquidTags: this.liquid.tags, + liquidFilters: this.liquid.filters, + liquidShortcodes: this.liquid.shortcodes, + liquidPairedShortcodes: this.liquid.pairedShortcodes, + liquidParameterParsing: this.liquid.parameterParsing, + + // Nunjucks + nunjucksEnvironmentOptions: this.nunjucks.environmentOptions, + nunjucksPrecompiledTemplates: this.nunjucks.precompiledTemplates, + nunjucksFilters: this.nunjucks.filters, + nunjucksAsyncFilters: this.nunjucks.asyncFilters, + nunjucksTags: this.nunjucks.tags, + nunjucksGlobals: this.nunjucks.globals, + nunjucksAsyncShortcodes: this.nunjucks.asyncShortcodes, + nunjucksShortcodes: this.nunjucks.shortcodes, + nunjucksAsyncPairedShortcodes: this.nunjucks.asyncPairedShortcodes, + nunjucksPairedShortcodes: this.nunjucks.pairedShortcodes, + + // 11ty.js + javascriptFunctions: this.javascript.functions, // filters and shortcodes, combined + javascriptShortcodes: this.javascript.shortcodes, + javascriptPairedShortcodes: this.javascript.pairedShortcodes, + javascriptFilters: this.javascript.filters, + + // Markdown + markdownHighlighter: this.markdownHighlighter, + + libraryOverrides: this.libraryOverrides, + dynamicPermalinks: this.dynamicPermalinks, + useGitIgnore: this.useGitIgnore, + ignores: this.ignores, + watchIgnores: this.watchIgnores, + dataDeepMerge: this.dataDeepMerge, + watchJavaScriptDependencies: this.watchJavaScriptDependencies, + additionalWatchTargets: this.additionalWatchTargets, + watchTargetsConfigReset: this.watchTargetsConfigReset, + serverOptions: this.serverOptions, + chokidarConfig: this.chokidarConfig, + watchThrottleWaitTime: this.watchThrottleWaitTime, + frontMatterParsingOptions: this.frontMatterParsingOptions, + dataExtensions: this.dataExtensions, + extensionMap: this.extensionMap, + quietMode: this.quietMode, + events: this.events, + benchmarkManager: this.benchmarkManager, + plugins: this.plugins, + useTemplateCache: this.useTemplateCache, + precompiledCollections: this.precompiledCollections, + dataFilterSelectors: this.dataFilterSelectors, + libraryAmendments: this.libraryAmendments, + serverPassthroughCopyBehavior: this.serverPassthroughCopyBehavior, + urlTransforms: this.urlTransforms, + virtualTemplates: this.virtualTemplates, + // `directories` and `directoryAssignments` are merged manually prior to plugin processing + freezeReservedData: this.freezeReservedData, + customDateParsing: this.customDateParsingCallbacks, + errorReporting: this.errorReporting, + templateHandling: this.templateHandling, + }; + + if (Array.isArray(this.dataFileSuffixesOverride)) { + // no upstream merging of this array, so we add the override: prefix + obj["override:dataFileSuffixes"] = this.dataFileSuffixesOverride; + } + + if (this.dataFileDirBaseNameOverride) { + obj.dataFileDirBaseNameOverride = this.dataFileDirBaseNameOverride; + } + + return obj; + } + + // No-op functions for backwards compat + addHandlebarsHelper() {} + setPugOptions() {} + setEjsOptions() {} + addHandlebarsShortcode() {} + addPairedHandlebarsShortcode() {} +} + +export default UserConfig; diff --git a/node_modules/@11ty/eleventy/src/Util/ArrayUtil.js b/node_modules/@11ty/eleventy/src/Util/ArrayUtil.js new file mode 100644 index 0000000..bcb61de --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/ArrayUtil.js @@ -0,0 +1,24 @@ +export function arrayDelete(arr, match) { + if (!Array.isArray(arr)) { + return []; + } + + if (!match) { + return arr; + } + + // only mutates if found + if (typeof match === "function") { + if (arr.find(match)) { + return arr.filter((entry) => { + return !match(entry); + }); + } + } else if (arr.includes(match)) { + return arr.filter((entry) => { + return entry !== match; + }); + } + + return arr; +} diff --git a/node_modules/@11ty/eleventy/src/Util/AsyncEventEmitter.js b/node_modules/@11ty/eleventy/src/Util/AsyncEventEmitter.js new file mode 100644 index 0000000..0bc471f --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/AsyncEventEmitter.js @@ -0,0 +1,88 @@ +import { EventEmitter } from "node:events"; + +/** + * This class emits events asynchronously. + * + * Note that Eleventy has two separate event emitter instances it uses: + * 1. a userland one (UserConfig.js) + * 2. a global one for internals (EventBus.js) + */ +class AsyncEventEmitter extends EventEmitter { + #handlerMode = "parallel"; + + // TypeScript slop + constructor(...args) { + super(...args); + } + + reset() { + // `eleventy#` event type listeners are removed at the start of each build (singletons) + for (let type of this.eventNames()) { + if (typeof type === "string" && type.startsWith("eleventy#")) { + this.removeAllListeners(type); + } + } + + } + + /** + * @param {string} type - The event name to emit. + * @param {...*} args - Additional arguments that get passed to listeners. + * @returns {Promise} - Promise resolves once all listeners were invoked + */ + /** @ts-expect-error */ + async emit(type, ...args) { + let listeners = this.listeners(type); + if (listeners.length === 0) { + return []; + } + + if (this.#handlerMode == "sequential") { + const result = []; + for (const listener of listeners) { + const returnValue = await listener.apply(this, args); + result.push(returnValue); + } + return result; + } else { + return Promise.all( + listeners.map((listener) => { + return listener.apply(this, args); + }), + ); + } + } + + /** + * @param {string} type - The event name to emit. + * @param {...*} args - Additional lazy-executed function arguments that get passed to listeners. + * @returns {Promise} - Promise resolves once all listeners were invoked + */ + async emitLazy(type, ...args) { + let listeners = this.listeners(type); + if (listeners.length === 0) { + return []; + } + + let argsMap = []; + for (let arg of args) { + if (typeof arg === "function") { + let r = arg(); + if (r instanceof Promise) { + r = await r; + } + argsMap.push(r); + } else { + argsMap.push(arg); + } + } + + return this.emit.call(this, type, ...argsMap); + } + + setHandlerMode(mode) { + this.#handlerMode = mode; + } +} + +export default AsyncEventEmitter; diff --git a/node_modules/@11ty/eleventy/src/Util/Compatibility.js b/node_modules/@11ty/eleventy/src/Util/Compatibility.js new file mode 100644 index 0000000..c90a9b3 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/Compatibility.js @@ -0,0 +1,59 @@ +import semver from "semver"; + +import { getEleventyPackageJson, getWorkingProjectPackageJson } from "./ImportJsonSync.js"; + +const pkg = getEleventyPackageJson(); + +// Used in user config versionCheck method. +class Compatibility { + static NORMALIZE_PRERELEASE_REGEX = /-canary\b/g; + + static #projectPackageJson; + + constructor(compatibleRange) { + this.compatibleRange = Compatibility.getCompatibilityValue(compatibleRange); + } + + static get projectPackageJson() { + if (!this.#projectPackageJson) { + this.#projectPackageJson = getWorkingProjectPackageJson(); + } + + return this.#projectPackageJson; + } + + static normalizeIdentifier(identifier) { + return identifier.replace(Compatibility.NORMALIZE_PRERELEASE_REGEX, "-alpha"); + } + + static getCompatibilityValue(compatibleRange) { + if (compatibleRange) { + return compatibleRange; + } + + // fetch from project’s package.json + if (this.projectPackageJson?.["11ty"]?.compatibility) { + return this.projectPackageJson["11ty"].compatibility; + } + } + + isCompatible() { + return Compatibility.satisfies(pkg.version, this.compatibleRange); + } + + static satisfies(version, compatibleRange) { + return semver.satisfies( + Compatibility.normalizeIdentifier(version), + Compatibility.normalizeIdentifier(compatibleRange), + { + includePrerelease: true, + }, + ); + } + + getErrorMessage() { + return `We found Eleventy version '${pkg.version}' which does not meet the required version range: '${this.compatibleRange}'. Use \`npm install @11ty/eleventy\` to upgrade your local project to the latest Eleventy version (or \`npm install @11ty/eleventy -g\` to upgrade the globally installed version).`; + } +} + +export default Compatibility; diff --git a/node_modules/@11ty/eleventy/src/Util/ConsoleLogger.js b/node_modules/@11ty/eleventy/src/Util/ConsoleLogger.js new file mode 100644 index 0000000..ba41196 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/ConsoleLogger.js @@ -0,0 +1,140 @@ +import { Readable } from "node:stream"; +import chalk from "kleur"; +import debugUtil from "debug"; + +const debug = debugUtil("Eleventy:Logger"); + +/** + * Logger implementation that logs to STDOUT. + * @typedef {'error'|'log'|'warn'|'info'} LogType + */ +class ConsoleLogger { + /** @type {boolean} */ + #isVerbose = true; + /** @type {boolean} */ + #isChalkEnabled = true; + /** @type {object|boolean|undefined} */ + #logger; + /** @type {Readable|undefined} */ + #outputStream; + + constructor() {} + + isLoggingEnabled() { + if (!this.isVerbose || process.env.DEBUG) { + return true; + } + return this.#logger !== false; + } + + get isVerbose() { + return this.#isVerbose; + } + + set isVerbose(verbose) { + this.#isVerbose = !!verbose; + } + + get isChalkEnabled() { + return this.#isChalkEnabled; + } + + set isChalkEnabled(enabled) { + this.#isChalkEnabled = !!enabled; + } + + overrideLogger(logger) { + this.#logger = logger; + } + + get logger() { + return this.#logger || console; + } + + /** @param {string} msg */ + log(msg) { + this.message(msg); + } + + /** + * @typedef LogOptions + * @property {string} message + * @property {string=} prefix + * @property {LogType=} type + * @property {string=} color + * @property {boolean=} force + * @param {LogOptions} options + */ + logWithOptions({ message, type, prefix, color, force }) { + this.message(message, type, color, force, prefix); + } + + /** @param {string} msg */ + forceLog(msg) { + this.message(msg, undefined, undefined, true); + } + + /** @param {string} msg */ + info(msg) { + this.message(msg, "warn", "blue"); + } + + /** @param {string} msg */ + warn(msg) { + this.message(msg, "warn", "yellow"); + } + + /** @param {string} msg */ + error(msg) { + this.message(msg, "error", "red"); + } + + get outputStream() { + if (!this.#outputStream) { + this.#outputStream = new Readable({ + read() {}, + }); + } + return this.#outputStream; + } + + /** @param {string} msg */ + toStream(msg) { + this.outputStream.push(msg); + } + + closeStream() { + this.outputStream.push(null); + return this.outputStream; + } + + /** + * Formats the message to log. + * + * @param {string} message - The raw message to log. + * @param {LogType} [type='log'] - The error level to log. + * @param {string|undefined} [chalkColor=undefined] - Color name or falsy to disable + * @param {boolean} [forceToConsole=false] - Enforce a log on console instead of specified target. + */ + message( + message, + type = "log", + chalkColor = undefined, + forceToConsole = false, + prefix = "[11ty]", + ) { + if (!forceToConsole && (!this.isVerbose || process.env.DEBUG)) { + debug(message); + } else if (this.#logger !== false) { + message = `${chalk.gray(prefix)} ${message.split("\n").join(`\n${chalk.gray(prefix)} `)}`; + + if (chalkColor && this.isChalkEnabled) { + this.logger[type](chalk[chalkColor](message)); + } else { + this.logger[type](message); + } + } + } +} + +export default ConsoleLogger; diff --git a/node_modules/@11ty/eleventy/src/Util/DateGitFirstAdded.js b/node_modules/@11ty/eleventy/src/Util/DateGitFirstAdded.js new file mode 100644 index 0000000..0cc5959 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/DateGitFirstAdded.js @@ -0,0 +1,23 @@ +import { spawnAsync } from "./SpawnAsync.js"; + +async function getGitFirstAddedTimeStamp(filePath) { + try { + let timestamp = await spawnAsync( + "git", + // Formats https://www.git-scm.com/docs/git-log#_pretty_formats + // %at author date, UNIX timestamp + ["log", "--diff-filter=A", "--follow", "-1", "--format=%at", filePath], + ); + return parseInt(timestamp, 10) * 1000; + } catch (e) { + // do nothing + } +} + +// return a Date +export default async function (inputPath) { + let timestamp = await getGitFirstAddedTimeStamp(inputPath); + if (timestamp) { + return new Date(timestamp); + } +} diff --git a/node_modules/@11ty/eleventy/src/Util/DateGitLastUpdated.js b/node_modules/@11ty/eleventy/src/Util/DateGitLastUpdated.js new file mode 100644 index 0000000..1f58c11 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/DateGitLastUpdated.js @@ -0,0 +1,23 @@ +import { spawnAsync } from "./SpawnAsync.js"; + +async function getGitLastUpdatedTimeStamp(filePath) { + try { + let timestamp = await spawnAsync( + "git", + // Formats https://www.git-scm.com/docs/git-log#_pretty_formats + // %at author date, UNIX timestamp + ["log", "-1", "--format=%at", filePath], + ); + return parseInt(timestamp, 10) * 1000; + } catch (e) { + // do nothing + } +} + +// return a Date +export default async function (inputPath) { + let timestamp = await getGitLastUpdatedTimeStamp(inputPath); + if (timestamp) { + return new Date(timestamp); + } +} diff --git a/node_modules/@11ty/eleventy/src/Util/DirContains.js b/node_modules/@11ty/eleventy/src/Util/DirContains.js new file mode 100644 index 0000000..c19990c --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/DirContains.js @@ -0,0 +1,10 @@ +import path from "node:path"; + +// Returns true if subfolder is in parent (accepts absolute or relative paths for both) +export default function (parentFolder, subFolder) { + // path.resolve returns an absolute path + if (path.resolve(subFolder).startsWith(path.resolve(parentFolder))) { + return true; + } + return false; +} diff --git a/node_modules/@11ty/eleventy/src/Util/EsmResolver.js b/node_modules/@11ty/eleventy/src/Util/EsmResolver.js new file mode 100644 index 0000000..c098ed8 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/EsmResolver.js @@ -0,0 +1,53 @@ +import debugUtil from "debug"; +import { fileURLToPath } from "node:url"; +import PathNormalizer from "./PathNormalizer.js"; + +const debug = debugUtil("Eleventy:EsmResolver"); + +let lastModifiedPaths = new Map(); +export async function initialize({ port }) { + // From `eleventy.importCacheReset` event in Require.js + port.on("message", ({ path, newDate }) => { + lastModifiedPaths.set(path, newDate); + }); +} + +// Fixes issue https://github.com/11ty/eleventy/issues/3270 +// Docs: https://nodejs.org/docs/latest/api/module.html#resolvespecifier-context-nextresolve +export async function resolve(specifier, context, nextResolve) { + try { + // Not a relative import and not a file import + // Or from node_modules (perhaps better to check if the specifier is in the project directory instead) + if ( + (!specifier.startsWith("../") && + !specifier.startsWith("./") && + !specifier.startsWith("file:")) || + context.parentURL.includes("/node_modules/") + ) { + return nextResolve(specifier); + } + + let fileUrl = new URL(specifier, context.parentURL); + if (fileUrl.searchParams.has("_cache_bust")) { + // already is cache busted outside resolver (wider compat, url was changed prior to import, probably in Require.js) + return nextResolve(specifier); + } + + let absolutePath = PathNormalizer.normalizeSeperator(fileURLToPath(fileUrl)); + // Bust the import cache if this is a recently modified file + if (lastModifiedPaths.has(absolutePath)) { + fileUrl.search = ""; // delete existing searchparams + fileUrl.searchParams.set("_cache_bust", lastModifiedPaths.get(absolutePath)); + debug("Cache busting %o to %o", specifier, fileUrl.toString()); + + return nextResolve(fileUrl.toString()); + } + } catch (e) { + debug("EsmResolver Error parsing specifier (%o): %o", specifier, e); + } + + return nextResolve(specifier); +} + +// export async function load(url, context, nextLoad) { +// } diff --git a/node_modules/@11ty/eleventy/src/Util/EventBusUtil.js b/node_modules/@11ty/eleventy/src/Util/EventBusUtil.js new file mode 100644 index 0000000..c749fe9 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/EventBusUtil.js @@ -0,0 +1,14 @@ +import eventBus from "../EventBus.js"; +import debugUtil from "debug"; + +const debug = debugUtil("Eleventy:EventBus"); + +class EventBusUtil { + static debugCurrentListenerCounts() { + for (let name of eventBus.eventNames()) { + debug("Listeners for %o: %o", name, eventBus.listenerCount(name)); + } + } +} + +export default EventBusUtil; diff --git a/node_modules/@11ty/eleventy/src/Util/ExistsCache.js b/node_modules/@11ty/eleventy/src/Util/ExistsCache.js new file mode 100644 index 0000000..433d743 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/ExistsCache.js @@ -0,0 +1,62 @@ +import fs from "node:fs"; +import { TemplatePath } from "@11ty/eleventy-utils"; + +// Checks both files and directories +class ExistsCache { + #exists = new Map(); + #dirs = new Map(); + + constructor() { + this.lookupCount = 0; + } + + get size() { + return this.#exists.size; + } + + has(path) { + return this.#exists.has(path); + } + + set(path, isExist) { + this.#exists.set(TemplatePath.addLeadingDotSlash(path), Boolean(isExist)); + } + + // Not yet needed + // setDirectory(path, isExist) {} + + // Relative paths (to root directory) expected (but not enforced due to perf costs) + exists(path) { + if (!this.#exists.has(path)) { + let exists = fs.existsSync(path); + this.lookupCount++; + + // mark for next time + this.#exists.set(path, Boolean(exists)); + + return exists; + } + + return this.#exists.get(path); + } + + isDirectory(path) { + if (!this.exists(path)) { + return false; + } + + if (!this.#dirs.has(path)) { + let isDir = fs.statSync(path).isDirectory(); + this.lookupCount++; + + // mark for next time + this.#dirs.set(path, isDir); + + return isDir; + } + + return this.#dirs.get(path); + } +} + +export default ExistsCache; diff --git a/node_modules/@11ty/eleventy/src/Util/FilePathUtil.js b/node_modules/@11ty/eleventy/src/Util/FilePathUtil.js new file mode 100644 index 0000000..1675e8e --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/FilePathUtil.js @@ -0,0 +1,19 @@ +class FilePathUtil { + static isMatchingExtension(filepath, fileExtension) { + if (!fileExtension) { + return false; + } + + if (!(fileExtension || "").startsWith(".")) { + fileExtension = "." + fileExtension; + } + + return filepath.endsWith(fileExtension); + } + + static getFileExtension(filepath) { + return (filepath || "").split(".").pop(); + } +} + +export { FilePathUtil }; diff --git a/node_modules/@11ty/eleventy/src/Util/FileSystemManager.js b/node_modules/@11ty/eleventy/src/Util/FileSystemManager.js new file mode 100644 index 0000000..12881d7 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/FileSystemManager.js @@ -0,0 +1,48 @@ +import path from "node:path"; +import fs from "node:fs"; +import { mkdir, writeFile } from "node:fs/promises"; + +class FileSystemManager { + constructor(templateConfig) { + if (!templateConfig || templateConfig.constructor.name !== "TemplateConfig") { + throw new Error( + "Internal error: Missing `templateConfig` or was not an instance of `TemplateConfig`.", + ); + } + this.templateConfig = templateConfig; + } + + exists(pathname) { + return this.templateConfig.existsCache.exists(pathname); + } + + async createDirectoryForFile(filePath) { + let dir = path.parse(filePath).dir; + if (!dir || this.exists(dir)) { + return; + } + + return mkdir(dir, { recursive: true }); + } + + createDirectoryForFileSync(filePath) { + let dir = path.parse(filePath).dir; + if (!dir || this.exists(dir)) { + return; + } + + fs.mkdirSync(dir, { recursive: true }); + } + + async writeFile(filePath, content) { + return writeFile(filePath, content); + } + + writeFileSync(filePath, content) { + // Note: This deliberately uses the synchronous version to avoid + // unbounded concurrency: https://github.com/11ty/eleventy/issues/3271 + fs.writeFileSync(filePath, content); + } +} + +export { FileSystemManager }; diff --git a/node_modules/@11ty/eleventy/src/Util/GetJavaScriptData.js b/node_modules/@11ty/eleventy/src/Util/GetJavaScriptData.js new file mode 100644 index 0000000..7d72a64 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/GetJavaScriptData.js @@ -0,0 +1,30 @@ +import EleventyBaseError from "../Errors/EleventyBaseError.js"; + +class JavaScriptInvalidDataFormatError extends EleventyBaseError {} + +export default async function (inst, inputPath, key = "data", options = {}) { + let { mixins, isObjectRequired } = Object.assign( + { + mixins: {}, + isObjectRequired: true, + }, + options, + ); + + if (inst && key in inst) { + // get extra data from `data` method, + // either as a function or getter or object literal + let result = await (typeof inst[key] === "function" + ? Object.keys(mixins).length > 0 + ? inst[key].call(mixins) + : inst[key]() + : inst[key]); + + if (isObjectRequired && typeof result !== "object") { + throw new JavaScriptInvalidDataFormatError( + `Invalid data format returned from ${inputPath}: typeof ${typeof result}`, + ); + } + return result; + } +} diff --git a/node_modules/@11ty/eleventy/src/Util/GlobMatcher.js b/node_modules/@11ty/eleventy/src/Util/GlobMatcher.js new file mode 100644 index 0000000..a4a6c55 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/GlobMatcher.js @@ -0,0 +1,22 @@ +import picomatch from "picomatch"; +import { TemplatePath } from "@11ty/eleventy-utils"; + +function isGlobMatch(filepath, globs = [], options = undefined) { + if (!filepath || !Array.isArray(globs) || globs.length === 0) { + return false; + } + + let inputPath = TemplatePath.stripLeadingDotSlash(filepath); + let opts = Object.assign( + { + dot: true, + nocase: true, // insensitive + }, + options, + ); + + // globs: string or array of strings + return picomatch.isMatch(inputPath, globs, opts); +} + +export { isGlobMatch }; diff --git a/node_modules/@11ty/eleventy/src/Util/GlobRemap.js b/node_modules/@11ty/eleventy/src/Util/GlobRemap.js new file mode 100644 index 0000000..5e2bea3 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/GlobRemap.js @@ -0,0 +1,85 @@ +import path from "node:path"; +import ProjectDirectories from "./ProjectDirectories.js"; +import PathNormalizer from "./PathNormalizer.js"; + +// even on Windows (in cmd.exe) these paths are normalized to forward slashes +// tinyglobby expects forward slashes on Windows +const SEP = "/"; + +class GlobRemap { + constructor(paths = []) { + this.paths = paths; + this.cwd = GlobRemap.getCwd(paths); + } + + getCwd() { + return this.cwd; + } + + getRemapped(paths) { + return paths.map((entry) => GlobRemap.remapInput(entry, this.cwd)); + } + + getInput() { + return this.getRemapped(this.paths); + } + + getOutput(paths = []) { + return paths.map((entry) => GlobRemap.remapOutput(entry, this.cwd)); + } + + static getParentDirPrefix(filePath = "") { + let count = []; + for (let p of filePath.split(SEP)) { + if (p === "..") { + count.push(".."); + } else { + break; + } + } + + if (count.length > 0) { + // trailing slash + return count.join(SEP) + SEP; + } + return ""; + } + + static getLongestParentDirPrefix(filePaths) { + let longest = ""; + filePaths + .map((entry) => { + return this.getParentDirPrefix(entry); + }) + .filter((entry) => Boolean(entry)) + .forEach((prefix) => { + if (!longest || prefix.length > longest.length) { + longest = prefix; + } + }); + return longest; + } + + // alias + static getCwd(filePaths) { + return this.getLongestParentDirPrefix(filePaths); + } + + static remapInput(entry, cwd) { + if (cwd) { + if (!entry.startsWith("**" + SEP) && !entry.startsWith(`.git${SEP}**`)) { + return PathNormalizer.normalizeSeperator(ProjectDirectories.getRelativeTo(entry, cwd)); + } + } + return entry; + } + + static remapOutput(entry, cwd) { + if (cwd) { + return PathNormalizer.normalizeSeperator(path.join(cwd, entry)); + } + return entry; + } +} + +export default GlobRemap; diff --git a/node_modules/@11ty/eleventy/src/Util/HtmlRelativeCopy.js b/node_modules/@11ty/eleventy/src/Util/HtmlRelativeCopy.js new file mode 100644 index 0000000..3059014 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/HtmlRelativeCopy.js @@ -0,0 +1,149 @@ +import path from "node:path"; +import { TemplatePath } from "@11ty/eleventy-utils"; +import isValidUrl from "./ValidUrl.js"; +import { isGlobMatch } from "./GlobMatcher.js"; + +class HtmlRelativeCopy { + #userConfig; + #matchingGlobs = new Set(); + #matchingGlobsArray; + #dirty = false; + #paths = new Set(); + #failOnError = true; + #copyOptions = { + dot: false, // differs from standard passthrough copy + }; + + isEnabled() { + return this.#matchingGlobs.size > 0; + } + + setFailOnError(failOnError) { + this.#failOnError = Boolean(failOnError); + } + + setCopyOptions(opts) { + if (opts) { + Object.assign(this.#copyOptions, opts); + } + } + + setUserConfig(userConfig) { + if (!userConfig || userConfig.constructor.name !== "UserConfig") { + throw new Error( + "Internal error: Missing `userConfig` or was not an instance of `UserConfig`.", + ); + } + this.#userConfig = userConfig; + } + + addPaths(paths = []) { + for (let path of paths) { + this.#paths.add(TemplatePath.getDir(path)); + } + } + + get matchingGlobs() { + if (this.#dirty || !this.#matchingGlobsArray) { + this.#matchingGlobsArray = Array.from(this.#matchingGlobs); + this.#dirty = false; + } + + return this.#matchingGlobsArray; + } + + addMatchingGlob(glob) { + if (glob) { + if (Array.isArray(glob)) { + for (let g of glob) { + this.#matchingGlobs.add(g); + } + } else { + this.#matchingGlobs.add(glob); + } + this.#dirty = true; + } + } + + isSkippableHref(rawRef) { + if ( + this.#matchingGlobs.size === 0 || + !rawRef || + path.isAbsolute(rawRef) || + isValidUrl(rawRef) + ) { + return true; + } + return false; + } + + isCopyableTarget(target) { + if (!isGlobMatch(target, this.matchingGlobs)) { + return false; + } + + return true; + } + + exists(filePath) { + return this.#userConfig.exists(filePath); + } + + getAliasedPath(ref) { + for (let dir of this.#paths) { + let found = TemplatePath.join(dir, ref); + if (this.isCopyableTarget(found) && this.exists(found)) { + return found; + } + } + } + + getFilePathRelativeToProjectRoot(ref, contextFilePath) { + let dir = TemplatePath.getDirFromFilePath(contextFilePath); + return TemplatePath.join(dir, ref); + } + + copy(fileRef, tmplInputPath, tmplOutputPath) { + // original ref is a full URL or no globs exist + if (this.isSkippableHref(fileRef)) { + return; + } + + // Relative to source file’s input path + let source = this.getFilePathRelativeToProjectRoot(fileRef, tmplInputPath); + if (!this.isCopyableTarget(source)) { + return; + } + + if (!this.exists(source)) { + // Try to alias using `options.paths` + let alias = this.getAliasedPath(fileRef); + if (!alias) { + if (this.#failOnError) { + throw new Error( + "Missing input file for `html-relative` Passthrough Copy file: " + + TemplatePath.absolutePath(source), + ); + } + + // don’t fail on error + return; + } + + source = alias; + } + + let target = this.getFilePathRelativeToProjectRoot(fileRef, tmplOutputPath); + + // We use a Set here to allow passthrough copy manager to properly error on conflicts upstream + // Only errors when different inputs write to the same output + // Also errors if attempts to write outside the output folder. + this.#userConfig.emit("eleventy#copy", { + source, + target, + options: this.#copyOptions, + }); + } +} + +export { HtmlRelativeCopy }; diff --git a/node_modules/@11ty/eleventy/src/Util/HtmlTransformer.js b/node_modules/@11ty/eleventy/src/Util/HtmlTransformer.js new file mode 100644 index 0000000..f28910f --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/HtmlTransformer.js @@ -0,0 +1,172 @@ +import posthtml from "posthtml"; +import urls from "@11ty/posthtml-urls"; +import { FilePathUtil } from "./FilePathUtil.js"; + +import { arrayDelete } from "./ArrayUtil.js"; + +class HtmlTransformer { + // feature test for Eleventy Bundle Plugin + static SUPPORTS_PLUGINS_ENABLED_CALLBACK = true; + + static TYPES = ["callbacks", "plugins"]; + + constructor() { + // execution order is important (not order of addition/object key order) + this.callbacks = {}; + this.posthtmlProcessOptions = {}; + this.plugins = {}; + } + + get aggregateBench() { + if (!this.userConfig) { + throw new Error("Internal error: Missing `userConfig` in HtmlTransformer."); + } + return this.userConfig.benchmarkManager.get("Aggregate"); + } + + setUserConfig(config) { + this.userConfig = config; + } + + static prioritySort(a, b) { + if (b.priority > a.priority) { + return 1; + } + if (a.priority > b.priority) { + return -1; + } + return 0; + } + + // context is important as it is used in html base plugin for page specific URL + static _getPosthtmlInstance(callbacks = [], plugins = [], context = {}) { + let inst = posthtml(); + + // already sorted by priority when added + for (let { fn: plugin, options } of plugins) { + inst.use(plugin(Object.assign({}, context, options))); + } + + // Run the built-ins last + if (callbacks.length > 0) { + inst.use( + urls({ + eachURL: (url, attrName, tagName) => { + for (let { fn: callback } of callbacks) { + // already sorted by priority when added + url = callback.call(context, url, { attribute: attrName, tag: tagName }); + } + + return url; + }, + }), + ); + } + + return inst; + } + + _add(extensions, addType, value, options = {}) { + options = Object.assign( + { + priority: 0, + }, + options, + ); + + let extensionsArray = (extensions || "").split(","); + for (let ext of extensionsArray) { + let target = this[addType]; + if (!target[ext]) { + target[ext] = []; + } + + target[ext].push({ + // *could* fallback to function name, `value.name` + name: options.name, // for `remove` and debugging + fn: value, // callback or plugin + priority: options.priority, // sorted in descending order + enabled: options.enabled || (() => true), + options: options.pluginOptions, + }); + + target[ext].sort(HtmlTransformer.prioritySort); + } + } + + addPosthtmlPlugin(extensions, plugin, options = {}) { + this._add(extensions, "plugins", plugin, options); + } + + // match can be a plugin function or a filter callback(plugin => true); + remove(extensions, match) { + for (let removeType of HtmlTransformer.TYPES) { + for (let ext of (extensions || "").split(",")) { + this[removeType][ext] = arrayDelete(this[removeType][ext], match); + } + } + } + + addUrlTransform(extensions, callback, options = {}) { + this._add(extensions, "callbacks", callback, options); + } + + setPosthtmlProcessOptions(options) { + Object.assign(this.posthtmlProcessOptions, options); + } + + isTransformable(extension, context) { + return ( + this.getCallbacks(extension, context).length > 0 || this.getPlugins(extension).length > 0 + ); + } + + getCallbacks(extension, context) { + let callbacks = this.callbacks[extension] || []; + return callbacks.filter(({ enabled }) => { + if (!enabled || typeof enabled !== "function") { + return true; + } + return enabled(context); + }); + } + + getPlugins(extension) { + let plugins = this.plugins[extension] || []; + return plugins.filter(({ enabled }) => { + if (!enabled || typeof enabled !== "function") { + return true; + } + return enabled(); + }); + } + + static async transformStandalone(content, callback, posthtmlProcessOptions = {}) { + let posthtmlInstance = this._getPosthtmlInstance([ + { + fn: callback, + enabled: () => true, + }, + ]); + let result = await posthtmlInstance.process(content, posthtmlProcessOptions); + return result.html; + } + + async transformContent(outputPath, content, context) { + let extension = FilePathUtil.getFileExtension(outputPath); + if (!this.isTransformable(extension, context)) { + return content; + } + + let bench = this.aggregateBench.get(`Transforming \`${extension}\` with posthtml`); + bench.before(); + let callbacks = this.getCallbacks(extension, context); + let plugins = this.getPlugins(extension); + let posthtmlInstance = HtmlTransformer._getPosthtmlInstance(callbacks, plugins, context); + let result = await posthtmlInstance.process(content, this.posthtmlProcessOptions); + bench.after(); + return result.html; + } +} + +export { HtmlTransformer }; diff --git a/node_modules/@11ty/eleventy/src/Util/ImportJsonSync.js b/node_modules/@11ty/eleventy/src/Util/ImportJsonSync.js new file mode 100644 index 0000000..fa59365 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/ImportJsonSync.js @@ -0,0 +1,77 @@ +import fs from "node:fs"; +import { createRequire } from "node:module"; +import debugUtil from "debug"; + +import { TemplatePath } from "@11ty/eleventy-utils"; + +import { normalizeFilePathInEleventyPackage } from "./Require.js"; + +const debug = debugUtil("Eleventy:ImportJsonSync"); +const require = createRequire(import.meta.url); + +function findFilePathInParentDirs(dir, filename) { + // `package.json` searches look in parent dirs: + // https://docs.npmjs.com/cli/v7/configuring-npm/folders#more-information + // Fixes issue #3178, limited to working dir paths only + let workingDir = TemplatePath.getWorkingDir(); + // TODO use DirContains + let allDirs = TemplatePath.getAllDirs(dir).filter((entry) => entry.startsWith(workingDir)); + + for (let dir of allDirs) { + let newPath = TemplatePath.join(dir, filename); + if (fs.existsSync(newPath)) { + debug("Found %o searching parent directories at: %o", filename, dir); + return newPath; + } + } +} + +function importJsonSync(filePath) { + if (!filePath || !filePath.endsWith(".json")) { + throw new Error(`importJsonSync expects a .json file extension (received: ${filePath})`); + } + + return require(filePath); +} + +function getEleventyPackageJson() { + let filePath = normalizeFilePathInEleventyPackage("package.json"); + return importJsonSync(filePath); +} + +function getModulePackageJson(dir) { + let filePath = findFilePathInParentDirs(TemplatePath.absolutePath(dir), "package.json"); + + // optional! + if (!filePath) { + return {}; + } + + return importJsonSync(filePath); +} + +// This will *not* find a package.json in a parent directory above root +function getWorkingProjectPackageJsonPath() { + let dir = TemplatePath.absolutePath(TemplatePath.getWorkingDir()); + return findFilePathInParentDirs(dir, "package.json"); +} + +function getWorkingProjectPackageJson() { + let filePath = getWorkingProjectPackageJsonPath(); + + // optional! + if (!filePath) { + return {}; + } + + return importJsonSync(filePath); +} + +export { + importJsonSync, + findFilePathInParentDirs, + getEleventyPackageJson, + getModulePackageJson, + getWorkingProjectPackageJson, + getWorkingProjectPackageJsonPath, +}; diff --git a/node_modules/@11ty/eleventy/src/Util/IsAsyncFunction.js b/node_modules/@11ty/eleventy/src/Util/IsAsyncFunction.js new file mode 100644 index 0000000..3c4dc65 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/IsAsyncFunction.js @@ -0,0 +1,5 @@ +const ComparisonAsyncFunction = (async () => {}).constructor; + +export default function isAsyncFunction(fn) { + return fn instanceof ComparisonAsyncFunction; +} diff --git a/node_modules/@11ty/eleventy/src/Util/JavaScriptDependencies.js b/node_modules/@11ty/eleventy/src/Util/JavaScriptDependencies.js new file mode 100644 index 0000000..7f6e809 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/JavaScriptDependencies.js @@ -0,0 +1,55 @@ +import dependencyTree from "@11ty/dependency-tree"; +import { find } from "@11ty/dependency-tree-esm"; +import { TemplatePath } from "@11ty/eleventy-utils"; + +import EleventyBaseError from "../Errors/EleventyBaseError.js"; + +class JavaScriptDependencies { + static getErrorMessage(file, type) { + return `A problem was encountered looking for JavaScript dependencies in ${type} file: ${file}. This only affects --watch and --serve behavior and does not affect your build.`; + } + + static async getDependencies(inputFiles, isProjectUsingEsm) { + let depSet = new Set(); + + // TODO does this need to work with aliasing? what other JS extensions will have deps? + let commonJsFiles = inputFiles.filter( + (file) => (!isProjectUsingEsm && file.endsWith(".js")) || file.endsWith(".cjs"), + ); + + for (let file of commonJsFiles) { + try { + let modules = dependencyTree(file, { + nodeModuleNames: "exclude", + allowNotFound: true, + }).map((dependency) => { + return TemplatePath.addLeadingDotSlash(TemplatePath.relativePath(dependency)); + }); + + for (let dep of modules) { + depSet.add(dep); + } + } catch (e) { + throw new EleventyBaseError(this.getErrorMessage(file, "CommonJS"), e); + } + } + + let esmFiles = inputFiles.filter( + (file) => (isProjectUsingEsm && file.endsWith(".js")) || file.endsWith(".mjs"), + ); + for (let file of esmFiles) { + try { + let modules = await find(file); + for (let dep of modules) { + depSet.add(dep); + } + } catch (e) { + throw new EleventyBaseError(this.getErrorMessage(file, "ESM"), e); + } + } + + return Array.from(depSet).sort(); + } +} + +export default JavaScriptDependencies; diff --git a/node_modules/@11ty/eleventy/src/Util/MemoizeFunction.js b/node_modules/@11ty/eleventy/src/Util/MemoizeFunction.js new file mode 100644 index 0000000..f66a155 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/MemoizeFunction.js @@ -0,0 +1,26 @@ +export default function (callback, options = {}) { + let { bench, name } = options; + let cache = new Map(); + + return (...args) => { + // Only supports single-arg functions for now. + if (args.filter(Boolean).length > 1) { + bench?.get(`(count) ${name} Not valid for memoize`).incrementCount(); + return callback(...args); + } + + let [cacheKey] = args; + + if (!cache.has(cacheKey)) { + cache.set(cacheKey, callback(...args)); + + bench?.get(`(count) ${name} memoize miss`).incrementCount(); + + return cache.get(cacheKey); + } + + bench?.get(`(count) ${name} memoize hit`).incrementCount(); + + return cache.get(cacheKey); + }; +} diff --git a/node_modules/@11ty/eleventy/src/Util/Objects/DeepFreeze.js b/node_modules/@11ty/eleventy/src/Util/Objects/DeepFreeze.js new file mode 100644 index 0000000..88e2847 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/Objects/DeepFreeze.js @@ -0,0 +1,20 @@ +import { isPlainObject } from "@11ty/eleventy-utils"; + +// via https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze + +function DeepFreeze(obj, topLevelExceptions) { + for (let name of Reflect.ownKeys(obj)) { + if ((topLevelExceptions || []).find((key) => key === name)) { + continue; + } + + const value = obj[name]; + if (isPlainObject(value)) { + DeepFreeze(value); + } + } + + return Object.freeze(obj); +} + +export { DeepFreeze }; diff --git a/node_modules/@11ty/eleventy/src/Util/Objects/ObjectFilter.js b/node_modules/@11ty/eleventy/src/Util/Objects/ObjectFilter.js new file mode 100644 index 0000000..9ce8737 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/Objects/ObjectFilter.js @@ -0,0 +1,9 @@ +export default function objectFilter(obj, callback) { + let newObject = {}; + for (let [key, value] of Object.entries(obj || {})) { + if (callback(value, key)) { + newObject[key] = value; + } + } + return newObject; +} diff --git a/node_modules/@11ty/eleventy/src/Util/Objects/ProxyWrap.js b/node_modules/@11ty/eleventy/src/Util/Objects/ProxyWrap.js new file mode 100644 index 0000000..38730fd --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/Objects/ProxyWrap.js @@ -0,0 +1,118 @@ +import types from "node:util/types"; +import debugUtil from "debug"; +import { isPlainObject } from "@11ty/eleventy-utils"; + +const debug = debugUtil("Dev:Eleventy:Proxy"); + +function wrapObject(target, fallback) { + if (Object.isFrozen(target)) { + return target; + } + + return new Proxy(target, { + getOwnPropertyDescriptor(target, prop) { + let ret; + + if (Reflect.has(target, prop)) { + ret = Reflect.getOwnPropertyDescriptor(target, prop); + } else if (Reflect.has(fallback, prop)) { + ret = Reflect.getOwnPropertyDescriptor(fallback, prop); + } + + return ret; + }, + has(target, prop) { + if (Reflect.has(target, prop)) { + return true; + } + + return Reflect.has(fallback, prop); + }, + ownKeys(target) { + let s = new Set(); + // The fallback keys need to come first to preserve proper key order + // https://github.com/11ty/eleventy/issues/3849 + if (isPlainObject(fallback)) { + for (let k of Reflect.ownKeys(fallback)) { + s.add(k); + } + } + for (let k of Reflect.ownKeys(target)) { + if (!s.has(k)) { + s.add(k); + } + } + return Array.from(s); + }, + get(target, prop) { + debug("handler:get", prop); + + let value = Reflect.get(target, prop); + + if (Reflect.has(target, prop)) { + // Already proxied + if (types.isProxy(value)) { + return value; + } + + if (isPlainObject(value) && Reflect.has(fallback, prop)) { + if (Object.isFrozen(value)) { + return value; + } + + let ret = wrapObject(value, Reflect.get(fallback, prop)); + debug("handler:get (primary, object)", prop); + return ret; + } + + debug("handler:get (primary)", prop); + return value; + } + + // Does not exist in primary + if ( + (typeof fallback === "object" || typeof fallback === "function") && + Reflect.has(fallback, prop) + ) { + // fallback has prop + let fallbackValue = Reflect.get(fallback, prop); + + if (isPlainObject(fallbackValue)) { + if (Object.isFrozen(fallbackValue)) { + return fallbackValue; + } + + debug("handler:get (fallback, object)", prop); + // set empty object on primary + let emptyObject = {}; + Reflect.set(target, prop, emptyObject); + + return wrapObject(emptyObject, fallbackValue); + } + + debug("handler:get (fallback)", prop); + return fallbackValue; + } + + // primary *and* fallback do _not_ have prop + debug("handler:get (not on primary or fallback)", prop); + + return value; + }, + set(target, prop, value) { + debug("handler:set", prop); + + return Reflect.set(target, prop, value); + }, + }); +} + +function ProxyWrap(target, fallback) { + if (!isPlainObject(target) || !isPlainObject(fallback)) { + throw new Error("ProxyWrap expects objects for both the target and fallback"); + } + + return wrapObject(target, fallback); +} + +export { ProxyWrap }; diff --git a/node_modules/@11ty/eleventy/src/Util/Objects/SampleModule.mjs b/node_modules/@11ty/eleventy/src/Util/Objects/SampleModule.mjs new file mode 100644 index 0000000..ff8b4c5 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/Objects/SampleModule.mjs @@ -0,0 +1 @@ +export default {}; diff --git a/node_modules/@11ty/eleventy/src/Util/Objects/Sortable.js b/node_modules/@11ty/eleventy/src/Util/Objects/Sortable.js new file mode 100644 index 0000000..a23d4c9 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/Objects/Sortable.js @@ -0,0 +1,136 @@ +class Sortable { + constructor() { + this.isSortAscending = true; + this.isSortNumeric = false; + this.items = []; + this._dirty = true; + + this.sortFunctionStringMap = { + "A-Z": "sortFunctionAscending", + "Z-A": "sortFunctionDescending", + "0-9": "sortFunctionNumericAscending", + "9-0": "sortFunctionNumericDescending", + }; + } + + get length() { + return this.items.length; + } + + add(item) { + this._dirty = true; + this.items.push(item); + } + + sort(sortFunction) { + if (!sortFunction) { + sortFunction = this.getSortFunction(); + } else if (typeof sortFunction === "string") { + let key = sortFunction; + let name; + if (key in this.sortFunctionStringMap) { + name = this.sortFunctionStringMap[key]; + } + if (Sortable[name]) { + sortFunction = Sortable[name]; + } else { + throw new Error( + `Invalid String argument for sort(). Received \`${key}\`. Valid values: ${Object.keys( + this.sortFunctionStringMap, + )}`, + ); + } + } + + return this.items.slice().sort(sortFunction); + } + + sortAscending() { + return this.sort(this.getSortFunctionAscending()); + } + + sortDescending() { + return this.sort(this.getSortFunctionDescending()); + } + + setSortDescending(isDescending = true) { + this.isSortAscending = !isDescending; + } + + setSortAscending(isAscending = true) { + this.isSortAscending = isAscending; + } + + setSortNumeric(isNumeric) { + this.isSortNumeric = isNumeric; + } + + /* Sort functions */ + static sortFunctionNumericAscending(a, b) { + return a - b; + } + + static sortFunctionNumericDescending(a, b) { + return b - a; + } + + static sortFunctionAscending(a, b) { + if (a > b) { + return 1; + } else if (a < b) { + return -1; + } + return 0; + } + + static sortFunctionDescending(a, b) { + return Sortable.sortFunctionAscending(b, a); + } + + static sortFunctionAlphabeticAscending(a, b) { + return Sortable.sortFunctionAscending(a, b); + } + + static sortFunctionAlphabeticDescending(a, b) { + return Sortable.sortFunctionAscending(b, a); + } + + static sortFunctionDate(mapA, mapB) { + return Sortable.sortFunctionNumericAscending(mapA.date.getTime(), mapB.date.getTime()); + } + + static sortFunctionDateInputPath(mapA, mapB) { + let sortDate = Sortable.sortFunctionNumericAscending(mapA.date.getTime(), mapB.date.getTime()); + if (sortDate === 0) { + return Sortable.sortFunctionAlphabeticAscending(mapA.inputPath, mapB.inputPath); + } + return sortDate; + } + /* End sort functions */ + + getSortFunction() { + if (this.isSortAscending) { + return this.getSortFunctionAscending(); + } else { + return this.getSortFunctionDescending(); + } + } + + getSortFunctionAscending() { + if (this.isSortNumeric) { + return Sortable.sortFunctionNumericAscending; + } else { + return Sortable.sortFunctionAlphabeticAscending; + } + } + + getSortFunctionDescending() { + if (this.isSortNumeric) { + return Sortable.sortFunctionNumericDescending; + } else { + return Sortable.sortFunctionAlphabeticDescending; + } + } +} + +export default Sortable; diff --git a/node_modules/@11ty/eleventy/src/Util/Objects/Unique.js b/node_modules/@11ty/eleventy/src/Util/Objects/Unique.js new file mode 100644 index 0000000..8570c0c --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/Objects/Unique.js @@ -0,0 +1,3 @@ +export default function Unique(arr) { + return Array.from(new Set(arr)); +} diff --git a/node_modules/@11ty/eleventy/src/Util/PassthroughCopyBehaviorCheck.js b/node_modules/@11ty/eleventy/src/Util/PassthroughCopyBehaviorCheck.js new file mode 100644 index 0000000..3dc1abb --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/PassthroughCopyBehaviorCheck.js @@ -0,0 +1,16 @@ +function isUsingEleventyDevServer(config) { + return ( + !config.serverOptions.module || config.serverOptions.module === "@11ty/eleventy-dev-server" + ); +} + +// Config opt-out via serverPassthroughCopyBehavior +// False when other server is used +// False when runMode is "build" or "watch" +export default function (config, runMode) { + return ( + config.serverPassthroughCopyBehavior === "passthrough" && + isUsingEleventyDevServer(config) && + runMode === "serve" + ); +} diff --git a/node_modules/@11ty/eleventy/src/Util/PathNormalizer.js b/node_modules/@11ty/eleventy/src/Util/PathNormalizer.js new file mode 100644 index 0000000..cdc3253 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/PathNormalizer.js @@ -0,0 +1,58 @@ +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { TemplatePath } from "@11ty/eleventy-utils"; + +export default class PathNormalizer { + static getParts(inputPath) { + if (!inputPath) { + return []; + } + + let separator = "/"; + if (inputPath.includes(path.sep)) { + separator = path.sep; + } + + return inputPath.split(separator).filter((entry) => entry !== "."); + } + + // order is important here: the top-most directory returns first + // array of file and all parent directories + static getAllPaths(inputPath) { + let parts = this.getParts(inputPath); + let allPaths = []; + + let fullpath = ""; + for (let part of parts) { + fullpath += (fullpath.length > 0 ? "/" : "") + part; + allPaths.push(fullpath); + } + + return allPaths; + } + + static normalizeSeperator(inputPath) { + if (!inputPath) { + return inputPath; + } + return inputPath.split(path.sep).join("/"); + } + + static fullNormalization(inputPath) { + if (typeof inputPath !== "string") { + return inputPath; + } + + // Fix file:///Users/ or file:///C:/ paths passed in + if (inputPath.startsWith("file://")) { + inputPath = fileURLToPath(inputPath); + } + + // Paths should not be absolute (we convert absolute paths to relative) + // Paths should not have a leading dot slash + // Paths should always be `/` independent of OS path separator + return TemplatePath.stripLeadingDotSlash( + this.normalizeSeperator(TemplatePath.relativePath(inputPath)), + ); + } +} diff --git a/node_modules/@11ty/eleventy/src/Util/PathPrefixer.js b/node_modules/@11ty/eleventy/src/Util/PathPrefixer.js new file mode 100644 index 0000000..abd5582 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/PathPrefixer.js @@ -0,0 +1,21 @@ +import path from "node:path"; + +import PathNormalizer from "./PathNormalizer.js"; + +class PathPrefixer { + static normalizePathPrefix(pathPrefix) { + if (pathPrefix) { + // add leading / (for browsersync), see #1454 + // path.join uses \\ for Windows so we split and rejoin + return PathPrefixer.joinUrlParts("/", pathPrefix); + } + + return "/"; + } + + static joinUrlParts(...parts) { + return PathNormalizer.normalizeSeperator(path.join(...parts)); + } +} + +export default PathPrefixer; diff --git a/node_modules/@11ty/eleventy/src/Util/Pluralize.js b/node_modules/@11ty/eleventy/src/Util/Pluralize.js new file mode 100644 index 0000000..d35f1dd --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/Pluralize.js @@ -0,0 +1,3 @@ +export default function (count, singleWord, pluralWord) { + return count === 1 ? singleWord : pluralWord; +} diff --git a/node_modules/@11ty/eleventy/src/Util/ProjectDirectories.js b/node_modules/@11ty/eleventy/src/Util/ProjectDirectories.js new file mode 100644 index 0000000..e15e985 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/ProjectDirectories.js @@ -0,0 +1,369 @@ +import fs from "node:fs"; +import path from "node:path"; +import { TemplatePath } from "@11ty/eleventy-utils"; +import { isDynamicPattern } from "tinyglobby"; + +import DirContains from "./DirContains.js"; + +/* Directories internally should always use *nix forward slashes */ +class ProjectDirectories { + static defaults = { + input: "./", + data: "./_data/", // Relative to input directory + includes: "./_includes/", // Relative to input directory + layouts: "./_layouts/", // Relative to input directory + output: "./_site/", + }; + + // no updates allowed, input/output set via CLI + #frozen = false; + + #raw = {}; + + #dirs = {}; + + inputFile = undefined; + inputGlob = undefined; + + // Add leading dot slash + // Use forward slashes + static normalizePath(fileOrDir) { + return TemplatePath.standardizeFilePath(fileOrDir); + } + + // Must be a directory + // Always include a trailing slash + static normalizeDirectory(dir) { + return this.addTrailingSlash(this.normalizePath(dir)); + } + + normalizeDirectoryPathRelativeToInputDirectory(filePath) { + return ProjectDirectories.normalizeDirectory(path.join(this.input, filePath)); + } + + static addTrailingSlash(path) { + if (path.slice(-1) === "/") { + return path; + } + return path + "/"; + } + + // If input/output are set via CLI, they take precedence over all other configuration values. + freeze() { + this.#frozen = true; + } + + setViaConfigObject(configDirs = {}) { + // input must come last + let inputChanged = false; + if ( + configDirs.input && + ProjectDirectories.normalizeDirectory(configDirs.input) !== this.input + ) { + this.#setInputRaw(configDirs.input); + inputChanged = true; + } + + // If falsy or an empty string, the current directory is used. + if (configDirs.output !== undefined) { + if (ProjectDirectories.normalizeDirectory(configDirs.output) !== this.output) { + this.setOutput(configDirs.output); + } + } + + // Input relative directory, if falsy or an empty string, inputDir is used! + // Always set if input changed, e.g. input is `src` and data is `../_data` (resulting in `./_data`) we still want to set data to this new value + if (configDirs.data !== undefined) { + if ( + inputChanged || + this.normalizeDirectoryPathRelativeToInputDirectory(configDirs.data || "") !== this.data + ) { + this.setData(configDirs.data); + } + } + + // Input relative directory, if falsy or an empty string, inputDir is used! + if (configDirs.includes !== undefined) { + if ( + inputChanged || + this.normalizeDirectoryPathRelativeToInputDirectory(configDirs.includes || "") !== + this.includes + ) { + this.setIncludes(configDirs.includes); + } + } + + // Input relative directory, if falsy or an empty string, inputDir is used! + if (configDirs.layouts !== undefined) { + if ( + inputChanged || + this.normalizeDirectoryPathRelativeToInputDirectory(configDirs.layouts || "") !== + this.layouts + ) { + this.setLayouts(configDirs.layouts); + } + } + + if (inputChanged) { + this.updateInputDependencies(); + } + } + + updateInputDependencies() { + // raw first, fall back to Eleventy defaults if not yet set + this.setData(this.#raw.data ?? ProjectDirectories.defaults.data); + this.setIncludes(this.#raw.includes ?? ProjectDirectories.defaults.includes); + + // Should not include this if not explicitly opted-in + if (this.#raw.layouts !== undefined) { + this.setLayouts(this.#raw.layouts ?? ProjectDirectories.defaults.layouts); + } + } + + /* Relative to project root, must exist */ + #setInputRaw(dirOrFile, inputDir = undefined) { + // is frozen and was defined previously + if (this.#frozen && this.#raw.input !== undefined) { + return; + } + + this.#raw.input = dirOrFile; + + if (!dirOrFile) { + // input must exist if inputDir is not set. + return; + } + + // Normalize absolute paths to relative, #3805 + // if(path.isAbsolute(dirOrFile)) { + // dirOrFile = path.relative(".", dirOrFile); + // } + + // Input has to exist (assumed glob if it does not exist) + let inputExists = fs.existsSync(dirOrFile); + let inputExistsAndIsDirectory = inputExists && fs.statSync(dirOrFile).isDirectory(); + + if (inputExistsAndIsDirectory) { + // is not a file or glob + this.#dirs.input = ProjectDirectories.normalizeDirectory(dirOrFile); + } else { + if (inputExists) { + this.inputFile = ProjectDirectories.normalizePath(dirOrFile); + } else { + if (!isDynamicPattern(dirOrFile)) { + throw new Error( + `The "${dirOrFile}" \`input\` parameter (directory or file path) must exist on the file system (unless detected as a glob by the \`tinyglobby\` package)`, + ); + } + + this.inputGlob = dirOrFile; + } + + // Explicit Eleventy option for inputDir + if (inputDir) { + // Changed in 3.0: must exist + if (!fs.existsSync(inputDir)) { + throw new Error("Directory must exist (via inputDir option to Eleventy constructor)."); + } + + this.#dirs.input = ProjectDirectories.normalizeDirectory(inputDir); + } else { + // the input directory is implied to be the parent directory of the + // file, unless inputDir is explicitly specified (via Eleventy constructor `options`) + this.#dirs.input = ProjectDirectories.normalizeDirectory( + TemplatePath.getDirFromFilePath(dirOrFile), // works with globs + ); + } + } + } + + setInput(dirOrFile, inputDir = undefined) { + this.#setInputRaw(dirOrFile, inputDir); // does not update + this.updateInputDependencies(); + } + + /* Relative to input dir */ + setIncludes(dir) { + if (dir !== undefined) { + // falsy or an empty string is valid (falls back to input dir) + this.#raw.includes = dir; + this.#dirs.includes = ProjectDirectories.normalizeDirectory( + TemplatePath.join(this.input, dir || ""), + ); + } + } + + /* Relative to input dir */ + /* Optional */ + setLayouts(dir) { + if (dir !== undefined) { + // falsy or an empty string is valid (falls back to input dir) + this.#raw.layouts = dir; + this.#dirs.layouts = ProjectDirectories.normalizeDirectory( + TemplatePath.join(this.input, dir || ""), + ); + } + } + + /* Relative to input dir */ + setData(dir) { + if (dir !== undefined) { + // falsy or an empty string is valid (falls back to input dir) + // TODO must exist if specified + this.#raw.data = dir; + this.#dirs.data = ProjectDirectories.normalizeDirectory( + TemplatePath.join(this.input, dir || ""), + ); + } + } + + /* Relative to project root */ + setOutput(dir) { + // is frozen and was defined previously + if (this.#frozen && this.#raw.output !== undefined) { + return; + } + + if (dir !== undefined) { + this.#raw.output = dir; + this.#dirs.output = ProjectDirectories.normalizeDirectory(dir || ""); + } + } + + get input() { + return this.#dirs.input || ProjectDirectories.defaults.input; + } + + get data() { + return this.#dirs.data || ProjectDirectories.defaults.data; + } + + get includes() { + return this.#dirs.includes || ProjectDirectories.defaults.includes; + } + + get layouts() { + // explicit opt-in, no fallback. + return this.#dirs.layouts; + } + + get output() { + return this.#dirs.output || ProjectDirectories.defaults.output; + } + + isTemplateFile(filePath) { + let inputPath = this.getInputPath(filePath); + // TODO use DirContains + if (this.layouts && inputPath.startsWith(this.layouts)) { + return false; + } + + // if this.includes is "" (and thus is the same directory as this.input) + // we don’t actually know if this is a template file, so defer + if (this.includes && this.includes !== this.input) { + if (inputPath.startsWith(this.includes)) { + return false; + } + } + + // TODO use DirContains + return inputPath.startsWith(this.input); + } + + // for a hypothetical template file + getInputPath(filePathRelativeToInputDir) { + // TODO change ~/ to project root dir + return TemplatePath.addLeadingDotSlash( + TemplatePath.join(this.input, TemplatePath.standardizeFilePath(filePathRelativeToInputDir)), + ); + } + + // Inverse of getInputPath + // Removes input dir from path + getInputPathRelativeToInputDirectory(filePathRelativeToInputDir) { + let inputDir = TemplatePath.addLeadingDotSlash(TemplatePath.join(this.input)); + + // No leading dot slash + return TemplatePath.stripLeadingSubPath(filePathRelativeToInputDir, inputDir); + } + + // for a hypothetical Eleventy layout file + getLayoutPath(filePathRelativeToLayoutDir) { + return TemplatePath.addLeadingDotSlash( + TemplatePath.join( + this.layouts || this.includes, + TemplatePath.standardizeFilePath(filePathRelativeToLayoutDir), + ), + ); + } + + // Removes layout dir from path + getLayoutPathRelativeToInputDirectory(filePathRelativeToLayoutDir) { + let layoutPath = this.getLayoutPath(filePathRelativeToLayoutDir); + let inputDir = TemplatePath.addLeadingDotSlash(TemplatePath.join(this.input)); + + // No leading dot slash + return TemplatePath.stripLeadingSubPath(layoutPath, inputDir); + } + + getProjectPath(filePath) { + return TemplatePath.addLeadingDotSlash( + TemplatePath.join(".", TemplatePath.standardizeFilePath(filePath)), + ); + } + + isFileInProjectFolder(filePath) { + return DirContains(TemplatePath.getWorkingDir(), filePath); + } + + isFileInOutputFolder(filePath) { + return DirContains(this.output, filePath); + } + + static getRelativeTo(targetPath, cwd) { + return path.relative(cwd, path.join(path.resolve("."), targetPath)); + } + + // Access the data without being able to set the data. + getUserspaceInstance() { + let d = this; + + return { + get input() { + return d.input; + }, + get inputFile() { + return d.inputFile; + }, + get inputGlob() { + return d.inputGlob; + }, + get data() { + return d.data; + }, + get includes() { + return d.includes; + }, + get layouts() { + return d.layouts; + }, + get output() { + return d.output; + }, + }; + } + + toString() { + return { + input: this.input, + inputFile: this.inputFile, + inputGlob: this.inputGlob, + data: this.data, + includes: this.includes, + layouts: this.layouts, + output: this.output, + }; + } +} + +export default ProjectDirectories; diff --git a/node_modules/@11ty/eleventy/src/Util/ProjectTemplateFormats.js b/node_modules/@11ty/eleventy/src/Util/ProjectTemplateFormats.js new file mode 100644 index 0000000..f37040e --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/ProjectTemplateFormats.js @@ -0,0 +1,134 @@ +import debugUtil from "debug"; +const debug = debugUtil("Eleventy:Util:ProjectTemplateFormats"); + +class ProjectTemplateFormats { + #useAll = {}; + #raw = {}; + + #values = {}; // Set objects + + static union(...sets) { + let s = new Set(); + + for (let set of sets) { + if (!set || typeof set[Symbol.iterator] !== "function") { + continue; + } + for (let v of set) { + s.add(v); + } + } + + return s; + } + + #normalize(formats) { + if (Array.isArray(formats)) { + formats = "" + formats.join(","); + } + + if (typeof formats !== "string") { + throw new Error( + `Invalid formats (expect String, Array) passed to ProjectTemplateFormats->normalize: ${formats}`, + ); + } + + let final = new Set(); + for (let format of formats.split(",")) { + format = format.trim(); + if (format && format !== "*") { + final.add(format); + } + } + + return final; + } + + isWildcard() { + return this.#useAll.cli || this.#useAll.config || false; + } + + /** @returns {boolean} */ + #isUseAll(rawFormats) { + if (rawFormats === "") { + return false; + } + + if (typeof rawFormats === "string") { + rawFormats = rawFormats.split(","); + } + + if (Array.isArray(rawFormats)) { + return rawFormats.find((entry) => entry === "*") !== undefined; + } + + return false; + } + + // 3.x Breaking: "" now means no formats. In 2.x and prior it meant "*" + setViaCommandLine(formats) { + if (formats === undefined) { + return; + } + + this.#useAll.cli = this.#isUseAll(formats); + this.#raw.cli = formats; + this.#values.cli = this.#normalize(formats); + } + + // 3.x Breaking: "" now means no formats—in 2.x and prior it meant "*" + // 3.x Adds support for comma separated string—in 2.x this required an Array + setViaConfig(formats) { + if (formats === undefined) { + return; + } + + // "*" is supported + this.#useAll.config = this.#isUseAll(formats); + this.#raw.config = formats; + this.#values.config = this.#normalize(formats); + } + + addViaConfig(formats) { + if (!formats) { + return; + } + + if (this.#isUseAll(formats)) { + throw new Error( + `\`addTemplateFormats("*")\` is not supported for project template syntaxes.`, + ); + } + + // "*" not supported here + this.#raw.configAdd = formats; + this.#values.configAdd = this.#normalize(formats); + } + + getAllTemplateFormats() { + return Array.from(ProjectTemplateFormats.union(this.#values.config, this.#values.configAdd)); + } + + getTemplateFormats() { + if (this.#useAll.cli) { + let v = this.getAllTemplateFormats(); + debug("Using CLI --formats='*': %o", v); + return v; + } + + if (this.#raw.cli !== undefined) { + let v = Array.from(this.#values.cli); + debug("Using CLI --formats: %o", v); + return v; + } + + let v = this.getAllTemplateFormats(); + debug( + "Using configuration `templateFormats`, `setTemplateFormats()`, `addTemplateFormats()`: %o", + v, + ); + return v; + } +} + +export default ProjectTemplateFormats; diff --git a/node_modules/@11ty/eleventy/src/Util/PromiseUtil.js b/node_modules/@11ty/eleventy/src/Util/PromiseUtil.js new file mode 100644 index 0000000..fa88da0 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/PromiseUtil.js @@ -0,0 +1,15 @@ +function withResolvers() { + if ("withResolvers" in Promise) { + return Promise.withResolvers(); + } + + let resolve; + let reject; + let promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { promise, resolve, reject }; +} + +export { withResolvers }; diff --git a/node_modules/@11ty/eleventy/src/Util/Require.js b/node_modules/@11ty/eleventy/src/Util/Require.js new file mode 100644 index 0000000..5f6412d --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/Require.js @@ -0,0 +1,258 @@ +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import module from "node:module"; +import { MessageChannel } from "node:worker_threads"; + +import { TemplatePath } from "@11ty/eleventy-utils"; + +import EleventyBaseError from "../Errors/EleventyBaseError.js"; +import eventBus from "../EventBus.js"; + +class EleventyImportError extends EleventyBaseError {} + +const { port1, port2 } = new MessageChannel(); + +// ESM Cache Buster is an enhancement that works in Node 18.19+ +// https://nodejs.org/docs/latest/api/module.html#moduleregisterspecifier-parenturl-options +// Fixes https://github.com/11ty/eleventy/issues/3270 +// ENV variable for https://github.com/11ty/eleventy/issues/3371 +if ("register" in module && !process?.env?.ELEVENTY_SKIP_ESM_RESOLVER) { + module.register("./EsmResolver.js", import.meta.url, { + parentURL: import.meta.url, + data: { + port: port2, + }, + transferList: [port2], + }); +} + +// important to clear the require.cache in CJS projects +const require = module.createRequire(import.meta.url); + +const requestPromiseCache = new Map(); + +function getImportErrorMessage(filePath, type) { + return `There was a problem importing '${path.relative(".", filePath)}' via ${type}`; +} + +// Used for JSON imports, suffering from Node warning that import assertions experimental but also +// throwing an error if you try to import() a JSON file without an import assertion. +/** + * + * @returns {string|undefined} + */ +function loadContents(path, options = {}) { + let rawInput; + /** @type {string} */ + let encoding = "utf8"; // JSON is utf8 + if (options?.encoding || options?.encoding === null) { + encoding = options.encoding; + } + + try { + // @ts-expect-error This is an error in the upstream types + rawInput = fs.readFileSync(path, encoding); + } catch (error) { + // @ts-expect-error Temporary + if (error?.code === "ENOENT") { + // if file does not exist, return nothing + return; + } + + throw error; + } + + // Can return a buffer, string, etc + if (typeof rawInput === "string") { + rawInput = rawInput.trim(); + } + + return rawInput; +} + +let lastModifiedPaths = new Map(); +eventBus.on("eleventy.importCacheReset", (fileQueue) => { + for (let filePath of fileQueue) { + let absolutePath = TemplatePath.absolutePath(filePath); + let newDate = Date.now(); + lastModifiedPaths.set(absolutePath, newDate); + + // post to EsmResolver worker thread + if (port1) { + port1.postMessage({ path: absolutePath, newDate }); + } + + // ESM Eleventy when using `import()` on a CJS project file still adds to require.cache + if (absolutePath in (require?.cache || {})) { + delete require.cache[absolutePath]; + } + } +}); + +// raw means we don’t normalize away the `default` export +async function dynamicImportAbsolutePath(absolutePath, options = {}) { + let { type, returnRaw, cacheBust } = Object.assign( + { + type: undefined, + returnRaw: false, + cacheBust: false, // force cache bust + }, + options, + ); + + // Short circuit for JSON files (that are optional and can be empty) + if (absolutePath.endsWith(".json") || type === "json") { + try { + // https://v8.dev/features/import-assertions#dynamic-import() is still experimental in Node 20 + let rawInput = loadContents(absolutePath); + if (!rawInput) { + // should not error when file exists but is _empty_ + return; + } + return JSON.parse(rawInput); + } catch (e) { + return Promise.reject( + new EleventyImportError(getImportErrorMessage(absolutePath, "fs.readFile(json)"), e), + ); + } + } + + // Removed a `require` short circuit from this piece originally added + // in https://github.com/11ty/eleventy/pull/3493 Was a bit faster but + // error messaging was worse for require(esm) + + let urlPath; + try { + let u = new URL(`file:${absolutePath}`); + + // Bust the import cache if this is the last modified file (or cache busting is forced) + if (cacheBust) { + lastModifiedPaths.set(absolutePath, Date.now()); + } + + if (cacheBust || lastModifiedPaths.has(absolutePath)) { + u.searchParams.set("_cache_bust", lastModifiedPaths.get(absolutePath)); + } + + urlPath = u.toString(); + } catch (e) { + urlPath = absolutePath; + } + + let promise; + if (requestPromiseCache.has(urlPath)) { + promise = requestPromiseCache.get(urlPath); + } else { + promise = import(urlPath); + requestPromiseCache.set(urlPath, promise); + } + + return promise.then( + (target) => { + if (returnRaw) { + return target; + } + + // If the only export is `default`, elevate to top (for ESM and CJS) + if (Object.keys(target).length === 1 && "default" in target) { + return target.default; + } + + // When using import() on a CommonJS file that exports an object sometimes it + // returns duplicated values in `default` key, e.g. `{ default: {key: value}, key: value }` + + // A few examples: + // module.exports = { key: false }; + // returns `{ default: {key: false}, key: false }` as not expected. + // module.exports = { key: true }; + // module.exports = { key: null }; + // module.exports = { key: undefined }; + // module.exports = { key: class {} }; + + // A few examples where it does not duplicate: + // module.exports = { key: 1 }; + // returns `{ default: {key: 1} }` as expected. + // module.exports = { key: "value" }; + // module.exports = { key: {} }; + // module.exports = { key: [] }; + + if (type === "cjs" && "default" in target) { + let match = true; + for (let key in target) { + if (key === "default") { + continue; + } + if (key === "module.exports") { + continue; + } + if (target[key] !== target.default[key]) { + match = false; + } + } + + if (match) { + return target.default; + } + } + + // Otherwise return { default: value, named: value } + // Object.assign here so we can add things to it in JavaScript.js + return Object.assign({}, target); + }, + (error) => { + return Promise.reject( + new EleventyImportError(getImportErrorMessage(absolutePath, `import(${type})`), error), + ); + }, + ); +} + +function normalizeFilePathInEleventyPackage(file) { + // Back up relative paths from ./src/Util/Require.js + return path.resolve(fileURLToPath(import.meta.url), "../../../", file); +} + +async function dynamicImportFromEleventyPackage(file) { + // points to files relative to the top level Eleventy directory + let filePath = normalizeFilePathInEleventyPackage(file); + + // Returns promise + return dynamicImportAbsolutePath(filePath, { type: "esm" }); +} + +async function dynamicImport(localPath, type, options = {}) { + let absolutePath = TemplatePath.absolutePath(localPath); + options.type = type; + + // Returns promise + return dynamicImportAbsolutePath(absolutePath, options); +} + +/* Used to import default Eleventy configuration file, raw means we don’t normalize away the `default` export */ +async function dynamicImportRawFromEleventyPackage(file) { + // points to files relative to the top level Eleventy directory + let filePath = normalizeFilePathInEleventyPackage(file); + + // Returns promise + return dynamicImportAbsolutePath(filePath, { type: "esm", returnRaw: true }); +} + +/* Used to import app configuration files, raw means we don’t normalize away the `default` export */ +async function dynamicImportRaw(localPath, type) { + let absolutePath = TemplatePath.absolutePath(localPath); + + // Returns promise + return dynamicImportAbsolutePath(absolutePath, { type, returnRaw: true }); +} + +export { + loadContents as EleventyLoadContent, + dynamicImport as EleventyImport, + dynamicImportRaw as EleventyImportRaw, + normalizeFilePathInEleventyPackage, + + // no longer used in core + dynamicImportFromEleventyPackage as EleventyImportFromEleventy, + dynamicImportRawFromEleventyPackage as EleventyImportRawFromEleventy, +}; diff --git a/node_modules/@11ty/eleventy/src/Util/ReservedData.js b/node_modules/@11ty/eleventy/src/Util/ReservedData.js new file mode 100644 index 0000000..d726c73 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/ReservedData.js @@ -0,0 +1,69 @@ +class EleventyReservedDataError extends TypeError {} + +class ReservedData { + static properties = [ + // "pkg", // Object.freeze’d upstream + // "eleventy", // Object.freeze’d upstream + // "page" is only frozen for specific subproperties below + "content", + "collections", + ]; + + static pageProperties = [ + "date", + "inputPath", + "fileSlug", + "filePathStem", + "outputFileExtension", + "templateSyntax", + "url", + "outputPath", + // not yet `excerpt` or `lang` set via front matter and computed data + ]; + + // Check in the data cascade for reserved data properties. + static getReservedKeys(data) { + if (!data) { + return []; + } + + let keys = this.properties.filter((key) => { + return key in data; + }); + + if ("page" in data) { + if (typeof data.page === "object") { + for (let key of this.pageProperties) { + if (key in data.page) { + keys.push(`page.${key}`); + } + } + } else { + // fail `page` when set to non-object values. + keys.push("page"); + } + } + return keys; + } + + static check(data) { + let reserved = ReservedData.getReservedKeys(data); + if (reserved.length === 0) { + return; + } + + let error = new EleventyReservedDataError( + `Cannot override reserved Eleventy properties: ${reserved.join(", ")}`, + ); + + error.reservedNames = reserved; + + throw error; + } + + static isReservedDataError(e) { + return e instanceof EleventyReservedDataError; + } +} + +export default ReservedData; diff --git a/node_modules/@11ty/eleventy/src/Util/SetUnion.js b/node_modules/@11ty/eleventy/src/Util/SetUnion.js new file mode 100644 index 0000000..50e6b9c --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/SetUnion.js @@ -0,0 +1,11 @@ +function setUnion(...sets) { + let root = new Set(); + for (let set of sets) { + for (let entry of set) { + root.add(entry); + } + } + return root; +} + +export { setUnion }; diff --git a/node_modules/@11ty/eleventy/src/Util/SpawnAsync.js b/node_modules/@11ty/eleventy/src/Util/SpawnAsync.js new file mode 100644 index 0000000..5e6a20f --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/SpawnAsync.js @@ -0,0 +1,29 @@ +import { spawn } from "node:child_process"; +import { withResolvers } from "./PromiseUtil.js"; + +export function spawnAsync(command, args, options) { + let { promise, resolve, reject } = withResolvers(); + + const cmd = spawn(command, args, options); + let res = []; + cmd.stdout.on("data", (data) => { + res.push(data.toString("utf8")); + }); + + let err = []; + cmd.stderr.on("data", (data) => { + err.push(data.toString("utf8")); + }); + + cmd.on("close", (code) => { + if (err.length > 0) { + reject(err.join("\n")); + } else if (code === 1) { + reject("Internal error: process closed with error exit code."); + } else { + resolve(res.join("\n")); + } + }); + + return promise; +} diff --git a/node_modules/@11ty/eleventy/src/Util/TemplateDepGraph.js b/node_modules/@11ty/eleventy/src/Util/TemplateDepGraph.js new file mode 100644 index 0000000..795453d --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/TemplateDepGraph.js @@ -0,0 +1,160 @@ +import { DepGraph as DependencyGraph } from "dependency-graph"; +import debugUtil from "debug"; + +const debug = debugUtil("Eleventy:TemplateDepGraph"); + +const COLLECTION_PREFIX = "__collection:"; + +export class TemplateDepGraph extends DependencyGraph { + static STAGES = ["[basic]", "[userconfig]", "[keys]", "all"]; + + #configCollectionNames = new Set(); + + constructor() { + // BREAKING TODO move this back to non-circular with errors + super({ circular: true }); + + let previous; + // establish stage relationships, all uses keys, keys uses userconfig, userconfig uses tags + for (let stageName of TemplateDepGraph.STAGES.filter(Boolean).reverse()) { + let stageKey = `${COLLECTION_PREFIX}${stageName}`; + if (previous) { + this.uses(previous, stageKey); + } + previous = stageKey; + } + } + + uses(from, to) { + this.addDependency(from, to); + } + + addTag(tagName, type) { + if ( + tagName === "all" || + (tagName.startsWith("[") && tagName.endsWith("]")) || + this.#configCollectionNames.has(tagName) + ) { + return; + } + if (!type) { + throw new Error( + `Missing tag type for addTag. Expecting one of ${TemplateDepGraph.STAGES.map((entry) => entry.slice(1, -1)).join(" or ")}. Received: ${type}`, + ); + } + + debug("collection type %o uses tag %o", tagName, type); + + this.uses(`${COLLECTION_PREFIX}[${type}]`, `${COLLECTION_PREFIX}${tagName}`); + } + + addConfigCollectionName(collectionName) { + if (collectionName === "all") { + return; + } + + this.#configCollectionNames.add(collectionName); + // Collection relationships to `[userconfig]` are added last, in unfilteredOrder() + } + + cleanupCollectionNames(collectionNames = []) { + let s = new Set(collectionNames); + if (s.has("[userconfig]")) { + return collectionNames; + } + + let hasAnyConfigCollections = collectionNames.find((name) => { + if (this.#configCollectionNames.has(name)) { + return true; + } + return false; + }); + + if (hasAnyConfigCollections) { + s.add("[userconfig]"); + } + + return Array.from(s); + } + + addTemplate(filePath, consumes = [], publishesTo = []) { + // Move to the beginning if it doesn’t consume anything + if (consumes.length === 0) { + this.uses(`${COLLECTION_PREFIX}[basic]`, filePath); + } + + consumes = this.cleanupCollectionNames(consumes); + publishesTo = this.cleanupCollectionNames(publishesTo); + // Can’t consume AND publish to `all` simultaneously + let consumesAll = consumes.includes("all"); + if (consumesAll) { + publishesTo = publishesTo.filter((entry) => entry !== "all"); + } + + debug("%o consumes %o and publishes to %o", filePath, consumes, publishesTo); + + for (let collectionName of publishesTo) { + if (!consumesAll) { + let tagType = "basic"; + + let consumesUserConfigCollection = consumes.includes("[userconfig]"); + if (consumesUserConfigCollection) { + // must finish before [keys] + tagType = "keys"; + } + + this.addTag(collectionName, tagType); + } + + this.uses(`${COLLECTION_PREFIX}${collectionName}`, filePath); + } + + for (let collectionName of consumes) { + this.uses(filePath, `${COLLECTION_PREFIX}${collectionName}`); + + let stageIndex = TemplateDepGraph.STAGES.indexOf(collectionName); + let nextStage = stageIndex > 0 ? TemplateDepGraph.STAGES[stageIndex + 1] : undefined; + if (nextStage) { + this.uses(`${COLLECTION_PREFIX}${nextStage}`, filePath); + } + } + } + + addDependency(from, to) { + if (!this.hasNode(from)) { + this.addNode(from); + } + if (!this.hasNode(to)) { + this.addNode(to); + } + super.addDependency(from, to); + } + + unfilteredOrder() { + // these need to be added last, after the template map has been added (see addConfigCollectionName) + for (let collectionName of this.#configCollectionNames) { + this.uses(`${COLLECTION_PREFIX}[keys]`, `${COLLECTION_PREFIX}${collectionName}`); + } + + return super.overallOrder(); + } + + overallOrder() { + let unfiltered = this.unfilteredOrder(); + + let filtered = unfiltered.filter((entry) => { + if (entry === `${COLLECTION_PREFIX}[keys]`) { + return true; + } + return !entry.startsWith(`${COLLECTION_PREFIX}[`) && !entry.endsWith("]"); + }); + + let allKey = `${COLLECTION_PREFIX}all`; + // Add another collections.all entry to the end (if not already the last one) + if (filtered[filtered.length - 1] !== allKey) { + filtered.push(allKey); + } + + return filtered; + } +} diff --git a/node_modules/@11ty/eleventy/src/Util/TransformsUtil.js b/node_modules/@11ty/eleventy/src/Util/TransformsUtil.js new file mode 100644 index 0000000..3ba8ab0 --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/TransformsUtil.js @@ -0,0 +1,70 @@ +import EleventyBaseError from "../Errors/EleventyBaseError.js"; +import { isPlainObject } from "@11ty/eleventy-utils"; +import debugUtil from "debug"; + +const debug = debugUtil("Eleventy:Transforms"); + +class EleventyTransformError extends EleventyBaseError {} + +class TransformsUtil { + static changeTransformsToArray(transformsObj) { + let transforms = []; + for (let name in transformsObj) { + transforms.push({ + name: name, + callback: transformsObj[name], + }); + } + return transforms; + } + + static async runAll(content, pageData, transforms = {}, options = {}) { + let { baseHrefOverride, logger } = options; + let { inputPath, outputPath, url } = pageData; + + if (!isPlainObject(transforms)) { + throw new Error("Object of transforms expected."); + } + + let transformsArray = this.changeTransformsToArray(transforms); + + for (let { callback, name } of transformsArray) { + debug("Running %o transform on %o: %o", name, inputPath, outputPath); + + try { + let hadContentBefore = !!content; + + content = await callback.call( + { + inputPath, + outputPath, + url, + page: pageData, + baseHref: baseHrefOverride, + }, + content, + outputPath, + ); + + if (hadContentBefore && !content) { + if (!logger || !logger.warn) { + throw new Error("Internal error: missing `logger` instance."); + } + + logger.warn( + `Warning: Transform \`${name}\` returned empty when writing ${outputPath} from ${inputPath}.`, + ); + } + } catch (e) { + throw new EleventyTransformError( + `Transform \`${name}\` encountered an error when transforming ${inputPath}.`, + e, + ); + } + } + + return content; + } +} + +export default TransformsUtil; diff --git a/node_modules/@11ty/eleventy/src/Util/ValidUrl.js b/node_modules/@11ty/eleventy/src/Util/ValidUrl.js new file mode 100644 index 0000000..9d0f59b --- /dev/null +++ b/node_modules/@11ty/eleventy/src/Util/ValidUrl.js @@ -0,0 +1,9 @@ +export default function isValidUrl(url) { + try { + new URL(url); + return true; + } catch (e) { + // invalid url OR local path + return false; + } +} diff --git a/node_modules/@11ty/eleventy/src/defaultConfig.js b/node_modules/@11ty/eleventy/src/defaultConfig.js new file mode 100644 index 0000000..fb1ab5d --- /dev/null +++ b/node_modules/@11ty/eleventy/src/defaultConfig.js @@ -0,0 +1,178 @@ +import bundlePlugin from "@11ty/eleventy-plugin-bundle"; + +import urlFilter from "./Filters/Url.js"; +import slugFilter from "./Filters/Slug.js"; +import slugifyFilter from "./Filters/Slugify.js"; +import getLocaleCollectionItem from "./Filters/GetLocaleCollectionItem.js"; +import getCollectionItemIndex from "./Filters/GetCollectionItemIndex.js"; +import { FilterPlugin as InputPathToUrlFilterPlugin } from "./Plugins/InputPathToUrl.js"; +import { HtmlTransformer } from "./Util/HtmlTransformer.js"; +import TransformsUtil from "./Util/TransformsUtil.js"; +import MemoizeUtil from "./Util/MemoizeFunction.js"; +import { HtmlRelativeCopyPlugin } from "./Plugins/HtmlRelativeCopyPlugin.js"; + +/** + * @module 11ty/eleventy/defaultConfig + */ + +/** + * @callback addFilter - Register a global filter. + * @param {string} name - Register a template filter by this name. + * @param {function} callback - The filter logic. + */ + +/** + * @typedef {object} config + * @property {addFilter} addFilter - Register a new global filter. + */ + +/** + * @typedef {object} defaultConfig + * @property {Array} templateFormats - An array of accepted template formats. + * @property {string} [pathPrefix='/'] - The directory under which all output files should be written to. + * @property {string} [markdownTemplateEngine='liquid'] - Template engine to process markdown files with. + * @property {string} [htmlTemplateEngine='liquid'] - Template engine to process html files with. + * @property {boolean} [dataTemplateEngine=false] - Changed in v1.0 + * @property {string} [jsDataFileSuffix='.11tydata'] - File suffix for jsData files. + * @property {object} keys + * @property {string} [keys.package='pkg'] - Global data property for package.json data + * @property {string} [keys.layout='layout'] + * @property {string} [keys.permalink='permalink'] + * @property {string} [keys.permalinkRoot='permalinkBypassOutputDir'] + * @property {string} [keys.engineOverride='templateEngineOverride'] + * @property {string} [keys.computed='eleventyComputed'] + * @property {object} dir + * @property {string} [dir.input='.'] + * @property {string} [dir.includes='_includes'] + * @property {string} [dir.data='_data'] + * @property {string} [dir.output='_site'] + * @deprecated handlebarsHelpers + * @deprecated nunjucksFilters + */ + +/** + * Default configuration object factory. + * + * @param {config} config - Eleventy configuration object. + * @returns {defaultConfig} + */ +export default function (config) { + let templateConfig = this; + + // Used for the HTML , InputPathToUrl, Image transform plugins + let ut = new HtmlTransformer(); + ut.setUserConfig(config); + + // This needs to be assigned before bundlePlugin is added below. + config.htmlTransformer = ut; + + config.exists = (filePath) => { + return this.existsCache.exists(filePath); + }; + + // Remember: the transform added here runs before the `htmlTransformer` transform + config.addPlugin(bundlePlugin, { + bundles: false, // no default bundles included—must be opt-in. + immediate: true, + }); + + // Filter: Maps an input path to output URL + config.addPlugin(InputPathToUrlFilterPlugin, { + immediate: true, + }); + + let memoizeBench = config.benchmarkManager.get("Configuration"); + config.addFilter("slug", MemoizeUtil(slugFilter, { name: "slug", bench: memoizeBench })); + config.addFilter("slugify", MemoizeUtil(slugifyFilter, { name: "slugify", bench: memoizeBench })); + + // Deprecated, use HtmlBasePlugin instead. + // Adds a pathPrefix manually to a URL string + config.addFilter("url", function addPathPrefixFilter(url, pathPrefixOverride) { + let pathPrefix; + if (pathPrefixOverride && typeof pathPrefixOverride === "string") { + pathPrefix = pathPrefixOverride; + } else { + pathPrefix = templateConfig.getPathPrefix(); + } + + return urlFilter.call(this, url, pathPrefix); + }); + + config.addFilter("log", (input, ...messages) => { + console.log(input, ...messages); + return input; + }); + + config.addFilter("getCollectionItemIndex", function (collection, pageOverride) { + return getCollectionItemIndex.call(this, collection, pageOverride); + }); + config.addFilter("getCollectionItem", function (collection, pageOverride, langCode) { + return getLocaleCollectionItem.call(this, config, collection, pageOverride, langCode, 0); + }); + config.addFilter("getPreviousCollectionItem", function (collection, pageOverride, langCode) { + return getLocaleCollectionItem.call(this, config, collection, pageOverride, langCode, -1); + }); + config.addFilter("getNextCollectionItem", function (collection, pageOverride, langCode) { + return getLocaleCollectionItem.call(this, config, collection, pageOverride, langCode, 1); + }); + + // Process arbitrary content with transforms + config.addFilter( + "renderTransforms", + async function transformsFilter(content, pageEntryOverride, baseHrefOverride) { + return TransformsUtil.runAll(content, pageEntryOverride || this.page, config.transforms, { + baseHrefOverride, + logger: config.logger, + }); + }, + ); + + // Run the `htmlTransformer` transform + config.addTransform("@11ty/eleventy/html-transformer", async function (content) { + // Runs **AFTER** the bundle plugin transform (except: delayed bundles) + return ut.transformContent(this.outputPath, content, this); + }); + + // Requires user configuration, so must run as second-stage + config.addPlugin(HtmlRelativeCopyPlugin); + + return { + templateFormats: ["liquid", "md", "njk", "html", "11ty.js"], + // if your site deploys to a subdirectory, change this + pathPrefix: "/", + markdownTemplateEngine: "liquid", + htmlTemplateEngine: "liquid", + + // Renamed from `jsDataFileSuffix` in 2.0 (and swapped to an Array) + // If you remove "" we won’t look for dir/dir.json or file.json + dataFileSuffixes: [".11tydata", ""], + + // "index" will look for `directory/index.*` directory data files instead of `directory/directory.*` + dataFileDirBaseNameOverride: false, + + keys: { + // TODO breaking: use `false` by default + package: "pkg", // supports `false` + layout: "layout", + permalink: "permalink", + permalinkRoot: "permalinkBypassOutputDir", + engineOverride: "templateEngineOverride", + computed: "eleventyComputed", + dataSchema: "eleventyDataSchema", + }, + + // Deprecated, define using `export const directories = {}` instead. + // Reference values using `eleventyConfig.directories` instead. + dir: { + // These values here aren’t used internally either (except by a few tests), instead we’re using `ProjectDirectories.defaults`. + // These are kept in place for backwards compat with `eleventyConfig.dir` references in project config code and plugins. + input: ".", + includes: "_includes", + data: "_data", + output: "_site", + }, + + // deprecated, use config.addNunjucksFilter + nunjucksFilters: {}, + }; +} diff --git a/node_modules/@11ty/eleventy/tsconfig.json b/node_modules/@11ty/eleventy/tsconfig.json new file mode 100644 index 0000000..a01ba08 --- /dev/null +++ b/node_modules/@11ty/eleventy/tsconfig.json @@ -0,0 +1,117 @@ +{ + "include": [ + // "src/Eleventy.js", + "src/UserConfig.js", + "src/Util/ConsoleLogger.js", + ], + "exclude": [], + + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "ES2021", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "lib": ["ES2021"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "Node16", /* Specify what module code is generated. */ + // "rootDir": "./src/", /* Specify the root folder within your source files. */ + "moduleResolution": "Node16", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + "types": ["node"], /* Specify type package names to be included without being referenced in a source file. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + + // WARNING: this causes missing `node` types even with "types": ["node"] + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + "maxNodeModuleJsDepth": 0, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./types/", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./types/", /* Specify the output directory for generated declaration files. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + // "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": false, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + // "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/node_modules/@11ty/lodash-custom/README.md b/node_modules/@11ty/lodash-custom/README.md new file mode 100644 index 0000000..e45d1a9 --- /dev/null +++ b/node_modules/@11ty/lodash-custom/README.md @@ -0,0 +1,14 @@ +# @11ty/lodash-custom + +Eleventy uses 3 small `lodash` functions: + +* [`get`](https://lodash.com/docs/4#get) +* [`set`](https://lodash.com/docs/4#set) +* [`chunk`](https://lodash.com/docs/4#chunk) + +## Why? + +1. The top level `lodash` package includes all of `lodash` and is a hefty 5 MB. +1. Using the individual, modularized `lodash.get`, `lodash.set`, `lodash.chunk` packages are a much smaller 106 KB but do contain duplicated code. More problematically, these are not being maintained/updated with the newest versions of `lodash`. + +This package creates one focused custom dependency using the tools that `lodash` provides to do custom builds ([`lodash-cli`](https://lodash.com/custom-builds)) for these three `lodash` functions with updated versions of `lodash`. \ No newline at end of file diff --git a/node_modules/@11ty/lodash-custom/lodash.custom.js b/node_modules/@11ty/lodash-custom/lodash.custom.js new file mode 100644 index 0000000..037cfef --- /dev/null +++ b/node_modules/@11ty/lodash-custom/lodash.custom.js @@ -0,0 +1,1704 @@ +/** + * @license + * Lodash (Custom Build) + * Build: `lodash exports="node" include="get,set,chunk"` + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ +;(function() { + + /** Used as a safe reference for `undefined` in pre-ES5 environments. */ + var undefined; + + /** Used as the semantic version number. */ + var VERSION = '4.17.21'; + + /** Error message constants. */ + var FUNC_ERROR_TEXT = 'Expected a function'; + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + + /** Used as the maximum memoize cache size. */ + var MAX_MEMOIZE_SIZE = 500; + + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991, + MAX_INTEGER = 1.7976931348623157e+308, + NAN = 0 / 0; + + /** `Object#toString` result references. */ + var asyncTag = '[object AsyncFunction]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + nullTag = '[object Null]', + proxyTag = '[object Proxy]', + symbolTag = '[object Symbol]', + undefinedTag = '[object Undefined]'; + + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + + /** Used to match leading whitespace. */ + var reTrimStart = /^\s+/; + + /** Used to match a single whitespace character. */ + var reWhitespace = /\s/; + + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; + + /** Used to detect bad signed hexadecimal string values. */ + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + + /** Used to detect binary string values. */ + var reIsBinary = /^0b[01]+$/i; + + /** Used to detect host constructors (Safari). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Used to detect octal string values. */ + var reIsOctal = /^0o[0-7]+$/i; + + /** Used to detect unsigned integer values. */ + var reIsUint = /^(?:0|[1-9]\d*)$/; + + /** Built-in method references without a dependency on `root`. */ + var freeParseInt = parseInt; + + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + + /** Used as a reference to the global object. */ + var root = freeGlobal || freeSelf || Function('return this')(); + + /** Detect free variable `exports`. */ + var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + + /*--------------------------------------------------------------------------*/ + + /** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + + /** + * The base implementation of `_.trim`. + * + * @private + * @param {string} string The string to trim. + * @returns {string} Returns the trimmed string. + */ + function baseTrim(string) { + return string + ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') + : string; + } + + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function getValue(object, key) { + return object == null ? undefined : object[key]; + } + + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace + * character of `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the index of the last non-whitespace character. + */ + function trimmedEndIndex(string) { + var index = string.length; + + while (index-- && reWhitespace.test(string.charAt(index))) {} + return index; + } + + /*--------------------------------------------------------------------------*/ + + /** Used for built-in method references. */ + var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + + /** Used to detect overreaching core-js shims. */ + var coreJsData = root['__core-js_shared__']; + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to detect methods masquerading as native. */ + var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; + }()); + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto.toString; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** Built-in value references. */ + var Symbol = root.Symbol, + splice = arrayProto.splice, + symToStringTag = Symbol ? Symbol.toStringTag : undefined; + + var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }()); + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeCeil = Math.ceil, + nativeMax = Math.max; + + /* Built-in method references that are verified to be native. */ + var Map = getNative(root, 'Map'), + nativeCreate = getNative(Object, 'create'); + + /** Used to lookup unminified function names. */ + var realNames = {}; + + /** Used to convert symbols to primitives and strings. */ + var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` object which wraps `value` to enable implicit method + * chain sequences. Methods that operate on and return arrays, collections, + * and functions can be chained together. Methods that retrieve a single value + * or may return a primitive value will automatically end the chain sequence + * and return the unwrapped value. Otherwise, the value must be unwrapped + * with `_#value`. + * + * Explicit chain sequences, which must be unwrapped with `_#value`, may be + * enabled using `_.chain`. + * + * The execution of chained methods is lazy, that is, it's deferred until + * `_#value` is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. + * Shortcut fusion is an optimization to merge iteratee calls; this avoids + * the creation of intermediate arrays and can greatly reduce the number of + * iteratee executions. Sections of a chain sequence qualify for shortcut + * fusion if the section is applied to an array and iteratees accept only + * one argument. The heuristic for whether a section qualifies for shortcut + * fusion is subject to change. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, + * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, + * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, + * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, + * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, + * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, + * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, + * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, + * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, + * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, + * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, + * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, + * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, + * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, + * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, + * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, + * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, + * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, + * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, + * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, + * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, + * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, + * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, + * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, + * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, + * `zipObject`, `zipObjectDeep`, and `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, + * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, + * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, + * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, + * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, + * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, + * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, + * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, + * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, + * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, + * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, + * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, + * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, + * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, + * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, + * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, + * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, + * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, + * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, + * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, + * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, + * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, + * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, + * `upperFirst`, `value`, and `words` + * + * @name _ + * @constructor + * @category Seq + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2, 3]); + * + * // Returns an unwrapped value. + * wrapped.reduce(_.add); + * // => 6 + * + * // Returns a wrapped value. + * var squares = wrapped.map(square); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ + function lodash() { + // No operation performed. + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; + } + + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; + } + + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); + } + + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; + } + + // Add methods to `Hash`. + Hash.prototype.clear = hashClear; + Hash.prototype['delete'] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; + } + + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ + function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + + // Add methods to `ListCache`. + ListCache.prototype.clear = listCacheClear; + ListCache.prototype['delete'] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ + function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; + } + + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ + function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } + + // Add methods to `MapCache`. + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype['delete'] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } + } + + /** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path) { + path = castPath(path, object); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; + } + + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); + } + + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + + /** + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseSet(object, path, value, customizer) { + if (!isObject(object)) { + return object; + } + path = castPath(path, object); + + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = toKey(path[index]), + newValue = value; + + if (key === '__proto__' || key === 'constructor' || key === 'prototype') { + return object; + } + + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined; + if (newValue === undefined) { + newValue = isObject(objValue) + ? objValue + : (isIndex(path[index + 1]) ? [] : {}); + } + } + assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; + } + + /** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; + } + + /** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray(value)) { + // Recursively convert values (susceptible to call stack limits). + return arrayMap(value, baseToString) + ''; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ + function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); + } + + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ + function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; + } + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; + } + + /** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; + } + + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); + } + + /** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; + } + + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); + } + + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ + function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); + } + + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); + } + + /** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ + function memoizeCapped(func) { + var result = memoize(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + + var cache = result.cache; + return result; + } + + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ + function objectToString(value) { + return nativeObjectToString.call(value); + } + + /** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ + var stringToPath = memoizeCapped(function(string) { + var result = []; + if (string.charCodeAt(0) === 46 /* . */) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + }); + + /** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ + function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of elements split into groups the length of `size`. + * If `array` can't be split evenly, the final chunk will be the remaining + * elements. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to process. + * @param {number} [size=1] The length of each chunk + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the new array of chunks. + * @example + * + * _.chunk(['a', 'b', 'c', 'd'], 2); + * // => [['a', 'b'], ['c', 'd']] + * + * _.chunk(['a', 'b', 'c', 'd'], 3); + * // => [['a', 'b', 'c'], ['d']] + */ + function chunk(array, size, guard) { + if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) { + size = 1; + } else { + size = nativeMax(toInteger(size), 0); + } + var length = array == null ? 0 : array.length; + if (!length || size < 1) { + return []; + } + var index = 0, + resIndex = 0, + result = Array(nativeCeil(length / size)); + + while (index < length) { + result[resIndex++] = baseSlice(array, index, (index += size)); + } + return result; + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ + function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; + } + + // Expose `MapCache`. + memoize.Cache = MapCache; + + /*------------------------------------------------------------------------*/ + + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray = Array.isArray; + + /** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + + /** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ + function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); + } + + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return value != null && typeof value == 'object'; + } + + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ + function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && baseGetTag(value) == symbolTag); + } + + /** + * Converts `value` to a finite number. + * + * @static + * @memberOf _ + * @since 4.12.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted number. + * @example + * + * _.toFinite(3.2); + * // => 3.2 + * + * _.toFinite(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toFinite(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toFinite('3.2'); + * // => 3.2 + */ + function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; + } + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = (value < 0 ? -1 : 1); + return sign * MAX_INTEGER; + } + return value === value ? value : 0; + } + + /** + * Converts `value` to an integer. + * + * **Note:** This method is loosely based on + * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toInteger(3.2); + * // => 3 + * + * _.toInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toInteger(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toInteger('3.2'); + * // => 3 + */ + function toInteger(value) { + var result = toFinite(value), + remainder = result % 1; + + return result === result ? (remainder ? result - remainder : result) : 0; + } + + /** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ + function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = baseTrim(value); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); + } + + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ + function toString(value) { + return value == null ? '' : baseToString(value); + } + + /*------------------------------------------------------------------------*/ + + /** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; + } + + /** + * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, + * it's created. Arrays are created for missing index properties while objects + * are created for all other missing properties. Use `_.setWith` to customize + * `path` creation. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, ['x', '0', 'y', 'z'], 5); + * console.log(object.x[0].y.z); + * // => 5 + */ + function set(object, path, value) { + return object == null ? object : baseSet(object, path, value); + } + + /*------------------------------------------------------------------------*/ + + // Add methods that return wrapped values in chain sequences. + lodash.chunk = chunk; + lodash.memoize = memoize; + lodash.set = set; + + /*------------------------------------------------------------------------*/ + + // Add methods that return unwrapped values in chain sequences. + lodash.eq = eq; + lodash.get = get; + lodash.isArray = isArray; + lodash.isArrayLike = isArrayLike; + lodash.isFunction = isFunction; + lodash.isLength = isLength; + lodash.isObject = isObject; + lodash.isObjectLike = isObjectLike; + lodash.isSymbol = isSymbol; + lodash.toFinite = toFinite; + lodash.toInteger = toInteger; + lodash.toNumber = toNumber; + lodash.toString = toString; + + /*------------------------------------------------------------------------*/ + + /** + * The semantic version number. + * + * @static + * @memberOf _ + * @type {string} + */ + lodash.VERSION = VERSION; + + /*--------------------------------------------------------------------------*/ + + if (freeModule) { + // Export for Node.js. + (freeModule.exports = lodash)._ = lodash; + // Export for CommonJS support. + freeExports._ = lodash; + } +}.call(this)); diff --git a/node_modules/@11ty/lodash-custom/package.json b/node_modules/@11ty/lodash-custom/package.json new file mode 100644 index 0000000..99d2eed --- /dev/null +++ b/node_modules/@11ty/lodash-custom/package.json @@ -0,0 +1,38 @@ +{ + "name": "@11ty/lodash-custom", + "version": "4.17.21", + "description": "A custom, focused build of lodash exclusively for use internally in Eleventy.", + "main": "lodash.custom.js", + "scripts": { + "build": "npx lodash exports=node include=get,set,chunk && rm lodash.custom.min.js" + }, + "publishConfig": { + "access": "public" + }, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + }, + "author": { + "name": "Zach Leatherman", + "email": "zachleatherman@gmail.com", + "url": "https://zachleat.com/" + }, + "repository": { + "type": "git", + "url": "git://github.com/11ty/lodash-custom.git" + }, + "bugs": "https://github.com/11ty/lodash-custom/issues", + "homepage": "https://github.com/11ty/lodash-custom/", + "devDependencies": { + "ava": "^5.2.0", + "lodash-cli": "^4.17.5" + }, + "overrides": { + "lodash": "4.17.21" + } +} diff --git a/node_modules/@11ty/posthtml-urls/LICENSE b/node_modules/@11ty/posthtml-urls/LICENSE new file mode 100644 index 0000000..16736bd --- /dev/null +++ b/node_modules/@11ty/posthtml-urls/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Steven Vachon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@11ty/posthtml-urls/README.md b/node_modules/@11ty/posthtml-urls/README.md new file mode 100644 index 0000000..559a6ea --- /dev/null +++ b/node_modules/@11ty/posthtml-urls/README.md @@ -0,0 +1,48 @@ +# `@11ty/posthtml-urls` + +PostHTML plugin for transforming URLs. This is a fork of [`posthtml/posthtml-urls`](https://github.com/posthtml/posthtml-urls). + + +## Installation + +[Node.js](http://nodejs.org) `>= 6` is required. To install, type this at the command line: + +```shell +npm install @11ty/posthtml-urls +``` + + +## Usage + +```js +const posthtml = require('posthtml'); +const urls = require('@11ty/posthtml-urls'); + +const options = { + eachURL: (url, attr, tagName) => `http://domain.com/${url}` +}; + +posthtml() + .use( urls(options) ) + .process('link') + .then(result => console.log(result.html)); +//-> link +``` + + +## Options + +### `eachURL` +Type: `Function` +Default value: `undefined` +A callback function ran for each URL value found. You can return either a synchronous value or a `Promise`. + +### `filter` +Type: `Object` +Default value: [`{…}`](https://github.com/posthtml/posthtml-urls/blob/master/lib/defaultOptions.js) +The elements and attributes for which to search. An attribute value can optionally be a function, for deeper filtering. + + +## FAQ +1. **How can I filter ` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/static/images/witch-svgrepo-com.svg b/static/images/witch-svgrepo-com.svg deleted file mode 100644 index 3a738d2..0000000 --- a/static/images/witch-svgrepo-com.svg +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/themes/juice/.gitignore b/themes/juice/.gitignore deleted file mode 100644 index 12b298b..0000000 --- a/themes/juice/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.idea -.DS_Store -public diff --git a/themes/juice/README.md b/themes/juice/README.md deleted file mode 100644 index fe38a69..0000000 --- a/themes/juice/README.md +++ /dev/null @@ -1,111 +0,0 @@ -# Juice - - - -**Juice** is an intuitive, elegant, and responsive Zola theme for product sites. - -- Build for product sites -- Simple and intuitive structure -- Clean and elegant design -- Responsive and mobile device compatible -- Customize and extend friendly - -https://juice.huhu.io - -# Installation - -First download this theme to your `themes` directory: - -```bash -$ cd themes -$ git clone https://github.com/huhu/juice.git -``` - -or add as a submodule -```bash -$ git submodule add https://github.com/huhu/juice themes/juice -``` - -and then enable it in your `config.toml`: - -```toml -theme = "juice" -``` - -# Structure - -### Hero - -**Juice** is designed for product websites, hence we let **hero** part fills whole of screen. -You can customize your **hero** by using `hero` block in the `index.html`. - -```html -{% block hero %} -
- Your cool hero html... -
-{% endblock hero %} -``` - -### Page - -Every markdown file located in `content` directory will become a **Page**. There also will display as -a navigate link on the top-right corner. -You can change the frontmatter's `weight` value to sort the order (ascending order). - -``` -+++ -title = "Changelog" -description = "Changelog" -weight = 2 -+++ - -``` - -### CSS variables - -You can override theme variable by creating a file named `_variables.html` in your `templates` directory. - -```html - -``` - -# Configuration - -You can customize some builtin property in `config.toml` file: - -```toml -[extra] -juice_logo_name = "Juice" -juice_logo_path = "juice.svg" -juice_extra_menu = [ - { title = "Github", link = "https://github.com/huhu/juice"} -] -``` - -# Showcases - -Please see the [showcases page](/showcases). - -# Contributing - -Thank you very much for considering contributing to this project! - -We appreciate any form of contribution: - -- New issues (feature requests, bug reports, questions, ideas, ...) -- Pull requests (documentation improvements, code improvements, new features, ...) \ No newline at end of file diff --git a/themes/juice/config.toml b/themes/juice/config.toml deleted file mode 100644 index 4d5fa93..0000000 --- a/themes/juice/config.toml +++ /dev/null @@ -1,23 +0,0 @@ -# The URL the site will be built for -base_url = "/" - -title = "Juice - An intuitive, elegant, and lightweight Zola theme for product sites." - -# Whether to automatically compile all Sass files in the sass directory -compile_sass = true - -# Whether to do syntax highlighting -# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola -highlight_code = true -highlight_theme = "inspired-github" - -# Whether to build a search index to be used later on by a JavaScript library -build_search_index = false - - -[extra] -juice_logo_name = "Juice" -juice_logo_path = "juice.svg" -juice_extra_menu = [ - { title = "Github", link = "https://github.com/huhu/juice" } -] \ No newline at end of file diff --git a/themes/juice/content/_index.md b/themes/juice/content/_index.md deleted file mode 100644 index 6abaf04..0000000 --- a/themes/juice/content/_index.md +++ /dev/null @@ -1,114 +0,0 @@ -+++ -title = "Juice" -sort_by = "weight" -+++ - -# Juice - -**Juice** is an intuitive, elegant, and responsive Zola theme for product sites. - -- Build for product sites -- Simple and intuitive structure -- Clean and elegant design -- Responsive and mobile device compatible -- Customize and extend friendly - -# Installation - -> **Zola** is a prerequisite. Please refer to the [Zola installation](https://www.getzola.org/documentation/getting-started/installation/) docs. - -First download this theme to your `themes` directory: - -```bash -$ cd themes -$ git clone https://github.com/huhu/juice.git -``` - -or add as a submodule -```bash -$ git submodule add https://github.com/huhu/juice themes/juice -``` - -and then enable it in your `config.toml`: - -```toml -theme = "juice" -``` - -# Structure - -### Hero - -**Juice** is designed for product websites, hence we let **hero** part fills whole of screen. -You can customize your **hero** by using `hero` block in the `index.html`. - -```html -{% block hero %} -
- Your cool hero html... -
-{% endblock hero %} -``` - -### Page - -Every markdown file located in `content` directory will become a **Page**. There also will display as -a navigate link on the top-right corner. -You can change the frontmatter's `weight` value to sort the order (ascending order). - -``` -+++ -title = "Changelog" -description = "Changelog" -weight = 2 -+++ - -``` - -### CSS variables - -You can override theme variable by creating a file named `_variables.html` in your `templates` directory. - -```html - -``` - -# Configuration - -You can customize some builtin property in `config.toml` file: - -```toml -[extra] -juice_logo_name = "Juice" -juice_logo_path = "juice.svg" -juice_extra_menu = [ - { title = "Github", link = "https://github.com/huhu/juice"} -] -``` - -# Showcases - -Please see the [showcases page](/showcases). - -# Contributing - -Thank you very much for considering contributing to this project! - -We appreciate any form of contribution: - -- New issues (feature requests, bug reports, questions, ideas, ...) -- Pull requests (documentation improvements, code improvements, new features, ...) diff --git a/themes/juice/content/about.md b/themes/juice/content/about.md deleted file mode 100644 index 4124984..0000000 --- a/themes/juice/content/about.md +++ /dev/null @@ -1,25 +0,0 @@ -+++ -title = "About" -description = "About" -weight = 3 -+++ - -# Juice - -**Juice** is an intuitive, elegant, and responsive Zola theme for product sites. -Built by [Huhu.io](https://huhu.io), adopted by a several product sites. - -# Logo - -![](/juice.svg) - -# Zola - -[Zola](https://www.getzola.org) is a fast static site generator in a single binary with everything built-in. - - -# Huhu.io - -[Huhu.io](https://huhu.io) is a global community of coders dedicated to making cool stuff coders need and want. -We focus on enabling the developer community by curating, incubating, and launching tools based on great ideas, -providing support and funding that allows our engineers to develop what they want, the way they want. diff --git a/themes/juice/content/changelog.md b/themes/juice/content/changelog.md deleted file mode 100644 index 299c465..0000000 --- a/themes/juice/content/changelog.md +++ /dev/null @@ -1,62 +0,0 @@ -+++ -title = "Changelog" -description = "Changelog" -weight = 2 -+++ - -# v0.7 - 2020-07-01 - -- Introduction 1 -- New Features: - - feature 1 -- Bugfix: - - Fix bug #10 - - Fix bug #11 - -# v0.6 - 2020-06-01 - -- Introduction 1 -- New Features: - - feature 1 -- Bugfix: - - Fix bug #8 - - Fix bug #9 - -# v0.5 - 2020-05-01 - -- Introduction 1 -- New Features: - - feature 1 -- Bugfix: - - Fix bug #6 - - Fix bug #7 - -# v0.4 - 2020-04-01 - -- Introduction 1 -- New Features: - - feature 1 -- Bugfix: - - Fix bug #4 - - Fix bug #5 - -# v0.3 - 2020-03-01 - -- Introduction 1 -- New Features: - - feature 1 -- Bugfix: - - Fix bug #2 - - Fix bug #3 - -# v0.2 - 2020-02-04 - -- Introduction 1 -- New Features: - - feature 1 -- Bugfix: - - Fix bug #1 - -# v0.1 - 2020-01-01 - -- First release! \ No newline at end of file diff --git a/themes/juice/content/cpp-search-extension.png b/themes/juice/content/cpp-search-extension.png deleted file mode 100644 index 30a8251cbc2ec8b88c5a220e0c729a54b84e267c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144487 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

Pe1R)IcEFUZyD_dCN-Y@QsT`m%91Mb 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%0DA{tC1X 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≪p;y5qrfx);#WX!2dzy9)t4 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

$LX{ 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 r1!@7vB5tNKj84+UhhtpN>zuZ=`u%Qdy+jKYiBP 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 F{2wKFZ>azP diff --git a/themes/juice/content/juice.svg b/themes/juice/content/juice.svg deleted file mode 100644 index d952b50..0000000 --- a/themes/juice/content/juice.svg +++ /dev/null @@ -1,48 +0,0 @@ - \ No newline at end of file diff --git a/themes/juice/content/rust-search-extension.png b/themes/juice/content/rust-search-extension.png deleted file mode 100644 index 106542ce4fc37367691e292ec17b2562c9c74966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 615609 zcmaI71y~$g)-{Z~duW1&5S(C*dw}5X?k>UI5+FE10t9!5K(NLoxI^&9-QDGHl6z<7 z&b;5>Pjy#Ub=5g*%UXM%;^DJ`oCG=wF$xqE6#9EfF(oJ{Q~@X`_-!N@$eH(Giw-Dc z6aV*O!Yc02``{2eKp%9^iciUTx}-y0GL*3Fbn{emkPPY0BI(NLxR=U;7xU8(`06j5 z?DE7+U&)Sjzsm+pg|f9mvm}-IUWK&YZ@T%>VM0d!{gMFw{f!_WqB%5!J-=aE^FAG_X2il3LW6k!}Z=y~41M;wJOOxL?RS?j~3tS)a^ecc+-%NGG&nZ5iR-;ly;=G`Um)*0YLel9>y$pFS(LGBzrZ~Y-WCrzcG`6=Aq>MwxFB%vti@? z2k!Q{$5-6C5M=+JmjrC#$*wn`!(&mtDIdwuW+dNXru^%JUX2fL9x9Y>!N2VA&jDO` zl#sa1U9n6a9!GfD5WtYn=a&v5+Bi<_S@&z57yau}i1nk6zry!|I=RqlT8_j%M57BC zYPw&|Po)kSucI_IGC{@X{_ARgZD7jRt$p4MC)?rJ^fs7Gf!LI|0D_(9c!}N3e?~|Ma}raAJIu?5^*cbhxh;QYs=;ccn+zd{3v zQrlQ$u#9~*(wn{(x@bT8%fqz4;`;{}7ijEo<$5Mv^M~v95sZO;0)0mqQ{~HlTyrjT zu^Sp~C-#7pP38HBSrgw{LW}dVmLS(4{QG5`4pi(9hM|6MtwbcfHXK zk_*qajAHyAxUCFuU>7YnbaG4q^#Q8(o+Vr&GvwoH~2;n!C#YL zq-;pI+1)OK+0$If?JpY+{>+{zcd>e#dEY2NTu~z^iR^zF-kL7cqJ9eI{q={M7SO+= zzr5XD>KbCcM;q^?$2dI=bqw)Hfg7m@rEZ_wk;ZeVG7&(daFA=UK$Xs!o<7!1$D81;Exy;3V?v%3LObgggy(tfIR1If^F761fe2tt4v3d!pRl2x8b>saX5Aoc z{10fq=j3noEmwBCSpQnWc3W=g$s&-*;q2y~AJs!QKyLDemAtRuvyj;EM>#){+bi^4 z7|8A0flQgGpl4zF=Rsv91bbEf;}eNz@sr4vIF0Ai7=?C-%(u(v*DtbnsAB4e7%(mO zmVkx-&mka#i`4iy=CJvFdla<%+!IH(F2Q%V6#!u?T8ezs{NSw=;V8WBvwgaw@Xo^j zb@0h*Poyr&t}CwZ%JXJt<#79>>tn2M&eA zQo#11vEWSs@6}_elcuuo0yhr6IBgKtix{+lmLB81y>vCWD^HD=5CkdzH-u+!#bD_S zXIqpFY_W$&zGT6M99sEbo~|d22wUVYQqdFmTF^oelB-+lT-5F1tOrm!j0$ z_$GbNv{{#*;N}a7@y*O9@(_KsgENyyn~XZa>(H?Qhgn_h=I59>Ah!@ z(mp*K`D|_`DkH>E&=6FKcpwE^-I+qcp~#6h2e`D=)XF|b8tXu}5OeKKZL_&^`^!6v zS2sGE?5*U++o9)+;6Cp?SI+ky?fVr+dW4nvhG=7-h^N>iC_tkhIna$mnG9q*iEu!b zxs~~jLBNY^oqZu}cF1bUnBZ`7los6R2OFx#V$9y^zinsF`r8K|nHZ>?vpgMr9Ed`6 zTF9y~74(vW6fuN83m@^5_?(@|x8C0r==VL594c0!9fd_uNIO{kaED~q9}ItXT%msh zWVk8=+-L|Ufihn|In`Z=eCstV^jnf+yG!Go7?AhGCMUm8vQxHGvg;%<-pO~kVq!CHFm$l+xXSpYtDemDxzs&= z?E2(r*49`WQEw+zVy(r)wDoNmi*ij}UIp7-v-vmQX7ZXEDqbNtH8ZtEP2Tdi3~Gz2 zC4z^35pt6|R${V6?Lk+CESDiFD;uQro*3!uyGBc{zI=L6O$y7)@NKC6giy@>e|ByD ze@+NJ?^;Shu}<2&9&51#4U9q!7B@Rk9D61w8XBl0NB(yBwp}1#X>)!3%}sV~!*oQ8yc_oOkkqI^5NFS;!OGtDB+zqpjP~xA_l5Y1z0gw}Wp#H%!+QwhN;R z39A+2JD{=4jJ~V0wp6&gG`PCyxPti`6chxa1347)^B&3_`WW)V6100(?ok=8ligkr z!z-`gNeabkEjFILbSoO;(jUFN`evHJ z9C_5t{%|`%+&^ewAttn~e=gxu{RH*0RM|OOPMykX*ZM5KSd%d5dr5gHw42)}A4FGQ z?{=@>Q~&W0lpYb$-`}25wMRqgz0tgyV>t3MMaI`JqP7laU|rM~IFqQTeO%s{(r2){ zbN?kEczf}s_NFc}3;~^_(4Ls1SRkM5B1drd+ifhy zs3DI=!M505ft3_`v8EUEu8OWT6mc+ulceQIAP;HTeYn?exA+r2d*wd?{l?nlPbdjC zK>qFGPi@MsCZP@T;02#tETbl$?tYk^n%KI$cL5fvIYNV(wC?vZ_y!m zi3HUIgo`1PbJ+(;#BG+BHivi09EE0Om%m~`$_2Yxu%j&OMCg5wILz>xS!!(_LDR?H zKR&eBHwuzM03Rc}Lo@#$zH38;oWD-_5?PVa((EI$F>ExjI{t@`5aCF!1= zgbS`!Uq}`{({&km45Rla*30mJGve>qAHSq-)t)~z_51nbqtFY7pD7Uy1$CwmVKUOT zZ;ZUt6SF46b{Jzrm`anJ-hc4q%(lniwo;2ML3L5Fl0F(`(XtXD{(`Xi3SIVV_w)(k zme*@1xaTSU-yTZ)veYWOi%>7)Ll@XY)BIJ8nn^%6@o=yI@Vk$nx!Yv{GY7RXY}0uz z6Lu*rYIo@ufM{fj>e{Z+6PYCoWG=IT5Zkdz4tH5$+`hg@>bI^*g03tQ&*p@Y{$<>! z0O)_3c^&h`rDACOKANiqm81|S_JLp27u@qTUmdLKHPX;mw>9}>CM;$DY8G65b*IhC zYR{*kP0C$*A7L?CNQa(JCo0>gKxy+4_V61HaYS%#fTcTeZg4TQ^$c-Se&**wmiUKe zXOPfB-n-x{UN$`_eF*bK#)2UF_$)yzEYC{$A7VtNbZR-0%s}DL9vt=Ja@y#|nSfbO zJ*|jyNGOw%n9o?N^ekNq|NG2h@`H`$?Tt14n&DLu0GleN2m|aXZgc^z3AZcawv{Sn zB~Xzl2TU5Uze1PkoFL~=LD%S1`<4>;I(uhZqs;E8)tlF|8v>_#L^e?(NGd`BMvTEiMJ%!+;xnJC<%gS>96eFt;z5UO zjNKe55D<$~vEZ?U8a?X|XFJHI_VsoOL1QuOEa>tG@_D|{ZHYPL|+?^VH&mO&~M z>amF9|6eE?Ye@5kFI=LRCb??_O@pbsaONK7EL5AubiZfixcEqXn>$ILCCsIhmNgYb zWBeZT_6ihBR+egcv*=t;{2borIT3oE<=uU>beE;}(_ zL%|DYDG1fN$SXNq_o73DFOaz%lC96t_{|ik-`spYL|g~Dh`t>UT$ZaUmeDT@5zQm1_Pl_Lu*bUxw;B$FL4L{TymJn$(vO&6B z^jw&y+@H4IpymZ*j#Dq5`*WYGs?O>bueaC(ltwYx*j{h zrC)S+UbX*PQ}Q)h{bk-FStIMW;;{1!jc+X9=%{!U3reu3na!~y@!QQSk47`yf0ttMFT)wPU@?sAPORk)M@=z;3l>x{-ynkYY0A-#8iB zf1t}q#$-P+$u2DGbYd&Zyrl5Zxs~F2fmX4Po?g<#?6%qb94nEnR~?tX3Lq2-drpf_ z*>HaoV*l?#1Id-;`N_z-`DR+#oV=Pmr?A9ieAxt^StHCs{?7>a{!Gmeb30a~_sh`L zEAb+Ed4=C7{HT*I&uhIw4E)qD<-~(NhbpQPlT2Iaxroe`097mMt2gVB$3ow3t9+hw zKkoWGCc#{Ezj77{P&ci0HMs*-72BV*XHTY?Q?Fv@w317hS~@s4&+5FOizeFb?Vm3U zN7QdBzpXaic?tHC|J^b2dplkr<4RkvX0=C2Fj`ZF+ez~~*$%wxnToIrrIr>=Da|ka zY<-IY<5uc7R-0Vy@MGh$g4pz%)kT^1#HMfqThsDe_kb9y0D3%>P@hO%Ki?rug^!cm z5Q+LXN&bs7(X=;fyayhPvN`Y-L_628H94^R$T|Wj)Nc%je9LMCN#7hGWFwj*}(oGOa7?j)O~tZk0?3|@c4Vf8&Vny8_nc9xRk?JrD9jcW2V z9-@(+XvEY(5PdH0xrcHYYHI3sDLi2Ol&aU|JIXGd(|Lobp>z^jQ+j0^JCI;8H$&cPeQzEn#b5pU7iLhDwk((uQ zq0`g?M{fz(^UbMH?aF8CS=U(B#K1+$E?}Oj(kk|KqvPM0@1EqSdPW}&4oI#xhL2(J zN(qHlltwQrUKSkD_o7@plDX)V3jYh>f8Y)L`WJAKzRhX*Nt-kE6mc|8=>BNOSJorQ zT7nWLA9+Dl(sm`5au}3%?P&Wx{8At~=f1Zm6@s&s9xi5;X^-1CuTAX>l{e(ygcyII zYuY^2B0SiRui&3`cvLS=p{M%p*M$6&VpkWE8V%A9;Xb%iT2A1oyAS5>&?w`mnWNmF zE5plR|4&cy|K(DJQ_G{|%PLNfH?nI;UTZ3ir)zZMjE=o!my#R&2fM?*2cK_aYw|lI zLLA6rkN|NhL&IKHz_R}O!>c+}<#7A5mdE((ROv5EY10$|JWCssrpQcoW20$h`lku}tNr}#zTe&Gr|hit>P5|A=?V8`H0rTyV2T00tWp5+K`r;{l?7BY zqxQ6k?~PUU^~L?>6(OhJkNTS&>Y*ckwP__|9uN8c>-=MqZ1X~4tG8(L)}8riUP z9%|R_A2X#p->c2KqDTR>(L{*y&Y?uzW5ziphsCN?@QtFhNrIj=7YW)DbpUL zw(e_9AFb?~PjddMdosZ`!ES55RPbr(QbyCvg3b$+d3q%-uR6(O%T&IG^8?7bM$HtZ zwdof#L0wsc-~IczRpQzrS~LU*1f|S+=?9J8;p(B;XozeG&5By5{aLPfBmS?9Ji~~; ze>}LPYP2prvZyZ5iQQKBF7l=`UDMs|mLA%nV*UXCB}_nAlM#@L3deFb&mLFY+T<1s6I2^2C)Bm{>F zEH~C~ewV*v-v7#&zeS+xutqb*gu@(FxM^;Pue%%)5RCiGRS_j~ya*T7l={#u$ zzvpK;-y@RKz|KiQMXBdn`>lLp{^dC-Xf*B%U(2IPr{h`<25RIR29zj~T%nuuDay1_ zudr^^M$amMTCSkR=QYK=F*S47K&L%K72Q| z<~s|p`M@|l*NJSJax-N0bOfI;uF2MT8-UtBY>8Sk>AjMX<|AuyyGq@YB(In5{t%FY zNqAQ&fUf7@&+4MHkF(@envy?Mk8^#M zBOYCUGPz9;e2uy#xL6XJ%qe5Uq0ri_u&5CN{iE|S+wh@OGLc3yXo}$ zdOmv6UNdcHkCbgW=a)TU{-Ho4^_;xWO?W=%BY+Hu{0jMZ!&!knR75)|ZLk@AJ(wGg)O zRPL2O*vF{hLtvvz>LqGlgb@~hY{{NyJq z>T_;C5760j)!dg(B~_6~iNcz*T;Jl;4JBl4m0Mr;-M=8Km;-3Q&yq%#y_~HhEiRFV z!&I^pGgNfIqlA}&v`Kh8@Ct?tqPxM>Ake(YH)1I99eJ6w&M283g$7?hE9>-jk3IGT z?1Uoh=Uf}YMy1S6m4>FE@2joOE|TCj)DRQMYJYDsa&~LF!Iwv+_43&W`=({cF~T6v&OP;`QH2T2&oEaH-EHqyR||;zqfV=;iv?YZMXtU!A~FU@ zZ!K|ZeF9#p@06z}lC_SqgBG0^GeruZ=ps;F7XdI@^UYgy$V+78RY>_#@ahSj)k!!! zKbE5w0o+$&3YA?BcwE-X&vwC)`iPAgjZe=^sFwyi96)HWxIeO(u~%vO*pGee(f;)x zY4e;#l}bQ9Ce7+1r(K8o5Cd>Zt+)QU?aSF|vceK+xX$1ztYB2rmF1nXge6~J|M(eQ z{@J5JTM|`s9(&m=Whi`c__#^*Eq(BnDxsE9=~d%i5MlgFezT9bi3@7Ug3JqkzRBfC z5SZ=AyUvnIKz3}m2Ohz%kX!Cu4XZnwCD&bExf>!W15>`}pMOyCC;W)87UcBu$9}<5 zBedS~mE`|C6tRiFUpa7Po{sLHj_C)=C`5gG7(d#7!FGNl%g?x%SYXe?sHkk__fGO; zA|6f9(PJom5&DBBX#>ZcpO~(U>>EBH`Q7}7@Zf(pGrH$}lQqZ#gs7oWB^lRzG%S^F`aKSQo= z{Q&14utWv@uZK5(t<)+NPaA6vZo)GYM2!5jzu-#{1%GSNTZxMXJGoUnf^2t_9LL1E zhy;oNW0_-|tW}1lTC;%5FMuOvnWFVz-`&cW5IIqXa+{x{aOqr`MhsVmS9;a|C=P@? zjZ$TPp!+cy$>*`sct$)48N%JLlHPPGq8^f=HESUKJ&2M>g5R(+$AF;Sg`f12wm^2X zo(I;@F#jji8fT*u%MHM1h{OFKzn$C)=$WWu;SG9rgkyzy_t)< z$h9NMhx`!&swvYDZxh0{%N_~)Hq?7kK_9Vf^)I zZ&1L;RJEA(hu@+&D*>OKw~3lHgEnp$LO6{}4imQb`f3=YDSRX^bnl*JGm=u;85t~O zLY1>&r8jPej?;qZdD)0nJ56C#@B28kaAv<1{U?uO{n)lv?E*5Oz^I0!2J>9~I#G3I zdU>gdC^Icb8p3gu)85%Sd^6*xXWI;1er!%Yc%6oQ3{Mj)0`Ocp+`cS+0d^MOc)OO9 zO?eCNc2&9AA}AmWR-k-Y1X%QH=a`TP&Wnb{20nGJF4V?+U4dy*cn+Q>1!GJ&>VF4M z@DAXmzOp3#rSvM={eDr8;dM|_yX$C#p_!T4u~Sm=*kw1Nv3v6K>qYC`P+Inn`0tY` z5!8*hSKx#4Um9TDJVhU6RYLb||D&5YUyqKAINccNB|Q{=kIAQA;iqqr(3W1WV|43R zf(F*guO0%h8lBQ9ItmD-C`Vwo-zn`Wr#_CZg)C5oqs30bHA^Y}nsC13+_FX&7$r{U zSxx2`wV0xZlR~sWFX>5k9T_I5^vU-)R0#iBxGJUpMG=oBinjXW+uA|Cq7EWl+;0GkWGRkr`Q z`lVjJ0)`dq9kj=PabMGMC z0++TFAx81IC3k(re7w$m5j*)&C#2l5=3u}nz@aTTm0VPMg!Pa#-mWmpNlvnHeL)uXSkG)KjcmLfv_Q=h}hdoGV(-aFk~E_!sLrojfh#e9l5P`}F^&kUpQnn+MB5<)6yE2Z8_U)giyopfv!Igh z-3=u&Z5xl3kAyHEi5h8KVBJkx<3{$D<}dtc-w^1~f5ZsiLY*3j+^}a?J>9u1kWT

RZP~f}qQP(UkcLA#7c#Z^4ooXG*tEO8Gi-pUYX# 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 z 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

6U-R67q<_#Mg8wUpm zH+M^;qw{AwF7CZy4yw&hnGS1(?0croPWd>+$|SZ_U>-vfY^Z5m9LJCj?NlNjR%Z_*_`mG0C-fWGc}DXqtTtCNu=xXA z!pScT2pmu~!-0?0@3+p#v(?%}n=ZHE7IVH{W9&Tbw3=5vUY4%n+spHiH+hG{B|_7}X%pkcL(26^ z0~HM_8fEzB@S5E$rZf@rDBOoyTkT?|}n;A+)_>STBS?3mzvwT{h@=T6j#IZoyykGBzrn4s7=@ zu68Gw&T^*HN_Vp_F}>DiA6SmZ4|-?O-tTJBvx_jPE9EuycgV@u>*bCN9Hz5d+=R7* ze*1wqQ&tvKn}e_cyr+7uF0Ghr+i2UB`p9eBi85fN+rVJdc|yW+;1el`(xlfggepSk>pQ975!!aAtI0!s&R!CN>=BDcrT3d%}q!zfjd{M1nRzs z{QB)f>Mg?YTAytoxsID~2=dQB+ucfQ;&$kJmiLI-T$nE|x($L?hk$gbqly)Who3^c zaA=XXRRvRyOcMq0hFQP;geM9|%IgwF&&`>ASE_=9gant481rn;?Yjjbu591yg&j6l z*6nt0W2zXr4E1WwCf@ha1OG2RN3$qZ#zR{8fBV+L$eLrIDk52QS>A>bL;;IbnKMaG zT=`|exQGFn)KBifzaH5lhgh4djF3y;1zE>J*8M$MAcr6>%oUsdstZ50-E4!0bnmyjJ$ye*KGAF=FA7CCiH~7 zv(#bM|9}2sOwGJ+)*oUNXm9`@MB&SS!dE$(q?cTPpe#-9DyJaF@>{ovJ0I7i=D~sE z?|^_MSOe6mw7JsNqwxBZ%6REqj91vUQo-AJq4tA5X%2RPUq4qF86hF?FP^6(t@KQSDcoPKnEne1 z(h_0I#Io%Hd5HQeRRJGlLCzr zHf=lImfu(!OT25`)?yp$(z1vL(Y-(TY;ET1YSGg6DXk=aX z4EN@KVY60$?bpf6Y#`>-RaAH+HDno7sMY%UlC~9d3hgjqDt!u#|JGnHjBO37&+Q{V zR(}9y&JesydcH>!t!AEqV4kfaTke!JErcnmGOQMQhEpN~TFknBl?fSt_jK(S>y1{( zI${r27!|4n;U`uS!*|^dA&%#5b*o=MeOM@yxf);6ZtBhU#6N<77ycI(9{#>}XkjJZ zEV99QP>9d{q4#`51i%L32akJ|*~QRu!{e{+bL!(-g|QkB`3vpWe#S{`Hs3$uvyoee zRQ##|A<6LyWP5E1282B3r$fN0XRn53Z>EDN9T_F5 z&@|attEES^D9X*v;j5rC_?YUC9+SOmW-mI9@d<*HglUa~r>loI(?VtTa|_b!*t0~m zo55vogiRcT@i-xGH6MgP(p|~osU-i%3O;|D;4Oe&U+C#QIu@KM3BUEza8Lc@klQh% zHuJggExEsm{zN1>e*tonUhW2Il%K=`Zl5?Vlj7Ultci8FMZN)93`INPa3bW6f_*f4 zrs&2cMO$<{4Avf8(`sO6%2bvjt5~4oQ~{)#)-%eM{0{;AOCk>X+3we^E(H`efwL7J zu{t20Xi(@Ekd2KE)0>CT@sy>J9|TdV9HA!THlJP95pEN{`0Co zNDGZUVeW~R`U@qS&LoIr@>5$H@stFUWofCY`7h+Wu(a19J}DmDvY1Ep6AZjv7_|uu z!r!Wjq_0)J7VF1k8~?D4i}{q^c%{So10=~vH^@+6Lkp|JkzX=^%4fE{WlRKxh|-oG z*iXiwQ4Z@bBO_yNWi>J~@-ZsP$@#*`$qD$E}K#kj8Ky}gBnpd1@fEc{y)dkdP##SUgb7^?sbGPeBqvX70y6n zHic#(~T&FF_(!&YP6>)+IEnT%*)grcaD(+P5fRZ09 zT+m{vxvRNmFOgv9aXOxWRV2~EXOK}(Naao_e$4tT0ep&HHYD@~-g!?B-S@;HcU;jY z@n^#g=RXK-OHB&avD+=o01ph(meAf^;o*Ggflr>Z4HAKq0%Hks79fCtz7y}0!?X5MOPETymvIc- zB0Yn<^H+x2Qu&6q(**=}(hHF=%fscl%HQ*3QUcMY_dsvYWk%%T| zH87a7gXnu6#Vj~)yY4SH=yyI-iOYHXdQyiS0`D9`oeGI&Q=rW2w47=h6+iXSc|#Pk*xJ}2m25$Rqcv0E(#Qe5=` zB0@dHF<4;})O0B<`bda~i|yX_I>J+x*Q=_E8s! z$R)1>gtiq>7EBVyfAc@e3J&Z#c= z>-C8)BQLMZuTCmCkTjRyQ(@;xKAKh3xiPGkG&t{gf8^W0r03QCa!6ju?QLGLVw99a z+nXM(dZD7Rbn9P+SxhtHo`$!1E!ehuPKWD@HBz%+wA9Tt?ID^EOP`Hst0&bYA0s=n zJ;{er6>Kz}D1LH)fsp%t_ow;?H)iTFw#efddfZ~+9)hR4YL=^ANP+pUo0VT{Bh?-E z*R6dYQy8_|JkADke0UrtPFLC=m~?7(Z_g4Ym<_6k{VR8_WTd0;@Vp3wlvJf^KYq@t zsjpxZQ0Z{m+lV|JSsbIwCNC_fWu}vAiYzPZt~6=d+1}P`eNCDhdc9f+HHT$M3woZmQLz$;3_5R~sPK7;oNjGrrLW@l>>bSO|B_+mz&5A-;+T z4bS5{winrhPhQ@A?9Dl*EhJptj4u_**?&3|!M7YkXnzsT^cqsa#}T(Fg+dI9Md4+x zaS8qc>O8?^DD}cE*x*gH>msScU-&$wbJbt zt1Z7xn0PQk5Odou;jnA9jos|{Z5cO)DtMKJb14wJmpwmvT^{mz{n+hWWl~Z#H#9V~ zu$W)(kzin8aCSO}frS}}&6%h(uTEn(FE08*^|4{8tZaCYK^u2d9Qm{ZfUjM`w%wG=h$pxFw| zCdMbOP7;H$jci|MtD7Y1x;l&^ESW1q`0P} zxugWqciWA$Kju7Y`0&uiifH@`==%Wq!u#kL1!UxV#~%?&b!Oie@Y`g_-x|1w(l2`j zM!D18lbWjFf|Tk7Cj;Ds!wGJlf%< zUp~d!O?JTuXqxR-F=b^fEuQG%z%mD*jZ5ne210Pf?8X<#tJLzDkC)R~E1owZnjb2P zSIW!FuMZdaoNgnAaA*|vA9Siy!rCU>c^!re>EifBbGREfT9YnT(Yr<8BMTmI#YMv| zl|tpc4>Wl}Q*LeLKx(;vuwPF+Gc%Ko@}7JDPTn`HjmPV;+*l%(l*i(9KA!4^9FdNZ zaq5yt(Id|Mw%3YS@I0Dat~I~89xmy%Cqb+&h~268=ScjOdbL%b#b^FyUia(K06$oG zG{Sdwhs|sS{m~?xKIdDO_AGiV=35+iE!X!kprjn7TI?FX2 z*TDGm0Ob$r>eJ_B&5Hrna-lFU-y=&!#;1I!D=8@vO-?U@{aKve4IB3g<=q;>!g^hP zEjCf)8&f`jz4*;q+|I+IL_!dCcOV)05eJi+Cv9$A@vGYq@j%JH-;YM3bj zs;I)5bJ(za%cnng&r}dZ(7zNGa_-{NaC?TXn=@DFcVbnBfW4U^4saw<0zrpSl+5+5 z6L!6_eErl#%zCv(%kyU!+svpdUnL0MlCV0f#?ZFp38()2gq>%O)gMs{;t7PAFcj@G z9)*`?Rs}K(v@B*^ImIa;cd#t9AgkjQ$FrC&khUQC9K9I`mzP zRnkKyRybOZ%wlf3uhvDrW3O?rHEoh>1J|7Q7yTL}gjN)Q3q6%gFu#A1%6p*?efe!6 zw&56RGl*p>rlQ@qmH$kCb}_=3LGS;e>z$$_;kqr*FP)A$si2dNZQHidv2EMx*tTsa z9jjy8M#Z*qtH1w0_uTVv>!mQNMm;ReIoDomn+Y8cPF_N47WzImlFz zl1f-?T^RoI7i)?PNH;Zo1m4RlC^%eg_f%`Qe;mvCzC8NA&UyQK6iTI3$8gV=DV9{r z@y_gD4{-|3&fp9+bas7SFKuscPiArQy&M^Gxn9uH($?9*&hU$fKqNE&dI7d~Px#y} ztXTSPN`y*yYo4{{E>vv26M|fao|Kf7gXG64UhZ#V0shU*%=P7#r?C_|(f1`0uT|wT6?M6wMIKc&`}C=ZatoKy9>f}>MV^}|K^zKFjs|Q zm<~~KxA`lLug^BtA>9xQ^WM^eF)9iwC*v*Qt}#nDTu^_f(Et(-4vmC?xjBVaTr`-C z?~t#ZHQVb$LRQN`amrfymUmsuCc7OIy63VfyE)bqF%~Uf?$T&x<@`C!~Hl( zfbOf!dQ$$u?uz+0IBphp0kA7<;4bo&wBH_v@?gN&*i?+1c!$&RcTUI?@m{pH@H;ga z$bDh$D`tCzF)7e-9r5+ML@J&*8+xXY%HEQiJJhDx)n?K|cbVhy%Vg5y*%ZR&opI&!8h}|0p)!$;w z9aVjD^7}g9bl+WgX`ckzoZr(bKBU4%Zz(qQ-tXAFX|N++vSPKD zN#8;+@%+w1t_UlotFDN2Mg#v!DB{K9Xrmm9LV)~FRmV5V1?-W5c;w3^M*};#D zFphFn4IbC0<*Ux+7LUA@oO0(Am!~Nm4*geG(Dig@>vf8{TlB27J!uCoAFp_Cm!BP% z`}cRUoYt)Sr7jpYyQll7UBNVA1ExN-5@17cw%vax!Tsu zbO8?!fPL`J3v|;`Q1H_G1VfDwDQeMkZG2fd$>MgY#P7~6X6KvkqroTfbhG-xvoo{C zsA!m9ke_#DR!$9fRcLN*etLpcQD)xK+P2l{Nk_z^e!AWxqwD4K=C30BR`uc6laj<< z8<~=_l^CaJVPTV#;R$VtU>c&C;qck^Zs4qq)!snLF*`Q=M_gH1TWIQcDRD{Jbyr+n zYh-#-czSejTU%O{qLnC2KhhR0+*VtfnUPs#SzZx-jh>NNVM)c|4w}}~QNYKash&YK zO(8MOq4jmjM;{Sy^Xl%Bh~(hn^l(g8R#xWf>hfSE|IHbbYFb+ptIFd1@;rRQ{OZzz zDr+mV!u-no@_duSqip$24pxq=tfX^kN7m^%RTYKgq_~;+X?j*h)_FFiSk?L2>9!N> zpBf8{{f9-OkRHMtXGXW0r<8)+*!E7~-b5rKBmfp?gq&X|v>(6{Sm1l)UB6jnd`cXH za?;$A(h{o^T+~#-1;l+=IR(%9q+-a!>%d0gV-#$Pm^=M!hBuYErWEX>yu5&fsu&w1 zX`QVXd>W^}HqQ9HvmMgj{+=}k$#s7E`_jTJS08;f~ujDK^y6shUJMcf!NW)RMY{))EPbQ{S)0kmiMP!H8to7yaW?1oVV%)pN`{ zY7d&?k)Lz8X#Jqwff@w%#tcY5^W8QEe?~(#a6@t_yw(Rw%crg>TWxHUhuH`<%(EAL6kl~6g`xKom4EmV zSeT@b$`km2c00;QN_>2k48)8A$#B|#hy`o14}PP4IdPGg^$gO1i*zHfnIzl5$v zTk7!Iqoc!%_hrGBs9+br1d%DB^U5G^RNpP_xU>vQv}j*JT!Ia|YQp6r#o;jm1`u)Q zTuVR8#OfR-)*4^lOU%KbT$1mJu0lD!$Qlz1EGN_(8R<{q{7;Q zYOK||knr_>vCqc`EDkA7Wf0OLe3Z8i1K}`45g5R-&^Z5_RxBulEbz%(GKa@*JHAm7 zbjpLj^!n|U>@7RF0m|ihX!GbG<{Oy@#tG15L!yL(qmMd0yF5NAOoFW$ZxxnlKjMbb zfmK##M}J4aPhfTkL077km61bJQ`_5Pid8D3qDOybW~Q#X`a(=Dv;72hd0l{xj;drv z3o}FGCnBVne*N-e{p~7OTWn9@(%jmD$e~@UP#=+(4_^2yeg#aX?l!#vYKxPBL3mkf z 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

v|NJX+=Mu?B4<3EqFvt0vKo#!I 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�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ŪB^(JRm2BZ+gVt=2_cL1&ncU}1sjFE_X9)?+b+3K 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 XvLs!Rfluxp4*b;7&{xk>wS4wJl?39( diff --git a/themes/juice/content/showcases.md b/themes/juice/content/showcases.md deleted file mode 100644 index 3824987..0000000 --- a/themes/juice/content/showcases.md +++ /dev/null @@ -1,44 +0,0 @@ -+++ -title = "Showcases" -description = "Showcases" -weight = 1 -+++ - -# Pull request - -If you use **Juice** as your theme, feel free to make Pull request. - -Here are some steps to help you get started: - -- Change the [content/showcases.md](https://github.com/huhu/juice/blob/master/content/showcases.md) file, add your product site. Make sure the lexicographical order. -- Add your screenshots to [content](https://github.com/huhu/juice/tree/master/static/showcases) directory, then link the screenshot in the markdown file. -- Add a link to your product site. - -# Gallery - -Here are some product websites which use **Juice** as the theme. -Sort by lexicographical order. - -## C/C++ Search Extension - -![](/cpp-search-extension.png) - -Link: [https://cpp.extension.sh/](https://cpp.extension.sh/) - -## Go Search Extension - -![](/go-search-extension.png) - -Link: [https://go.extension.sh/](https://go.extension.sh/) - -## JS Search Extension - -![](/js-search-extension.png) - -Link: [https://js.extension.sh/](https://js.extension.sh/) - -## Rust Search Extension - -![](/rust-search-extension.png) - -Link: [https://rust.extension.sh/](https://rust.extension.sh/) diff --git a/themes/juice/sass/_markdown.scss b/themes/juice/sass/_markdown.scss deleted file mode 100644 index 262c030..0000000 --- a/themes/juice/sass/_markdown.scss +++ /dev/null @@ -1,45 +0,0 @@ -.content { - padding: 0 40px; - display: flex; - flex-direction: column; - overflow-x: auto; -} - -.content pre { - overflow-x: auto; - padding: 1.25em 1.5em; - white-space: pre; - word-wrap: normal; - background-color: white; - color: #4a4a4a; - font-size: .875em; - font-family: monospace; -} - -.content code { - background-color: white; - color: #4a4a4a; - font-size: .875em; - font-weight: normal; - padding: 0.25em 0.5em; - font-family: monospace; -} - -.content pre code { - padding: 0; -} - -.content a { - color: var(--primary-link-color); - - &:hover { - text-decoration: underline; - } -} - -.content blockquote { - border-left: #e2dede 8px solid; - margin: 0; - background-color: #f2f1f0; - padding: 0 20px; -} diff --git a/themes/juice/sass/_text.scss b/themes/juice/sass/_text.scss deleted file mode 100644 index 62ae1fd..0000000 --- a/themes/juice/sass/_text.scss +++ /dev/null @@ -1,39 +0,0 @@ -.heading-text { - font-family: "b612", sans-serif; - font-size: 32px; - font-weight: 600; - padding: 10px 0 25px 0; - color: var(--primary-text-color); -} - -h1, .title-text { - font-family: "b612", sans-serif; - font-size: 25px; - font-weight: 500; - color: var(--primary-text-color); - border-left: var(--primary-color) 8px solid; - padding-left: 10px; -} - -h2, .subtitle-text { - font-family: "b612", sans-serif; - font-size: 20px; - font-weight: 500; - color: var(--primary-text-color); -} - -.text { - font-family: "b612", sans-serif; - font-size: 18px; - font-weight: 400; - line-height: 26px; - letter-spacing: 0.2px; - color: var(--primary-text-color); -} - -.subtext { - font-family: "b612", sans-serif; - font-size: 16px; - font-weight: 400; - letter-spacing: 0.1px; -} \ No newline at end of file diff --git a/themes/juice/sass/_ultility.scss b/themes/juice/sass/_ultility.scss deleted file mode 100644 index e51f8dc..0000000 --- a/themes/juice/sass/_ultility.scss +++ /dev/null @@ -1,13 +0,0 @@ -.text-center { - text-align: center; -} - -.pos-absolute { - right: 0; - left: 0; - position: absolute; -} - -.box-shadow { - box-shadow: 0 2px 10px 2px #ddd; -} \ No newline at end of file diff --git a/themes/juice/sass/juice.scss b/themes/juice/sass/juice.scss deleted file mode 100644 index be947ec..0000000 --- a/themes/juice/sass/juice.scss +++ /dev/null @@ -1,212 +0,0 @@ -@import "_ultility.scss"; -@import "_text.scss"; -@import "_markdown.scss"; - -:root { - --font-family: 'b612'; - --font: 'b612', sans-serif; - - --background: #282a36; - --selection:#44475a; - --comment:#6272a4; - --purple:#bd93f9; - --white:#f8f8f2; - --pink:#ff79c6; - --orange: #ffb86c; -} - -@font-face { - font-family: 'b612'; - src: url('fonts/b612-regular.ttf') format('truetype'); -} - -body { - padding: 0; - margin: 0; - box-sizing: border-box; - background-color: var(--secondary-color); - display: flex; - flex-direction: column; - min-height: 100vh; -} - -a { - text-decoration: none; -} - -ul { - margin-top: 0.5rem; -} - -ul > li { - padding: 0.3rem 0; -} - -p > img { - width: 100%; - height: auto; -} - -header { - background-color: var(--primary-color); - color: black; - padding: 20px 50px; - display: flex; - align-items: center; - justify-content: space-between; -} - -.logo { - font-family: "b612", serif; - font-size: 32px; - color: var(--primary-text-color); - display: flex; - align-items: center; - margin: 0 40px; - - img { - width: 60px; - margin: 0 25px; - } -} - -.nav-item { - margin: 0 10px; - text-decoration: none; - font-size: 18px; - font-weight: bold; - - &:hover { - color: #000; - text-decoration: underline; - } -} - -.hero { - display: flex; - align-items: center; - justify-content: space-evenly; - height: 100vh; - background-color: var(--primary-color); - overflow-x: hidden; - padding: 0 40px; - - .explore-more { - position: absolute; - bottom: 20px; - cursor: pointer; - } -} - -main { - display: flex; - padding: 50px 100px; - flex-grow: 1; - - .toc { - max-width: 260px; - min-width: 240px; - } - - .toc-item { - padding: 10px 20px; - color: #424242; - } - - .toc-item a, .toc-item-child a { - color: var(--toc-text-color); - - &:hover { - cursor: pointer; - text-decoration: underline; - } - } - - .toc-item a.active, .toc-item-child a.active { - color: var(--toc-highlight-text-color); - } - - .toc-item-child { - padding: 0 30px 5px; - color: #424242; - } - -} - -.toc-sticky { - border-radius: 3px; - border-top: 5px solid var(--primary-color); - background-color: white; - position: sticky; - position: -webkit-sticky; - position: -moz-sticky; - position: -ms-sticky; - position: -o-sticky; - top: 10px; - padding: 10px 0 20px; - max-height: 100vh; - overflow: auto; -} - -footer { - padding: 50px; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - background-color: #202020; - color: #fcfcfc; - - a { - color: #fcfcfc; - text-decoration: underline; - } -} - -@media screen and (min-width: 1280px) { - .content { - max-width: 60%; - min-width: 800px; - } -} - -@media screen and (max-width: 768px) { - header { - padding: 10px 30px; - flex-direction: column; - align-items: center; - justify-content: center; - } - - .logo { - font-size: 28px; - margin: 10px; - - img { - width: 45px; - margin: 0 10px 0 0; - } - } - - .nav-item { - margin: 0 5px; - font-size: 14px; - } - - .hero { - padding: 40px 30px; - } - - main { - padding: 30px; - } - - .content { - padding: 0; - } - - .explore-more, .toc { - display: none; - } - -} diff --git a/themes/juice/screenshot.png b/themes/juice/screenshot.png deleted file mode 100644 index 3150b2159675f2bda26aa8a9a659fb4b6aaa6aaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153265 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 diff --git a/themes/juice/static/fonts/b612-regular.ttf b/themes/juice/static/fonts/b612-regular.ttf deleted file mode 100644 index c2bd6c555f9223522945758f9391fad8cecedc09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142728 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

35K>HC@>{rx*}LsBJOZv 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 pBsYF&WIIYdj;ls;6O`PLt_F7f9_aJhn7 -

-
- - -{% endmacro render_header %} \ No newline at end of file diff --git a/themes/juice/templates/_variables.html b/themes/juice/templates/_variables.html deleted file mode 100644 index 10d38e9..0000000 --- a/themes/juice/templates/_variables.html +++ /dev/null @@ -1,16 +0,0 @@ - diff --git a/themes/juice/templates/index.html b/themes/juice/templates/index.html deleted file mode 100644 index 6ea9014..0000000 --- a/themes/juice/templates/index.html +++ /dev/null @@ -1,147 +0,0 @@ -{% import "_macros.html" as macros %} - - - - - - {% block title %}{{ config.title }}{% endblock title %} - - {% block favicon %} - - {% endblock favicon %} - {% include "_variables.html" %} - - - - - - - - {% block head %} - {% endblock head %} - - - - {% block header %} - -
- {{ macros::render_header() }} -
- -
- {% block hero %} -
-

- {{ trans(key="hero_heading_text", lang=lang) | safe}} -

-

- {{ trans(key="hero_title_text", lang=lang) | safe}} -

-
- - -
- {{ trans(key="explore_more_text", lang=lang) | safe }} -
- - {% endblock hero %} -
- - {% endblock header %} - -
- {% block toc %} - {% if section.toc %} - {% set toc = section.toc %} - {% elif page.toc %} - {% set toc = page.toc %} - {% endif %} - {% if toc %} -
-
- {% for h in toc %} - - {% if h.children %} - {% for h2 in h.children %} - - {% endfor %} - {% endif %} - {% endfor %} -
-
- {% endif %} - {% endblock toc %} - -
- {% block content %} -
{{ trans(key="content_heading_text", lang=lang | safe) }}
- {{ section.content | markdown | safe }} - {% endblock content %} -
- - {% block sidebar %} - {% endblock %} -
- - {% block footer %} - - {% endblock footer %} - - - - diff --git a/themes/juice/templates/page.html b/themes/juice/templates/page.html deleted file mode 100644 index c6d8610..0000000 --- a/themes/juice/templates/page.html +++ /dev/null @@ -1,15 +0,0 @@ -{% import "_macros.html" as macros %} -{% extends "index.html" %} - -{% block title %}{{ page.title }} | {{ super() }} {% endblock title %} - -{% block header %} -
- {{ macros::render_header() }} -
-{% endblock header %} - -{% block content %} -
{{ page.description }}
-{{ page.content | safe }} -{% endblock content %} \ No newline at end of file diff --git a/themes/juice/templates/shortcodes/issue.html b/themes/juice/templates/shortcodes/issue.html deleted file mode 100644 index 3006d9b..0000000 --- a/themes/juice/templates/shortcodes/issue.html +++ /dev/null @@ -1 +0,0 @@ -#{{ id }} \ No newline at end of file diff --git a/themes/juice/theme.toml b/themes/juice/theme.toml deleted file mode 100644 index 79e59f5..0000000 --- a/themes/juice/theme.toml +++ /dev/null @@ -1,12 +0,0 @@ -name = "juice" -description = "An intuitive, elegant, and lightweight Zola theme for product sites." -license = "MIT" -homepage = "https://github.com/huhu/juice" -min_version = "0.11.0" -demo = "https://juice.huhu.io" - -[extra] - -[author] -name = "Huhu teams" -homepage = "https://huhu.io" diff --git a/themes/juice/vercel.json b/themes/juice/vercel.json deleted file mode 100644 index 54f7add..0000000 --- a/themes/juice/vercel.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "build": { - "env": { - "ZOLA_VERSION": "0.11.0" - } - }, - "github": { - "silent": true - } -} \ No newline at end of file